内部类
内部类访问规则
- 内部类可以直接访问外部类中的成员,包括私有。访问格式:外部类名.this
- 外部类要访问内部类必须创建内部类对象。
- 内部类在成员位置上,可以被成员修饰符修饰。
1 public class InnerClassDemo1 { 2 public static void main(String[] args){ 3 Outer ou =new Outer(); 4 ou.method();// 4 3 5 Outer.Inner oi =new Outer().new Inner(); 6 oi.function2(); 7 8 } 9 10 } 11 class Outer{ 12 private int x=3; 13 class Inner{ 14 int x=4; 15 void function1(){ 16 System.out.println(x); 17 System.out.println(Outer.this.x); 18 } 19 void function2(){ 20 Outer.this.method(); 21 } 22 } 23 public void method(){ 24 Inner in =new Inner(); 25 in.function1(); 26 } 27 }
静态内部类
- 内部类定义了静态成员,内部类必须是静态的。
1 /* 2 注意:内部类定义了静态成员,内部类必须是静态的。 3 4 */ 5 class InnerClassDemo2 6 { 7 public static void main(String[] args) 8 { 9 new Outer.Inner().function();//创建静态内部类对象 10 } 11 } 12 class Outer 13 { 14 private static int x=5; 15 static class Inner//静态内部类 只能访问外部类的静态成员 16 { 17 void function() 18 { 19 System.out.println("inner:"+x); 20 } 21 } 22 }
局部内部类
- 内部类定义在局部时,可以直接访问外部类中的成员。
- 访问局部变量必须被final修饰。
1 /* 2 内部类定义在局部时:可以直接访问外部类中的成员,因为还持有外类中的引用。 3 但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量 4 5 */ 6 7 class InnerClassDemo3 8 { 9 public static void main(String[] args) 10 { 11 Outer out =new Outer(); 12 out.method(7); 13 } 14 } 15 class Outer 16 { 17 int x=3; 18 public void method(final int a) 19 { 20 class Inner 21 { 22 void function() 23 { 24 System.out.println(a); 25 } 26 } 27 new Inner().function(); 28 } 29 }
匿名内部类
- 匿名内部类是内部类的简写格式。
- 匿名内部类的前提:内部类必须继承一个类或者实现接口。
- 匿名内部类不能创建构造函数。
1 /* 2 匿名内部类 3 1.匿名内部类其实就是内部类的简写格式 4 2.定义匿名内部列的前提。 5 内部类必须是继承一个类或者实现接口 6 3.匿名内部类的格式:new 父类或者接口(){定义子类内容} 7 */ 8 class InnerClassDemo4 9 { 10 public static void main(String[] args) 11 { 12 Demo d=new Demo() 13 { 14 void show() 15 { 16 System.out.println("匿名内部类show方法"); 17 } 18 void method() 19 { 20 System.out.println("匿名内部类method方法"); 21 } 22 }.show(); 23 d.method(); 24 } 25 } 26 abstract class Demo 27 { 28 abstract void show(); 29 }
......