一、内部类
内部类的访问规则:
1.内部类可以直接访问外部类中的成员包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式为 外部类名.this
2.外部类要访问内部类必须建立内部类对象。
1 public class Out { 2 private int num=4; 3 class inner{ 4 // int num=5; 5 public void function(){ 6 // int num=6; 7 System.out.println("inner:"+num);//此处省略了 Out.this.num 所以能直接访问外部类中的成员 8 } 9 } 10 11 public void method(){ 12 inner in=new inner(); 13 in.function();//外部类要访问内部类必须建立内部类对象。 14 } 15 }
测试类
public class InnerTest { public static void main(String[] args) { Out out=new Out(); out.method(); } }
2.当内部类在成员位置上时,就可以被成员修饰符所修饰。
比如,private:将内部类在外部类中进行封装。
static:内部类就具备了static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限性。
注意当内部类中定义了静态成员该内部类必须是静态的。
当外部类中的静态方法访问内部类时,内部类也必须是静态的。
3.内部类定义在局部时
1.不可以被成员修饰符所修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。
1 public class Out { 2 private int num=4; 3 public void method(){ 4 final int num=6;//内部类定义在局部时只能访问被final修饰的局部变量。 5 class inner{ 6 void show(){ 7 System.out.println("num="+num); 8 } 9 } 10 new inner().show();//建立内部类的对象调用内部类的方法。 11 } 12 }
1 public class InnerTest { 2 public static void main(String[] args) { 3 new Out().method(); 4 } 5 }
二、匿名内部类
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:内部类必须是继承一个类或实现接口。
3.匿名内部类的格式: new 父类或者接口(){定义子类内容}
4.其实匿名内部类就是一个匿名子类对象。
public abstract class InnerDemo { abstract void show(); }
1 public class Out { 2 int num = 5; 3 4 public class Inner extends InnerDemo { 5 6 @Override 7 void show() { 8 System.out.println("num=" + num); 9 10 } 11 12 } 13 14 public void function() { 15 new Out().new Inner().show(); 16 17 } 18 }
上面的内部类可以用匿名内部类的进行简写,如下
1 public class Out { 2 int num = 5; 3 4 public void function() { 5 new InnerDemo(){ 6 //覆写InnerDemo中的抽象方法 7 @Override 8 void show() { 9 System.out.println("num="+num); 10 11 } 12 13 }.show();//InnerDemo类的匿名子类对象调用自己的show()方法 14 } 15 }