java 子类与父类 关系

class Parent{
int a=55;
public Parent(){
function();
}
public void function(){
System.out.println("parent's function");
}
}
class Child extends Parent{
int a=15
public static void main(String[] args){
parent p=new Child();
System.out.println(p.a);
System.out.println(p.funtion());
}

public void function(){
System.out.println("child's function");
}
}
输出结果是 child's function
55
child's function
希望高手来给我解释下 是如何得到这个结果的

parent p=new Child();
子类的引用动态的指向父类引用对象
初始化的后
如果子类自己没有构造方法,则它将继承父类的无参数构造方法作为自己的构造方法;如果子类自己定义了构造方法,则在创建新对象时,它将先执行继承自父类的无参数构造方法,然后再执行自己的构造方法。

所以先调用父类的Parent构造方法 然后子类对function进行了重写 所以输出
child's function
然后System.out.println(p.a);打印55
System.out.println(p.funtion());打印child's function 因为子类已经对父类的function方法进行了重写追问

如果子类自己没有构造方法,则它将继承父类的无参数构造方法作为自己的构造方法;
Parent p=new Child();这样说的话,因为我没有自己的构造方法,所以子类也就是把父类的构造函数复制到了自己类里面,所以第一句可以解释了,那么第二句怎么解释啊

追答

楼主不厚道

参考资料:编程吧—IT社区 28mike

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-22
Parent p = new Child();
子类的引用动态的指向父类引用对象
父类中有function 方法
子类中也有function 方法
父类的方法被子类重写

当被初始化会先调用父类的构造方法
public Parent() {
function();
}
这里的function 由于被子类所重写,所调用的并不是父类的
public void function() {
System.out.println("parent's function");
}
而是调用了子类的
public void function() {
System.out.println("child's function");
}
所以第一句输出 child's function
System.out.println(p.a); 这里用父类的引用获取a属性,故拿到的是父类的a=55
所以第二句输出 55
p.function(); 这里也跟第一句一样的 重写后所以输出 child's function
第2个回答  2012-08-22
首先 parent p=new Child();

应该这样看,把它看成两句,就好理解了
Child c=new Child(); //这句代码自然也就打印出了第一句 child's function
Parent p = c;

然后 Parent中有function()方法,而Child继承了Parent并且也有function()方法,所以可以看出Child 已经把 Parent给重载了。但是对于变量a,是无法重载的,只有方法可以重载。

所以当你调用 p.a 的时候,实际上调用的是Parent中的a.
而 p.function()之所以打印child's function,是因为你在 Child中进行了重载。如果你把Child中的function() 去掉,那么打印出来的就是parent's function了。

不懂之处在讨论
第3个回答  2012-08-22
这其实牵涉到java内存模型。你可以去了解下。
这里你记住这些就好了:

在Java中,属性绑定到类型,方法绑定到对象!
所以方法有: new 谁 调用谁。
而属性是用谁,调用谁。
你的例子加一句 :
Child c =(Child) p;
System.out.println(c.a);

将会输出15 ,但这里并没 new 新的对象,只是换了个类来调用追问

我觉得你比我的满意答案还要好啊,满意答案只能勉强解释 因为我这个child类,没有自己的构造方法,所以是将父类的构造方法继承了直接当做自己的构造方法,多以new 的就是父类的对象所以能够解释啊,我重新写了下子类的构造方法,加入了参数,结果依然没变,可是我这这时就new 的是子类了,解释不通啊

追答

呵呵。。构造方法是不能继承的哦,亲

第4个回答  推荐于2017-09-11
父类是接口或者是抽象类,子类必须继承自父类。
在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中不允许多继承。
举例:

class Animal{
void eat(){
System.out.println("Animal eat");
}
void sleep(){
System.out.println("Animal sleep");
}
void breathe(){
System.out.println("Animal breathe");
}
}

class Fish extends Animal{
void breathe(){
System.out.println("Fish breathe");
}
}

