• 欢迎访问,如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

为什么匿名类都有名字?请教困扰本人好久了

Android 码拜 3年前 (2017-04-25) 246次浏览
abstract class Person {
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. 实现某个接口
可以看到,这两种方法都会复写父类/接口中的方法。
例如题主贴出代码中的声明。

        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

引用:
Quote: 引用:

匿名类不要被它定义中的【匿名】两个字欺骗了。
【匿名】是指,我们所使用到的这个类,它是没有具体类名的,所以称为匿名类。
首先题主所说的【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出来,直接复写父类/接口中方法所产生的是一个新类,但是这个新类是没有名字的。
所以我们就叫这个新类为匿名类。

谢谢看了护肤之后顿时明白了,非常感谢,可是Person是个抽象类吧?不知道是笔误还是本人没搞清楚

对就是原因是它是个抽象类/接口,所以在new的时候就需要直接实现了父类/接口的抽象方法,这个还是这个类就是一个新类,但是没有定义类名,所以叫匿名类。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么匿名类都有名字?请教困扰本人好久了
喜欢 (0)
[1034331897@qq.com]
分享 (0)