abstract class Person {
public abstract void eat();
}
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println(“eat something”);
}
};
p.eat();
}
}
Person p=new Person{…}这个名字莫非不是p吗?
还是说作用了向上转型,假如是的话,那不是只是为了省略几个单词,又或说匿名类只是为了原因是有些类只使用一次才设计的?恳求大家告诉本人,谢谢了
解决方案
5
本人的理解是这样的。
Person p=new Person{...};
这个语句创建了一个类的实例,这个类是继承了Person类的类,覆盖了eat方法,就是一个新的类了,然后把这个新类的实例赋值给了其父类。这个新的类始终没有名字。
10
匿名类不要被它定义中的【匿名】两个字欺骗了。
【匿名】是指,我们所使用到的这个类,它是没有具体类名的,所以称为匿名类。
首先题主所说的【p】,这个是实例化对象的名字,并不是类名。
匿名类实现有两种方法
1. 继承一个类,并复写其中某些方法
2. 实现某个接口
可以看到,这两种方法都会复写父类/接口中的方法。
例如题主贴出代码中的声明。
【匿名】是指,我们所使用到的这个类,它是没有具体类名的,所以称为匿名类。
首先题主所说的【p】,这个是实例化对象的名字,并不是类名。
匿名类实现有两种方法
1. 继承一个类,并复写其中某些方法
2. 实现某个接口
可以看到,这两种方法都会复写父类/接口中的方法。
例如题主贴出代码中的声明。
Person p = new Person() { public void eat() { System.out.println("eat something"); } };
Person只是个接口,但是在new的过程中实现了这个接口,那么我们可以理解new出这个对象时候使用的是一个新类,但是这个新类是没有名字的,答主可能会问Person不就是新类的名字么,Person是接口的名字,p是实例化的对象名。
也就是说,在这个过程中,实现Person接口的这个新类,并没有名字。正常情况下是这样的public class A implements Person {…},这个实现了Person接口的新类名字叫做A,但是通过new出来,直接复写父类/接口中方法所产生的是一个新类,但是这个新类是没有名字的。
所以我们就叫这个新类为匿名类。
5
对就是原因是它是个抽象类/接口,所以在new的时候就需要直接实现了父类/接口的抽象方法,这个还是这个类就是一个新类,但是没有定义类名,所以叫匿名类。