内部类的定义及使用

内部类的基本概念

内部类指的是一个类的内部进行其他类嵌套的操作语法形式。理论上就跟盗墓空间一样,一层层进行类的嵌套形式

范例:内部类的基本使用

 1 class Outer{//定义一个外部类
 2  private String msg="Hello World!";
 3  //*********************
 4  class Inter{//此时定义了一个内部类
 5   public void print(){//定义一个普通方法
 6    System.out.println(msg);
 7   }
 8  }
 9  //*********************
10  //在外部类中定义一个方法,这个方法负责产生内部类的对象和调用print();方法
11  public void fun(){
12   Inter in=new Inter();//内部类的对象
13   in.print();//内部类提供的print()方法
14  }
15 }
16 public class Newbegin{
17  public static void main(String args[]) {
18   Outer out=new Outer();//外部类对象
19   out.fun();//外部类方法
20  }
21 }

程序结构有点混乱!虽然内部类破坏了程序结构从整体上来讲不好,但从另一个方面来说

内部类的优点在于外部类的私有访问

范例:将以上程序的内部类提取到外部,要求实现同样的功能

 1 class Outer{
 2  private String msg="Hello World!";
 3  public String getMsg(){//通过此方法才可以取得msg的内容
 4   return this.msg;
 5  }
 6  public void fun(){//3.现在由out对象调用了fun()方法
 7   Inter in=new Inter(this); //4.this表示当前对象,
 8   in.print();//7.调用方法
 9  }
10 }
11 class Inter{
12  private Outer outer;
13  public Inter(Outer outer){//5.Inter.out=main.out;
14   this.outer=outer; //6.引用传递
15  }
16  public void print(){//8.执行此方法
17   System.out.println(this.out.getMsg());
18  }
19 }
20 public class OuterDemo{
21  public static void main(String args[]){
22   Outer out=new Outer();//1.实例化Outer
23   out.fun();//2.调用Outer类方法
24  }
25 }

对内部类的操作

1.通过以上代码可以发现,当前的内部类的访问必须通过外部类的方法才可以完成,如果不想通过

外部类的方法调用,那么就必须按照如下形容进行创建:

语法:外部类.内部类 内部类对象=new 外部类().new 内部类(); 

class Outer{//定义一个外部类
 private String msg="Hello World!";
 class Inner{//此时定义了一个内部类
  public void print(){//定义一个普通方法
   System.out.println(msg);
  }
 }
}
public class Newbegin{
 public static void main(String args[]) {
  //声明内部类对象
  Outer.Inner in=new Outer().new Inner();
  in.print();
 }
}

1.因为外部类中有属性,这些属性只能实例化才能调用,

2.如果一个内部类只想被外部类使用,即:不希望直接产生内部类的实例化对象,那么可以使用private定义

 1 class Outer{//定义一个外部类
 2  private String msg="Hello World!";
 3  private class Inner{//此时定义了一个内部类
 4   public void print(){//定义一个普通方法
 5    System.out.println(msg);
 6   }
 7  }
 8  public void fun(){
 9   Inner in=new Inner(); 
10   in.print();
11  }
12 }
13 public class Newbegin{
14  public static void main(String args[]) {
15   //声明内部类对象
16   new Outer().fun(); 
17  }
18 }

3.在进行属性访问时要加上this. 如果想要在内部类明确的使用this

就要外部类.this.属性表示外部类当前对象的属性

public void print(){//定义一个普通方法
   System.out.println(Outer.this.msg);
 }

static定义内部类

 内部类中如果使用了static进行定义,那么就表示其就是一个外部类的形式,

这个外部类的名称就是“外部类.内部类”。同时该内部类只允许访问外部类中的static 操作, 

范例:使用static定义内部类

 1 class Outer{//定义一个外部类
 2  private static String msg="Hello World!";
 3  static class Inner{//内部类=“外部类”
 4   public void print(){
 5    //此时只能够使用外部类中的static操作
 6    System.out.println(msg); 
 7   }
 8  }
 9 }
10 public class Newbegin{
11  public static void main(String args[]) {
12   Outer.Inner in=new Outer.Inner();//static来定义内部类
13   in.print();
14  }
15 }

外部类.内部类 内部类对象=new 外部类.内部类();

在方法中定义内部类

理论上内部类可以定义在类中的任意位置,在方法中定义内部类的形式是最多的

范例:在方法中定义内部类

 1 class Outer{//定义一个外部类
 2     private String msg="Hello World!";
 3     public void fun(final int num){
 4         class Inner{
 5             public void print(){
 6                 System.out.println("num="+num);
 7                 System.out.println("msg="+msg);
 8             }
 9         }
10         new Inner().print();//产生内部类对象调用方法
11     }
12 }
13 public class Newbegin{
14     public static void main(String args[]) {
15         new Outer().fun(100);
16     }
17 }
18 //此方法在JDk1.8是正常的,但是在JDK1.8之前就错误的
19 //在JDK1.7及之前,内部类要使用方法的参数,那么就必须用final定义

总结:

1.破坏了程序的结构;

2.方便进行私有属性的访问;不受private 限制

 

                                      

原文地址:https://www.cnblogs.com/Tony98/p/10392990.html