在说明我的问题前 有必要澄清下几个事实:1,抽象类和接口不能直接实例化
2,子类被实例化,在实例化出的对象之中包含着父类的对象(thinking in java中有提到)
 问题:
1 由抽象类中允许存在构造方法和第二条得知,一个类B继承一个抽象类A    A a=new B()的时候,不仅new出了B,同时也调用了抽象类A的构造方法,既然抽象类不能有对象,那么岂不很矛盾?
2,接口可以看成一个特殊的抽象类,但是接口中没有构造方法,由问题1推广以下  接口C的对象引用 C c=new B()  调用了B的构造方法,但是C没有构造方法,既然接口是一个特殊的抽象类,应该也能在子类之中被实例话吧?

解决方案 »

  1.   

    我感觉 “子类被实例化,在实例化出的对象之中包含着父类的对象”这句话就是错误的,这么说一次new会创建好多对象了?
    调用父类的构造方法只是对父类中的成员进行初始化工作 ,父类的成员已经作为子类的一部分了。但是不存在父类的对象一说。
      

  2.   

    第二个想法也是错误的。子类只会调用父类的构造方法,跟接口没有关系。看个例子:class TTest implements Test {    public TTest() {
        }
    }interface Test {
    }这里TTest类实现了Test接口。我们看TTest的bytecode:Compiled from "Main.java"
    class TTest extends java.lang.Object implements Test{
    public testq.TTest();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return}看注释就知道了,调用了Object的构造方法 <init>
      

  3.   

    很不幸的告诉你 thinkng in Java 第四版  page 129页 :
    "初始化基类: 从外部来看, 导出类就像是一个与基类具有相同接口的新类, 或许还会有一些额外的方法和字段. 但继承并不只是复制基类的接口. 
    当创建了一个导出类的对象时, 该对象包含了一个基类的子对象. 这个子对象与你用基类直接创建的对象是一样的. 二者区别在于, 后者来自于外部, 而基类的子对象被包装在导出类对象内部(向上转型的理论依据).”你好好看看上面的内容 再看看我的问题
      

  4.   

    再一个问题是 ,抽象类也有构造方法
    你可以自己写,如果你不写,编译器会自动给你加上.例子 :abstract class  AbstractClass{}看字节码:
    Compiled from "Main.java"
    abstract class AbstractClass extends java.lang.Object{
    AbstractClass();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return}里面AbstractClass();就是构造方法,构造方法中调用了Object的构造方法。
      

  5.   

    1,抽象类和接口不能直接实例化 
    2,子类被实例化,在实例化出的对象之中包含着父类的对象(thinking in java中有提到) 
    问题: 
    1 由抽象类中允许存在构造方法和第二条得知,一个类B继承一个抽象类A    A a=new B()的时候,不仅new出了B,同时也调用了抽象类A的构造方法,既然抽象类不能有对象,那么岂不很矛盾?        不能理解为抽象类型不能有对象,应该理解为抽象类不能直接被new出来,它只能通过子类创建出来,jvm判断他是否能被实例时是根据被调用的那个类是否是它的子类来决定的。这就是"抽象类和接口不能直接实例化"及"抽象类和接口不能实例化"两句话的差别
      

  6.   

    楼主要认为在子类中:接口 c = new 子类(); 这样也是实例化接口的话,那肯定是没错,但是这并不是接口的实例化啊。
      

  7.   

      不能理解为抽象类型不能有对象,应该理解为抽象类不能直接被new出来,它只能通过子类创建出来,jvm判断他是否能被实例时是根据被调用的那个类是否是它的子类来决定的。这就是"抽象类和接口不能直接实例化"及"抽象类和接口不能实例化"两句话的差别 
      

  8.   

    interface kkk{...}
    class AAA implements kkk{...}
    public class BBB{
      public static void main(String[] args){
               kkk Keyi=new AAA();//正确
                 kkk BuXing=new KKK();//错误
      }
    }
    抽象类,接口不能实例化,应该看new后面是什么,等号左边的类型名可以是抽象类或接口
      

  9.   


    1:不矛盾,抽象类不能被外部定义对象 (不能被直接实例化),并没有说内部不能有啊
    2:如果B是派生自A(没有则派生自Object),同时implements C,那么new B构造函数调用和接口无关(看成特殊的抽象类,就特殊在这里了)。