xunanmu / Gitalk

0 stars 0 forks source link

Java内部类 | 徐南木 #9

Open xunanmu opened 4 years ago

xunanmu commented 4 years ago

http://blog.xunanmu.com/2020/02/15/java-nei-bu-lei/

内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。

分类

xunanmu commented 4 years ago

测试

orangepro11 commented 4 years ago

最后一个例子

Object obj = new Object(){
    void show(){
        System.out.println("show run");
    };
};
obj.show();

是无效的,虽然在匿名内部类中定义show方法是合法的,但无法通过obj的实例去调用。

如下的方法可以正常工作:

new Object(){
    void show(){
        System.out.println("show");
    };
}.show();

匿名内部类有着不可复用的特性,它虽然可以实例化但没有名字,因此只能在创建实例的同时即刻调用。

补充一个函数式接口的例子:

假设有如下类:

interface Foo {
    void show();
    default void sayHello() {
        System.out.println("Hello");
    }
}

在调用的时候可以用:

Foo foo = new Foo() {
    @Override
    public void show() {
        System.out.println("show run");
    }
};

的方式,可正常工作,也可用下列方式:

Foo foo = () -> {System.out.println("show run");};
foo.show();

Foo类也可以通过添加@FunctionalInterface注解来进行约束,其约束是:只能有一个待实现的方法。

xunanmu commented 4 years ago

@orangepro11 最后一个例子

Object obj = new Object(){
    void show(){
        System.out.println("show run");
    };
};
obj.show();

是无效的,虽然在匿名内部类中定义show方法是合法的,但无法通过obj的实例去调用。

如下的方法可以正常工作:

new Object(){
    void show(){
        System.out.println("show");
    };
}.show();

匿名内部类有着不可复用的特性,它虽然可以实例化但没有名字,因此只能在创建实例的同时即刻调用。

补充一个函数式接口的例子:

假设有如下类:

interface Foo {
    void show();
    default void sayHello() {
        System.out.println("Hello");
    }
}

在调用的时候可以用:

Foo foo = new Foo() {
    @Override
    public void show() {
        System.out.println("show run");
    }
};

的方式,可正常工作,也可用下列方式:

Foo foo = () -> {System.out.println("show run");};
foo.show();

Foo类也可以通过添加@FunctionalInterface注解来进行约束,其约束是:只能有一个待实现的方法。

这个例子举得不恰当(当时随便写的),他是重写父类方法,请看下面一个例子:

public class demo {
    public static void main(String[] args) {
        Object obj = new Object(){
            @Override
            public int hashCode() {
                System.out.println(123456);
                return 0;
            }
        };
        obj.hashCode();
    }
}

结果: 123456