黑马程序员技术交流社区

标题: 抽象类和接口可以创建对象? [打印本页]

作者: laoyang    时间: 2011-11-20 19:38
标题: 抽象类和接口可以创建对象?
本帖最后由 laoyang 于 2011-11-21 08:31 编辑

视频中在创建匿名内部类时,直接new 一个抽象类,我很困惑,不是说抽象类和接口不能创建对象只能被继承吗?
作者: 程立彬    时间: 2011-11-20 19:48
抽象类应该是不能显示创建对象。
如果 new 一个子类对象,那么 JVM 首先就会创建一个抽象类的实例并调用其构造函数的,然后把这个抽象类对象包含在子类对象中,并通过  super关键子引用.

  按 thinking in java 里所说,创建子类对象的时候,首先会递归的创建父类对象,并借助父类构造函数完成对父类对象的初始化。那么当父类为抽象类的时候,JVM 也同样会自动创建抽象父类的对象,然后把它包含在子类对象中。如此一来,我们平时所说的不能创建抽象类的对象并不准确了,只是我们不能在语法上写出  new abstractClass() 而已,但在继承体系中,JVM其实会自动创建的.
作者: 赵磊5    时间: 2011-11-20 22:01
java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:

  new interfacename(){......}; 或 new superclassname(){......};
我感觉,这个只是个规则,java定义这样写,可以简化代码,所以就这样写了。
作者: 吴雨翔    时间: 2011-11-20 22:36
抽象类是不能直接new,因为有未实现的方法,但可以通过new了以后再实现未实现的方法这样就是合理的,这样直接new再实现抽象方法就成了匿名内部类了,其实你也可以在一个类中继承或实现该抽象类,都是一样的,只是一个有名字一个没有名字而且.
作者: 赵超    时间: 2011-11-21 00:35
new一个抽象类运用的匿名内部类,想简单点就是new的是抽象类的子类,只不过子类是没有类名的,所以叫匿名内部类,只有一个实例。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2