1-4-5 Java面向对象--内部类
成员内部类
内部类相当于外部类的一个成员变量,可以使用任意访问修饰符.
内部类中定义的方法可以直接访问外部类的数据,而不受访问修饰符的影响.
外部类不能直接使用内部内部类的成员和方法,需要借由内部类对象完成.
需要通过外部类对象来创建内部类实例
如果外部类和内部类具有相同的成员,内部类优先访问自己的成员;可以通过"外部类.this.对象成员"以及"外部类.静态成员"
的方式访问外部类成员.
编译后产生:外部类$内部类.class
1 //外部类 :人 2 public class Person { 3 int age = 1;//年龄 4 5 public Heart getHeart() { 6 return new Heart(); 7 } 8 9 class Heart { 10 int age = 2;//年龄 11 public String beat() { 12 return "心脏在跳动" + Person.this.age; 13 } 14 } 15 16 public static void main(String[] args) { 17 Person.Heart h = new Person().new Heart(); 18 System.out.println(h.beat()); 19 // 心脏在跳动1 20 } 21 }
静态内部类
静态内部类对象可以不依赖外部类对象,直接创建.
静态内部类不能直接访问外部类的非静态员,但可以通过"外部类对象.成员"的方式访问.
外部类可以通过"类名,成员名"方式直接访问内部类中静态成员.
1 //外部类 :人 2 public class Person { 3 int age = 1;//年龄 4 5 public Heart getHeart() { 6 return new Heart(); 7 } 8 9 static class Heart { 10 int age = 2;//年龄 11 public String beat() { 12 return "心脏在跳动" + new Person().age; 13 } 14 } 15 16 public static void main(String[] args) { 17 Person.Heart h = new Person.Heart(); 18 System.out.println(h.beat()); 19 // 心脏在跳动1 20 } 21 }
方法内部类
定义在外部.方法中的内部类,也称局部内部类.
方法内部类只在器定义所在的方法的内部可见,即只在该方法内可以使用
方法内部类不能使用访问控制符和static修饰符,但可以使用final和abstract修饰
编译后产生:外部类$数字.class
匿名内部类
不能有构造方法,可以通过构造代码块实现数据初始化.
不能定义任何静态成员,静态方法.
不能使用public,protected,private,static,abstract,final修饰.
因匿名内部类也是局部内部类,所以局部内部类所有限制都对其生效.
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或继承一个类,但两者不可兼得.
只能创建匿名内部类一个实例.
匿名内部类在编译的时候由系统自动起名为Outter$1.class
一般来说,匿名内部类用于继承其他类,并不需要增加额外的方法,只是对继承方法的实现或是重写.
通过匿名内部类返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量.

浙公网安备 33010602011771号