在说明我的问题前 有必要澄清下几个事实:1,抽象类和接口不能直接实例化
2,子类被实例化,在实例化出的对象之中包含着父类的对象(thinking in java中有提到)
问题:
1 由抽象类中允许存在构造方法和第二条得知,一个类B继承一个抽象类A A a=new B()的时候,不仅new出了B,同时也调用了抽象类A的构造方法,既然抽象类不能有对象,那么岂不很矛盾?
2,接口可以看成一个特殊的抽象类,但是接口中没有构造方法,由问题1推广以下 接口C的对象引用 C c=new B() 调用了B的构造方法,但是C没有构造方法,既然接口是一个特殊的抽象类,应该也能在子类之中被实例话吧?
2,子类被实例化,在实例化出的对象之中包含着父类的对象(thinking in java中有提到)
问题:
1 由抽象类中允许存在构造方法和第二条得知,一个类B继承一个抽象类A A a=new B()的时候,不仅new出了B,同时也调用了抽象类A的构造方法,既然抽象类不能有对象,那么岂不很矛盾?
2,接口可以看成一个特殊的抽象类,但是接口中没有构造方法,由问题1推广以下 接口C的对象引用 C c=new B() 调用了B的构造方法,但是C没有构造方法,既然接口是一个特殊的抽象类,应该也能在子类之中被实例话吧?
解决方案 »
- JavaMail的问题啊。有源码可以直接运行啊。~麻烦大家看看啊~~~~~~~~~~~~~~~~~~~~~~~~
- 关于javamail发esmtp邮件问题
- 小弟初学JAVA,希望大侠们帮忙看下JAVA编辑器的下载和安装.
- 怎么跳转
- 200分在线等待:java下如何备份和恢复access数据库?
- apache tomcat 4.1.12 的安装
- 关于匿名内部类的问题
- 请问如何取得当前文件所在的目录?
- Jar 无法下载的问题,在线急等......
- Juilder6注册!将license key粘贴以后,它不停的让你重新选择have serial number和license key!
- 一道关于数据库的题
- 谁能告诉我抽象类有什么用
调用父类的构造方法只是对父类中的成员进行初始化工作 ,父类的成员已经作为子类的一部分了。但是不存在父类的对象一说。
}
}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>
"初始化基类: 从外部来看, 导出类就像是一个与基类具有相同接口的新类, 或许还会有一些额外的方法和字段. 但继承并不只是复制基类的接口.
当创建了一个导出类的对象时, 该对象包含了一个基类的子对象. 这个子对象与你用基类直接创建的对象是一样的. 二者区别在于, 后者来自于外部, 而基类的子对象被包装在导出类对象内部(向上转型的理论依据).”你好好看看上面的内容 再看看我的问题
你可以自己写,如果你不写,编译器会自动给你加上.例子 :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的构造方法。
2,子类被实例化,在实例化出的对象之中包含着父类的对象(thinking in java中有提到)
问题:
1 由抽象类中允许存在构造方法和第二条得知,一个类B继承一个抽象类A A a=new B()的时候,不仅new出了B,同时也调用了抽象类A的构造方法,既然抽象类不能有对象,那么岂不很矛盾? 不能理解为抽象类型不能有对象,应该理解为抽象类不能直接被new出来,它只能通过子类创建出来,jvm判断他是否能被实例时是根据被调用的那个类是否是它的子类来决定的。这就是"抽象类和接口不能直接实例化"及"抽象类和接口不能实例化"两句话的差别
class AAA implements kkk{...}
public class BBB{
public static void main(String[] args){
kkk Keyi=new AAA();//正确
kkk BuXing=new KKK();//错误
}
}
抽象类,接口不能实例化,应该看new后面是什么,等号左边的类型名可以是抽象类或接口
1:不矛盾,抽象类不能被外部定义对象 (不能被直接实例化),并没有说内部不能有啊
2:如果B是派生自A(没有则派生自Object),同时implements C,那么new B构造函数调用和接口无关(看成特殊的抽象类,就特殊在这里了)。