都说抽象类不允许创建具体对象实例,但是只是不能显式创建吧 ? 在一个类继承抽象类的时候,如果 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 自动创建的抽象父类对象的引用,我觉得应该就是如此了.    大家怎么认为呢 ? 

解决方案 »

  1.   

    new Farther() 才能算创建了Farther类的一个对象,你这个super不算,super只是记录对象内部的父类的特征(属性和方法)的一个引用,当然,这种抠字眼的没意思,你明白就行了
      

  2.   

    个人观点:
    super.print(); 只是告诉编译器这里用的是父类中的成员函数,不涉及到自动创建父类对象吧?
      

  3.   


    就是,你直接给我new Father()试试
      

  4.   

    Father f=new Father(){};呵呵 
      

  5.   

    abstract class 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
      

  6.   

    5楼6楼是开胡弄人的.抽象类是不能被实例化的.包含在子类中的父类对象在Thinking in java中叫它父类子对象,这个对象和实际的对象不一样,只能存在于子类中.不能拿到子类外.所以不是实例化的对象.个人观点.
      

  7.   

    Father f=new Father(){};

    好吧
      

  8.   

    说那么多干吗呢
    抽象类是用来干吗的啊? 
    java 设计抽象类干吗的啊?
    java 有病啊 ?
    不断优化 也不优化好抽象类啊? 这类要他干吗? 楼主非要 new 对象 凭什么不行啊?
    楼主 钻牛角尖 浪费时间  鉴定完毕``
      

  9.   

    楼主不继承 直接NEW一个abstract对象来看看。呵呵
      

  10.   

    简言之,楼主在抬杠。
    我的回答是:你赢了,你说的都对,Java里你想创建什么都能创建。
      

  11.   

    抽象类不能显示的New 
    通过你的那种方法是行得通的
      

  12.   

    获得对象的几种方法:
    1.new ;
    2.getInstance();
    3.静态方法
    4.在API中有个其它,可以参考参考新手,请多多指教
      

  13.   

    继承的关系只是对应类,而不对应对象,创建一个对象并不会创建其父类对象,调用构造方法并不代表创建对象,创建对象也不一定需要调用构造方法,从java代码对应于class文件字节码的对应关系上来看这个问题,你可以理解为首先new语句创建了这个对象,然后这个对象嗲用其自身构造方法初始化自己,这个构造函数一开始就调用父类或者这个类的其它构造函数进行对象初始化。
      

  14.   


    是啊,我在9楼已经说过是,是胡弄人的。
    Father f=new Father(){};实际上是用匿名内部类的构造了一个对象让f指向之,而这个匿名内部类是实现了Father的类,是Father的子类。
      

  15.   

    我觉得 26 楼说的准确点,创建一个对象,父类里面的东西当然也初始化了,但是有一点,事实上并没有两个对象存在。Java 中依然只有一个对象,Java 只是对可见性作了分界。当你把一个子类对象赋值给一个父类型的变量,你不能直接调用子类对象才有的方法,但这仅仅是可见性暂时屏蔽了你对子类的方法的访问,因为实际上对象还是子类型的实例。还是有办法调用它的,比如反射。我觉得或许其它编程语言实现会为父类创建一个隐藏的对象并自动建立隐藏的关系,不过在工作过程中肯定也是不可能把这种关系展示给外部的,也就是说在外面看来,肯定只有一个对象。
      

  16.   

    代码正确的!
    大家应该记得内部类。有一种 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(){}就是对的!
      

  17.   

    查了一下CoreJava中对super关键字是这么说的:
    super与this不一样,它不是一个对象的引用,只是一个提示编译器调用超类方法的特有关键字!
    所以子类调用抽象父类的方法并没有创建抽象父类的对象!
      

  18.   

    new 创建了类对象,还创建了类对象的引用对象.
    所以抽象类其实是不能创建(类对象)和(对象引用)之间的对应关系,并不是不能在堆内存中创建对象!