java中实例子类会有父类对象产生吗?如果不产生父类对象为什么子类有父类的属性和方法?
2016-10-21 19:35
471 查看
首先第一个问题:
子类在创建实例后,类初始化方法会调用父类的初始化方法(除了java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法。这个地方所说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法,初始化方法是由java源程序的三个部分组成的,一个部分是成员字段后的直接的初始化语句,例如private int i=0;private Date date=new Date();等等,第二个部分是由初始化块组成,例如:
public class Test{
private int i=0;//初始化第一部分
//以下大括号内为初始化第二部分
{
this.i=4; //do something......
}
}
第三个部分就是java源代码中的构造方法中的代码,java源代码中有几个构造方法,那么class文件中就有几个初始化方法,编译器会把第一部分与第二部分分别复制到每个初始化方法的前端,然后把初始化方法对应参数的构造方法的代码复制到相应初始化方法中(这里说的复制其实应该说是编译,不过为了让你更好理解所以如此说).那么说初始化方法如何追述其父类的,这也关系到初始化方法的结构,初始化方法的执行顺序以及结构就如上所说,但是每个初始化方法的第一个执行指令就是调用另外一个初始化方法,这个初始化方法可能是自身类某个初始化方法,例如你的构造函数中第一句有类似this(...)这种语句,那么初始化方法就会调用自身类的指定构造方法;如果你的构造方法中没有指定构造方法调用,那么初始化方法会默认调用父类无参数初始化方法,如果你的子类第一句为 super(....),那么初始化方法会调用父类指定初始化方法。这种调用过程会递归进行调用,直到这个类是java.lang.Object类。调用初始化方法并不代表会生成对象,你的java代码中出现new关键字加上构造方法的调用,只会生成一个对象,其父类对象不会生成。而且初始化方法对于虚拟机来说只是一个名称叫做" <init>"的普通方法,区别只是生成对象以后调用而已。
ps. 调用创建对象未必需要调用构造方法,比如反序列化。
第二个问题:参考 http://hxraid.iteye.com/blog/687660
子类在创建实例后,类初始化方法会调用父类的初始化方法(除了java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法。这个地方所说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法,初始化方法是由java源程序的三个部分组成的,一个部分是成员字段后的直接的初始化语句,例如private int i=0;private Date date=new Date();等等,第二个部分是由初始化块组成,例如:
public class Test{
private int i=0;//初始化第一部分
//以下大括号内为初始化第二部分
{
this.i=4; //do something......
}
}
第三个部分就是java源代码中的构造方法中的代码,java源代码中有几个构造方法,那么class文件中就有几个初始化方法,编译器会把第一部分与第二部分分别复制到每个初始化方法的前端,然后把初始化方法对应参数的构造方法的代码复制到相应初始化方法中(这里说的复制其实应该说是编译,不过为了让你更好理解所以如此说).那么说初始化方法如何追述其父类的,这也关系到初始化方法的结构,初始化方法的执行顺序以及结构就如上所说,但是每个初始化方法的第一个执行指令就是调用另外一个初始化方法,这个初始化方法可能是自身类某个初始化方法,例如你的构造函数中第一句有类似this(...)这种语句,那么初始化方法就会调用自身类的指定构造方法;如果你的构造方法中没有指定构造方法调用,那么初始化方法会默认调用父类无参数初始化方法,如果你的子类第一句为 super(....),那么初始化方法会调用父类指定初始化方法。这种调用过程会递归进行调用,直到这个类是java.lang.Object类。调用初始化方法并不代表会生成对象,你的java代码中出现new关键字加上构造方法的调用,只会生成一个对象,其父类对象不会生成。而且初始化方法对于虚拟机来说只是一个名称叫做" <init>"的普通方法,区别只是生成对象以后调用而已。
ps. 调用创建对象未必需要调用构造方法,比如反序列化。
第二个问题:参考 http://hxraid.iteye.com/blog/687660
相关文章推荐
- 【Java面试题】42 TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- java子类对象在子类方法中使用父类属性 使用this和super都可以
- java基础问题----------TreeSet里面放对象,如果同时放入了父类和子类的实例对象
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- Java中子类继承了父类的私有属性及方法吗?
- 在java中怎么理解“用instanceof操作符判断父类对象是否为子类的一个实例”?
- JAVA中子类能不能继承父类的私有属性和方法?
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- Java学习笔记——子类调用父类属性方法
- Java基础重温(六)子类与父类实例方法、静态方法的重写问题
- Java对象初始化步骤&&子类继承父类后变量与方法调用情况
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- Java反射获取private属性和方法(子类,父类,祖先....)
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- JAVA存取对象属性时,如果开程多线程,记得对相关存取方法作原子化操作定义
- Java 子类 继承 父类 所有属性、方法
- 异常父类为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量