1. 创建子类的对象时是不是也同时创建了父类对象啊
只创建子类对象,
子类对象包括两个部分,
自己特有的属性和方法+从父类继承来的属性和方法.
2. 有个疑问生成子类对象没有生成父类对象,那么super指向的父类对象是什么时候生成的
我用非标准的语言来说一下:
当一个子类对象生成时,其内部是包含一个父类对象的,但是对于父类对象的私有部分,子类对象不可访问。
3. Java中创建一个子类对象,强制把它转换成父类定义为一个新的父类对象,那么这个强制转换了的对象
算,不是强制,而知这种转化肯定成功。
当把子类对象赋给父类引用对象时,被称为向上转型,这种转型总是可以成功的,这也从另一个侧面证实了子类是一种特殊的父类。这种转型只是表明这个引用变量编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。
4. java中,创建子类对象时,父类对象会也被一起创建么
父类的构造函数会执行,但是不会创建父类对象
5. 新建父类引用到子类对象实现子类转换为父类类型后,子类对象所拥有的父类没有的属性是否会消失
这个不会消失,但是父类看不到子类的属性,也就是说调用不到的。
但是如果你把 个由子类转换来的父类引用交给一个子类时,属性就可以调用了。
如:
// Child有一个父类没有的属性x
Child c = new Child();
Parent p = c;
System.out.println(p.x); //这里在编译时会报错,因为对Parent类来说,是没有x这个属性的。
Child cc = p;
System.out.println(cc.x); // 转换回来后,可以正常调用并且得到值。
关于地址的问题。因为赋值操作都是把地址交给不同的变量,只是变量的指向变化了,而地址是没有发生改变的。
6. 为什么在创建子类对象的时候会调用父类的构造函数
对象自己就是一个父类对象。除非是对象的构造方法里创建了父类对象,否则没有创建父类对象。
7. C++中,创建子类对象时,是否已经创建了一个无名父类对象
额。。楼主适合当哲学家。但是实际上区分到底是包含还是并列并没有实际意义。
所谓的继承只不过是strousp大大定义的一种抽象的概念,具体怎么实现的根据编译器而定。甚至即便是编译器也未必清楚的采用了无名对象亦或是同名对象。反正当一个新的子类对象初始化时,系统会根据它和它的父对象初始化它。
不过在有些情况下把他按照无名对象理解确实可以,比如说在私有继承或保护继承时。
class son :private father son a; 这是其父类的表现更像是son的一个成员变量,也就是你所说的包含而不是融合。
这样的回答满意吗?
8. java中创建子类对象的过程
如果实例化的类有父类存在,则:
在第一次进行子类实例化时,执行顺序为:
初始化父类静态 成员变量、子类静态成员变量、父类非静态成员变量、父类 构造函数、子类非静态成员变量、子类构造函数;
如果不是第一次进行实例化,则执行顺序为:
父类非静态成 员变量、父类构造函数、子类非静态成员变量、子类构造函 数
9. 子类对象的实例化过程
对于许多Java老手来说,子类对象的实例化过程也不见得非常清楚,你可能并不需要完全了解子类对象的实例化过程,但了解后还是有好处的。对象中的成员变量的初始化是按下述步骤进行的:1).分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量按第三章的表3.1中的对应关系对对象中的成员变量进行初始化赋值。2).绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。3).如有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步骤6执行。4).显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类,在本章后面部分有详细讲解),父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。5).进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句,如:public Student extends Person{String school = ”it315”;// 显式初始化……}将“it315”赋值给school成员变量。6).执行当前构造方法的方法体中的程序代码,如public Student extends Person{public Student(String name,int age,String school){super(name,age);this.school=school;}}这一步将执行this.school=school;这条语句,其中用到的super()或this()方法调用语句已在前面的步骤中执行过,这里就不再执行了。注意区别刚才所说的this()方法调用语句与this.school=school的区别,前者指调用其他的构造方法,后者是一个普通的赋值语句。为了便于读者直观地看到子类对象的实例化过程,我将上面的流程用图4.1进行了重复描述。图4.1回过头来想一想:1).为什么super(…)和this(…)调用语句不能同时在一个构造函数中出现?2).为什么super(…)或this(…)调用语句只能作为构造函数中的第一句出现?对照对象初始化实例变量过程,我们就发现这两种情况都违背上面的过程,所以读者应该明白上面两个问题的原因了。
10. 高人,java中,在创建子类的对象时,是不是同时也创建了一个对应的父类的对象
这个应该是没有的,只是子类继承了父类的成员变量和方法,所以生成子类的对象时就可以直接引用父类的变量和方法了。还有就是也可以用一下向上转型,那么就可以生成一个父类的引用和子类的对象。