-
成员内部类
-
//成员内部类的定义格式 修饰符 class 外部类名称 { 修饰符 class 内部类名称 { } } //注意:内用外随意访问,外用内需要内部类对象 //调用内部类对象格式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称() public class Outer { int num = 10;//外部的成员变量 public class Inner{ int num = 20;//内部类的成员变量 public void methodInner(){ int num = 30;//内部类方法的局部变量 System.out.println(num);//局部变量,就近原则 30 System.out.println(this.num);//内部类的成员变量 20 System.out.println(Outer.this.num);//外部类的成员变量 10 } } }
-
-
局部内部类(包含匿名内部类)
/** * 如果一个类是定义在一个方法内部的,那么这就是一个局部内部类 * 局部类只有当前所属的方法才能使用它,出了这个方法外面就不能使用了 * * 定义格式: * 修饰符 class 外部类名称 { * 修饰符 返回值类型 外部类方法名称(参数列表){ * class 局部内部类名称 { * * } * } * } * 局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】 * 备注:从java8+开始,只要局部变量实时不变,那么final关键字可以省略 * 原因: * 1.new出来的对象在堆内存当中 * 2.局部变量是跟着方法走的,在栈内存当中 * 3.方法运行结束之后,立刻出栈,局部变量就会立刻消失 * 4.但是New出来的对象会在堆当中持续存在,直到垃圾回收消失 */ public class Outer { public void methodOuter() { class Inner {//局部内部类 int num = 10; public void methodInner(){ System.out.println(num); //10 } } } }
-
匿名内部类
/** 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次 那么这种情况下就可以省略该类的定义,而改为使用【匿名内部类】 匿名内部类的定义格式: 接口名称 对象名 = new 接口名称() { //覆盖重写所有抽象方法 } 匿名内部类在创建对象的时候只能使用唯一一次 **/ MyInterface obj = new MyInterface(){ @Override public void method(){ } } obj.method() //匿名内部类,省略了对象名称 new MyInterface(){ @Override public void method(){ } }.method()
定义一个类的权限修饰符规则:
- 外部类: public / (default) 不写
- 成员内部类: public / protected / (default) / private
- 局部内部类:什么都不能写