内部类
就是在一个类的内部再定义一个类
-
成员内部类
-
静态内部类 static
-
局部内部类
-
匿名内部类
成员内部类
在类的内部定义,与实例变量、实例方法同级别的类。
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
//1创建外部类对象 // Outer outer = new Outer(); //2创建内部类对象 // Inner inner = outer.new Inner();
当外部类、内部类存在重名属性时,会优先访问内部类属性。
-
内部类属性和外部类的属性名字相同Outer.this
成员内部类不能定义静态成员。
public class Outer { // 实例变量 private String name = "张三"; private int age = 20; // 内部类 class Inner { private String address = "北京"; private String phone = "110"; //private static final String coutry="中国"成员内部类**不能定义**静态成员,加个final可以,算是静态常量 // 方法 public void show() { // 打印外部类的属性 System.out.println(Outer.this.name); System.out.println(Outer.this.age); // 打印内部类中的属性 System.out.println(this.address); System.out.println(this.phone); } } }
public class TestOuter { public static void main(String[] args) { //1创建外部类对象 // Outer outer = new Outer(); //2创建内部类对象 // Inner inner = outer.new Inner(); //一步到位 Inner inner = new Outer().new Inner(); inner.show(); } }
静态内部类
级别和外部类相同
public class Outer { private String name = "xxx"; private int age = 18; // 静态内部类:和外部类相同 static class Inner { private String address = "上海"; private String phone = "111"; // 静态成员 private static int count = 1000; public void show() { // 调用外部类的属性呢 // 1.先创建外部类对象 Outer outer = new Outer(); // 2.调用外部类对象的属性 System.out.println(outer.name); System.out.println(outer.age); // 调用静态内部类的属性和方法 System.out.println(address); System.out.println(phone); // 调用静态内部类的静态属性 System.out.println(Inner.count); } } }
public class TestOuter { public static void main(String[] args) { // 直接创建静态内部类对象 Outer.Inner inner = new Outer.Inner(); /*Outer.Inner inner = new.Outer().Inner();*///Outer加个括号就是创建对象 // 调用方法 inner.show(); } }
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
前面不能加任何访问修饰符
在局部内部类不调用局部变量下,就是普通变量,可以修改
public class Outer { private String name = "刘德华"; private int age = 35; public void show() { // 定义局部变量 String address = "深圳"; // 局部内部类:注意不能加任何访问修饰符 class Inner { // 局部内部类的属性 private String phone = "15588888888"; private String email = "liudehua@qq.com"; public void show2() { // 访问外部类的属性 System.out.println(Outer.this.name); System.out.println(Outer.thisage); //访问内部类的属性 System.out.println(this.phone); System.out.println(this.email); //访问局部变量,jdk1.7要求必须是常量final,jdk1.8之后自动添加final System.out.println(address); } } } }
匿名内部类
-
没有类名的局部内部类(一切特征都与局部内部类相同)
-
必须继承一个父类或者实现一个接口
-
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
public class Application { public static void main(String[] args) { Outer outer = new Outer(); //通过这个外部类来实例化内部类 Outer.Inner inner = outer.new Inner(); inner.in(); inner.getID(); } }
public class Outer { private int id; public void out(){ System.out.println("这是外部类的方法"); } /*public*/ class Inner{ public void in(){ System.out.println("这是内部类的方法"); } //获得外部类的私有属性 public void getID(){ System.out.println(id); } } }
匿名内部类
//使用匿名内部类优化(相当于创建了一个局部内部类) Usb usb = new Usb() { @Override public void service() { System.out.println("连接电脑成功,风扇开始工作了...."); } }; usb.service();
这个可以直接用
//new Apple().eat(); new Mouse().service();
TestUsb$1.class 可以理解为匿名内部类的名字