JAVA:关于匿名内部类的问题


package date1113;

import java.sql.SQLOutput;

public class InnerClassExercise01 {
    public static void main(String[] args){
        //当作实参直接传递
        f1(new AA() {
            @Override
            public void cry() {
                System.out.println("painting");
            }
        });  //?????????????????????
        f1(new picture());//??????????????????
    }
    //静态方法,形参为接口类型
    public static void f1(AA aa){
        aa.cry();
    }
}

//这是一个接口
interface AA{
    void cry();
}

class picture implements AA{
    @Override
    public void cry() {
        System.out.println("drawing");
    }
}

第一个问题:

        f1(new AA() {
            @Override
            public void cry() {
                System.out.println("painting");
            }
        });  //?

这里的f1为什么直接f1(匿名内部类); 为什么括号外直接加“ ; ”?一般方法不是f1(){}吗?

第二个问题:

       f1(new picture());//?

这里为什么可以直接传picture? 意思是AA aa = new picture();吗?
如果是这样的话,为什么一个接口可以new一个类出来?
就是说AA和picture不是父子类,难道可以写成AA aa = new picture();吗?
那aa这个实例的编译类型和运行类型又是什么?

第一个: 不要把匿名内部类想的太复杂 , 第一种写法 你调用的其实是 f1 这个方法 调用方法就需要有分号 ==> f1(); , 只不过你里边传的是个 AA , AA是个接口 你可以使用匿名内部类在创建时就把其抽象方法给实现了 , 要么就使用其AA的实现类 , 因为实现类必须要重写抽象方法

第二个: picture 是 接口 AA 的实现类 , 可以认为 AA是picture 的父类型 方法需要 AA 类型 传入picture 利用多态当然可以接收到了

AA aa = new picture () 当然是没有问题的 , 就好比是 动物 d = new 人() , 因为人也是动物类型的 , 但是不能 人 d = new 动物() , 因为不是所有的动物都是人 aa 的编译类型就看左边是什么类型 AA aa 编译时就是 AA类型 , 运行时就看右边是new的什么 --> 即 编译看左边 运行看右边