java 子类与父类 关系
classParent{inta=55;publicParent(){function();}publicvoidfunction(){System.out.printl...
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
希望高手来给我解释下 是如何得到这个结果的 展开
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
希望高手来给我解释下 是如何得到这个结果的 展开
11个回答
展开全部
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构造方法 然后子类对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
展开全部
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
子类的引用动态的指向父类引用对象
父类中有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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先 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了。
不懂之处在讨论
应该这样看,把它看成两句,就好理解了
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了。
不懂之处在讨论
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这其实牵涉到java内存模型。你可以去了解下。
这里你记住这些就好了:
在Java中,属性绑定到类型,方法绑定到对象!
所以方法有: new 谁 调用谁。
而属性是用谁,调用谁。
你的例子加一句 :
Child c =(Child) p;
System.out.println(c.a);
将会输出15 ,但这里并没 new 新的对象,只是换了个类来调用
这里你记住这些就好了:
在Java中,属性绑定到类型,方法绑定到对象!
所以方法有: new 谁 调用谁。
而属性是用谁,调用谁。
你的例子加一句 :
Child c =(Child) p;
System.out.println(c.a);
将会输出15 ,但这里并没 new 新的对象,只是换了个类来调用
追问
我觉得你比我的满意答案还要好啊,满意答案只能勉强解释 因为我这个child类,没有自己的构造方法,所以是将父类的构造方法继承了直接当做自己的构造方法,多以new 的就是父类的对象所以能够解释啊,我重新写了下子类的构造方法,加入了参数,结果依然没变,可是我这这时就new 的是子类了,解释不通啊
追答
呵呵。。构造方法是不能继承的哦,亲
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
父类是接口或者是抽象类,子类必须继承自父类。
在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中,通过关键字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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询