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;
}
};
}