一般实例化是这样的 A类 aa=new A类();
那如果直接写后面的 new A类(); 这样的叫啥?
还是叫实例化么??
我现在遇到的问题是抽象类,它不是不能被实例化嘛,
但是有段代码这么写的。就是我问的问题这样的形式new A类(); 这样的叫啥?
public class NiMingNeiBuLei {
static abstract class Person {//这个版本的jdk凡是要创建新类的统统都要加static
public abstract void eat();
}
public static void main(String[] args) {
//Person p = new Person()
new Person() {
public void eat() {
System.out.println("eat something");
}
}.eat();
// p.eat();
}
}
它是抽象类的匿名实现,抽象类和接口都是不能直接实例化的,因为抽象类可能有根接口一样的没有方法主体的只是进行了声明的方法,如果一个方法没有方法主体,那么调用它也就完全没有意义,所以一个类要被实体化,就必须要里面所有的方法都需要有方法主体,而如果你不想写一个类去实现这个抽象方法的化,你可以在实例化它的时候在后面打个大括号,里面写你要实例化的类没有方法主体的方法的具体方法,如果全部有方法主体,那可以为空,接口也可以这样实例化,但他只能是当前实例才可以正常时候,别的实例如果不这样做还是会报错,这是java的一种实例化接口和抽象类的方法。
我不明白的是既然person是抽象类,那为啥还能创建对象呢?
匿名实现,匿名内部类 你查一下就可以了
其实相当于
class PersonImp extends Person() {
public void eat() {
System.out.println("eat something");
}
}
new PersonImp().eat();
我想知道这样写的格式叫啥?? new AA类().匿名实例?
这是使用匿名内部类 实现 创建一个继承自Person 的匿名类对象;叫法很多种,你可以就叫使用匿名内部类实现化抽象类。
这种写法里面存在一个自动向上转型的动作。
而且这种写法一般是只要在这个地方使用一次该抽象类的实例,其他地方基本不需要用的时候使用。
这里是匿名类(对抽象类Person进行了实现)的实例化
这个版本的jdk不能创建内部类(其实例与他的外部类实例相关联,即内置了外部类实例的引用)是什么鬼,加static 就是普通的类了,实例对象不相关
你在匿名内部类这一块的理解还不够。匿名内部类是通过继承一个父类或者实现一个接口的方式实现的。因为语法问题它没有使用extends 或者implement的关键字,而是直接通过 父类构造方法(){
//重写需要重写的方法来实现的
}
而为什么会让你有疑问,可能是因为代码中的Person p =new Person(){
void(){
};
};
这样的格式让你误认为是抽象类在实例化对象,但实际上,代码的意思是,使用一个匿名内部类去继承了抽象类并重写了抽象类中的方法,然后用new 关键字去实例化匿名内部类,再将匿名内部类对象向上转型回Person类。将代码从右往左去分析,你可能更容易理解这一点