黑马程序员技术交流社区

标题: 关于抽象类的创建对象 [打印本页]

作者: 牧风    时间: 2016-7-26 22:42
标题: 关于抽象类的创建对象
都说JAVA中抽象类不能创建对象,我觉得是不能创建显式对象。并不是说的不能创建对象。例如一个抽象类public abstract class A{
   private  int a =2;
   public abstract void show();
}
class B extends A{
    public  void show(){
         System.out.println("能创建对象")
     }
}
虽然不能 通过 new abstract A(); 来创建对象, 但是当B继承A 创建B的对象的时候JVM 会自动创建A的对象 因为B要继承 A的方法 get set
你觉得呢?

作者: itismyhao    时间: 2016-7-26 22:58
并没有A没有对象而是引用.

作者: 牧风    时间: 2016-7-26 23:13
itismyhao 发表于 2016-7-26 22:58
并没有A没有对象而是引用.

他在JVM中是引用???JVM 不是创建A的对象B 才能创建对象吗?? B创建对象时JVM创建的是A的引用?
作者: suoy    时间: 2016-7-26 23:18
是不是虚拟内部类?
作者: itismyhao    时间: 2016-7-26 23:33
牧风 发表于 2016-7-26 23:13
他在JVM中是引用???JVM 不是创建A的对象B 才能创建对象吗?? B创建对象时JVM创建的是A的引用? ...

抱歉.我又去查了一下,super与this不一样,它不是一个对象的引用,只是一个提示编译器调用父类方法的特有关键字.而继承关系只是对应类,并不对应对象.所以创建子类对象,并不会创建父类对象.
其实你大可不必这样钻牛角尖,真要钻牛角尖看看源码
作者: 刘文秀    时间: 2016-7-26 23:36
我认为A并没有创建对象,只是它的子类创建对象,就好像儿子会敲代码,而父亲不会敲一样,这个事各自算各自的。
作者: AlanMTuring    时间: 2016-7-26 23:36
A的对象应该在B中,super调用
作者: AlanMTuring    时间: 2016-7-26 23:38
A的对象应该在B中,super调用
作者: 纸牌屋    时间: 2016-7-26 23:41
谁说继承就得要创建对象以后才能继承?只要有这个class文件就行了啊。
作者: HeiMa2Wangkunpe    时间: 2016-7-26 23:44
A中好像没有get  set  方法吧
作者: qetu001212    时间: 2016-7-26 23:47
我记得冯佳老师讲过,在创建B的对象的时候,会特意在里面开一个内存用super指向,并在这个内存中存储从A中继承下来的A的成员。所以JVM并不会创建A的对象。
作者: 牧风    时间: 2016-7-27 00:04
qetu001212 发表于 2016-7-26 23:47
我记得冯佳老师讲过,在创建B的对象的时候,会特意在里面开一个内存用super指向,并在这个内存中存储从A中 ...

那按你这么说B是怎么访问A的成员的?B不应该是通过A的对象访问吗?你的意思是A的成员都转移到B中了?
作者: 牧风    时间: 2016-7-27 00:09
HeiMa2Wangkunpe 发表于 2016-7-26 23:44
A中好像没有get  set  方法吧

他有成员变量不就有get set方法吗?
作者: qetu001212    时间: 2016-7-27 23:25
牧风 发表于 2016-7-27 00:04
那按你这么说B是怎么访问A的成员的?B不应该是通过A的对象访问吗?你的意思是A的成员都转移到B中了? ...

能被继承的就会被B继承,如果继承需要不停的建对象调用对象方法,那要这个继承有啥用?费内存不说,还要写这么多东西。我一万次继承,用最底层调用最高层的方法。那电脑要创建一万个对象,这么多内存谁出?要这种语言有个卵用。。。
到此为止,你不同意就去看sun公司对extends的解释吧。。。




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