都说抽象类不允许创建具体对象实例,但是只是不能显式创建吧 ? 在一个类继承抽象类的时候,如果 new 一个子类对象,那么 JVM 首先就会创建一个抽象类的实例并调用其构造函数的,然后把这个抽象类对象包含在字类对象中,并通过 super关键子引用. 按 thinking in java 里所说,创建子类对象的时候,首先会递归的创建父类对象,并借助父类构造函数完成对父类对象的初始化。那么当父类为抽象类的时候,JVM 也同样会自动创建抽象父类的对象,然后把它包含在子类对象中。如此一来,我们平时所说的不能创建抽象类的对象并不准确了,只是我们不能在语法上写出 new abstractClass() 而已,但在继承体系中,JVM其实会自动创建的. abstract class Father {
public void print() {
System.out.println("in father");
}
} public class Test extends Father {
public void print() {
super.print();
} 这里的 super 就是对JVM 自动创建的抽象父类对象的引用,我觉得应该就是如此了. 大家怎么认为呢 ?
public void print() {
System.out.println("in father");
}
} public class Test extends Father {
public void print() {
super.print();
} 这里的 super 就是对JVM 自动创建的抽象父类对象的引用,我觉得应该就是如此了. 大家怎么认为呢 ?
解决方案 »
- 大家讨论一下ThreadLocal
- 在命令行输入时隐藏输入内容或以*号显示===================急。。。。。
- 进行语法解析时已达到文件末尾???代码有问题吗??怎么解决???
- 只要一个简单的分页第三方没想到这么难啊
- java runtime 进程问题
- 有关filewriter和bufferedwriter的初级问题
- function getReturnString(pass_id){...}要怎样才能在 标志为 <%...%> 中间得到参数pass_id?
- 如何在JNI和C动态库之间传递SOCKET类型的值
- (100分求教)怎样用Applet播放wav文件,怎样去掉Applet的客户端缓存
- 我有很多以前发的帖子,没有人回答,我想把它们删除,如何操作?
- 关于sqlserverJDBC问题
- QQ的设计思路是怎么样的呢?
super.print(); 只是告诉编译器这里用的是父类中的成员函数,不涉及到自动创建父类对象吧?
就是,你直接给我new Father()试试
public void print() {
System.out.println("in father");
}}public class Test{
public static void main(String[] args){
Father f=new Father(){};
f.print();
}
}D:\javafile>java Test
in father
好吧
抽象类是用来干吗的啊?
java 设计抽象类干吗的啊?
java 有病啊 ?
不断优化 也不优化好抽象类啊? 这类要他干吗? 楼主非要 new 对象 凭什么不行啊?
楼主 钻牛角尖 浪费时间 鉴定完毕``
我的回答是:你赢了,你说的都对,Java里你想创建什么都能创建。
通过你的那种方法是行得通的
1.new ;
2.getInstance();
3.静态方法
4.在API中有个其它,可以参考参考新手,请多多指教
是啊,我在9楼已经说过是,是胡弄人的。
Father f=new Father(){};实际上是用匿名内部类的构造了一个对象让f指向之,而这个匿名内部类是实现了Father的类,是Father的子类。
大家应该记得内部类。有一种 buttonDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
buttonQuery.setEnabled(true);
buttonConnect.setEnabled(true);
if (e.getSource() == buttonDelete) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setText("");
}
}
}
});抽象类如果没有必须要实现的抽象方法!那么new Father(){}就是对的!
super与this不一样,它不是一个对象的引用,只是一个提示编译器调用超类方法的特有关键字!
所以子类调用抽象父类的方法并没有创建抽象父类的对象!
所以抽象类其实是不能创建(类对象)和(对象引用)之间的对应关系,并不是不能在堆内存中创建对象!