public class MyOuterClass { int i=10; class MyInnerClass{ int i=20; public void myMethod(){ int i=30; System.out.println(i); // 30 System.out.println(this.i); //20 System.out.println(MyOuterClass.this.i); //10 外部类.this.成员变量 (仅适用于非static修饰的内部类) } } public static void main(String[] args) { // MyInnerClass innerClass=new MyInnerClass(); MyOuterClass.MyInnerClass innerClass=new MyOuterClass().new MyInnerClass(); innerClass.myMethod(); } }
输出如下图所示:
此处的内部类主要注意几点:
1、非静态关键字修饰的内部类,需要通过外部类的调用进行实例化,不能直接实例化,否则再编译时会报错。(被静态关键字修饰的则可以。)
2、这里主要注意调用该变量的对象是谁,即this这个对象是属于哪个类即是哪个类的变量被调用了。
匿名内部类:隐藏的继承了一个类(可以是普通类、抽象类,不能是被final修饰的类),或者实现了一个接口。
首先请看下面这一段代码:
public class Demo01 { //String str = “zs” public static boolean empty(String str){ return str.isEmpty() ; } public static long empty2(Date date){ return date.getTime(); //2020 - 09-19 12:22:55 - 1970.-1-1 0:0:0.000 } public static void main(String[] args) { System.out.println(empty( new String() )) ; System.out.println(empty( new String(){} )) ; //这里提示final修饰的类不能被继承 System.out.println( empty2(new Date()) ); empty2( new Date(){} ); } }
当我们给new String()后加一个{}时会提示这里的final修饰的类不能被继承。其实这里加上一个{}后就变成了继承String类的子类,只不过这个子类是没有名字的,而String类是被final修饰的所以不能够被继承。
常常使用一个方法,使其返回值为某个类或接口的对象。而这个类或接口在方法内部创建
//常常使用一个方法,使其返回值为某个类或接口的对象。而这个类或接口在方法内部创建 //方式一、不使用匿名内部类 public Comparable getComparable(){ //1、创建一个实现Comparable接口的类:局部内部类 class MyComparable implements Comparable{ @Override public int compareTo(Object o) { return 0; } } return new MyComparable(); } //常常使用一个方法,使其返回值为某个类或接口的对象。而这个类或接口在方法内部创建 //方式二、使用匿名内部类 public Comparable getComparable01(){ //1、创建一个实现Comparable接口的类:局部内部类 return new Comparable(){ @Override public int compareTo(Object o) { return 0; } }; }