public class TestNew {
public static void main(String[] args) {
Animal an = new Animal();
Fish fn = new Fish();
an.breathe();
fn.breathe();

}
}
执行结果:
Animal breathe
Fish breathe

JAVA中 子类与父类构造方法的关系 个人理解
一、父类含有无参构造函数 1、子类没有构造方法或者含有无参的构造方法:这种情况,都会默认地调用super()2、子类含有有参数构造方法:同样会在首句默认调用super() \/\/其实跟情况1类似 二、父类含有含参数的构造方法,不含无参数的构造方法:子类没得选择:子类必须申明一个构造方法(且含super...

java中为什么说子类对象即是父类对象?求详解!!!
首先,子类继承自父类,可以继承父类除私有成员以外的所有成员,本身具有父类的一切性质。就如:学生类继承自人类。按实际情况来说,学生属于人,具有人所具有的一切特征。所以可以说:学生是人。再者,子类对象即使父类对象。体现了java中多态的特性。多态,是面向对象的程序设计语言最核心的特征。多态,...

JAVA 对象类型转换---子类转换父类
首先你要理解在Java里面子类与父类的关系。 子类继承父类,它可以继承到父类的非私有成员变量,以及方法。 也就是说这个子类的对象完全可以当作父类的对象来用,因为它拥有所有父类的方法,和成员 所以,在Java里面,父类的引用可以指向子类对象。 1.A a = b;因为b是B类的对象,B类继承自A类,所...

在java 中,什么叫父类,什么叫子类
父类和子类,就例如:老子和儿子,有着父子关系。而这里指的父子关系,其实也就是一种包含关系。打个比方,在我们现实生活中,学生Student是一个很大的概念,而U_Student大学生是属于学生中的一种,这里的学生即为父类,大学生即为子类。父类和子类区别在哪?学生和大学生都会有学习Study这个方法,但是...

JAVA父类调用子类方法
main方法中是可以的,父类是不能调用子类 的方法的。跟你说底层实现你也不懂,从面向对象上来说吧。父类先于子类存在,子类从父类中生出来,所以子类知道父类,可以调用父类方法。但父类不知道子类,子类可以任意的出生,只要你愿意,所以父类无法调用子类,他不知他会有这样的子类,也不知有多少个...

Java中的子类会继承父类的所有成员吗
1、关于私有成员变量 无论父类中的成员变量是私有的、共有的、还是其它类型的,子类都会拥有父类中的这些成员变量。但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected、public方法(如getter、setter方法)来访问。2、关于静态成员变量 无论父类中的成员变量是静态的...

java中为什么是先有父类后有子类呢?请高手详细地解释下原因
因为被继承后才能被称为父类,就比如你说你有了儿子才能说你是父亲了。。在内存中,因为子类拥有所有父类非private的方法和属性,所以会先产生一个父类对象。

父类实例与子类实例的关系
那么对你的问题中,既然是父类和子类,首先从文字意义上就知道他们存在着父子关系,这和现实中一样,父子必有共性,在java中用extends关键字来标识这种关系,extends是扩展的意思。从这里我们不难看出一点:子类拥有比父类共强大的功能,或者更多的属性。就是说子类对父类进行了扩展,并且父类能做的事...

java关于子类和父类构造方法的关系,犯迷糊!!
3、父类中显示定义了构造方法,却没有显示定义默认的无参数构造方法,那么子类定义任何构造方法中都需要通过super调用父类的构造方法 相关代码比较 1.public class Father {public void otherMethod(){}} public class Child extends Father { \/\/任意构造方法public Child(int b){System.out.println(b)...

下列说法中,( )是正确的。
【答案】:B B。【解析】本题考查对子类与父类关系的理解。对一个类的继承也就是构建了一个子类,子类继承了父类的方法和状态,同时还可以向新类中增添新的方法和状态。重点掌握两点:子类方法的访问权限比父类访问权限高,因此父类不能替代子类,但子类能够代替父类,子类方法不能产生比父类更多的...

相似回答