Open xunanmu opened 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注解来进行约束,其约束是:只能有一个待实现的方法。
@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
http://blog.xunanmu.com/2020/02/15/java-nei-bu-lei/
内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
分类