A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 埗箬 于 2015-2-27 16:19 编辑

虚拟类abstract不是无法建立实体的吗,为何在多态情况下能够建立对象,例如下面一段代码(红色为主要的部分):
abstract class f
{    abstract  void  read(){}
}
class z extends f
{   public void read()
    {    system.out.println("Hello");
    }
}
class Demo
{   public void main(String[] argments)
    {    f a=new z();
         a.read();
    }
}

6 个回复

正序浏览
你的代码写的有问题啊,首先z要继承f才行,当创建抽象类f的对象时,其实只是在栈内存创建一个a,此时的a并没有具体的引用也没有实例化,当用一个子类对象实例化或者说创建时,会在堆内存中开辟一个空间存放z对象的内容,然后用用a去指向堆内存中的z对象,本质也就是把z对象地址赋给a,让a引用z的对象,所以之后可以相当于操作子类z创建的对象,但不同的是,操作的方法必须是f中有的,f中有的z没有是不能操作的。
正确代码是:
  1. abstract class f
  2. {   
  3.         abstract  void  read();
  4. }

  5. class z extends f
  6. {   public void read()
  7.     {   
  8.                 System.out.println("Hello");
  9.     }
  10. }
  11. class Demo
  12. {
  13.        
  14.         public void main(String[] argments)
  15.     {   
  16.                 f a=new z();
  17.                 a.read();
  18.         }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 赞一个!

查看全部评分

回复 使用道具 举报
对,内存中存在的是z类型的类,a只是一个f类型的对象,指向内存中的z类实例,这样的a只能访问f所限定的那些方法和成员(如果f里有的话),也就是说如果z类里有个write的话,而f里没有abstract void write,那么此时的a是无法调用这个write的。

点评

也就是说,此时的f就相当于一则约束条件,相当于对实体化的z类a对象进行了限定。a本质上是经过f修饰的z类,所以他可以忽略abstract的限制建立对象。  发表于 2015-2-27 15:16
哦,谢谢,我明白了~  发表于 2015-2-27 14:57

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
Hsidar 发表于 2015-2-27 12:54
好像这样写才行:

其实内存中创建的是z这个对象,只是a的类型是f,但是a对象的指向的方法是z创建的,z已经 ...

也就是说,a对象他的创建,使用的类型是z类,调用的也是z类的构造函数z( )。而实际表示上却以f类型对他进行了标识,存到栈中?那么实体a,它的变量在堆中的初始化什么的都是由f的子类z实现了?
回复 使用道具 举报
好像这样写才行:
  1. abstract class f
  2. {   
  3.         abstract  void  read();
  4. }
  5. class z extends f
  6. {   
  7.         public void read()
  8.     {   
  9.                 System.out.println("Hello");
  10.     }
  11. }
  12. class Demo {

  13.         public static void main(String[] argments)
  14.         {   
  15.                 f a = new z();
  16.                 a.read();
  17.     }
  18. }
复制代码

其实内存中创建的是z这个对象,只是a的类型是f,但是a对象的指向的方法是z创建的,z已经实现了f的抽象方法。

评分

参与人数 1黑马币 +6 收起 理由
fantacyleo + 6 对!实体是对象而不是引用变量.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马