转载

JAVA技术面试

内部类和匿名内部类

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();

    }
}

输出如下图所示:

JAVA技术面试

此处的内部类主要注意几点:

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;
            }
        };
        
    }
原文  https://segmentfault.com/a/1190000020283577
正文到此结束
Loading...