2 qq 34316891 qq_34316891 于 2016.03.17 11:06 提问

Java中关于字父类的问题,求好心人帮助

Zi类继承Fu类,结果应该输出6不应该是7啊,求大神解答。
class Fu{
int x=7;
int y=2;
public void a(){
System.out.println(this.x);
}
}
class Zi extends Fu{
int x=6;
}
public class a122 {
public static void main(String[] args){
Zi zi=new Zi();
zi.a();
}
}

6个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.17 11:32
已采纳

这个很好理解,因为你的方法a是从父类继承过来的,最终调用的是父类的方法,虽然你的子类与父类有同名的成员变量x,但是本质上子类是有两个x的,一个指向自己的x,另一个执行父类的x,然后调用a方法时,由于a是父类的方法,所以在父类方法中访问的变量是父类的值。
如果你要输出7,就要重新a方法,输出子类自己的成员变量x。

 class Zi extends Fu{
    int x = 6;
    public void a() {
        System.out.println(this.x);
    }
}

子类和父类有相同的成员变量时,输出到底是谁的取决于调用的是谁的方法。如果子类重写了a()那么输出的就是子类的x。

wojiushiwo945you
wojiushiwo945you 回复qq_34316891: 那你给我采纳了呗!我好积累c币,换本书看看。
2 年多之前 回复
qq_34316891
qq_34316891 谢谢你哈!好人一生平安,嘿嘿。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复qq_34316891: 运行时new操作,有继承关系的两个类是这样的,最终new出来的子类的对象的内部会有一个父类对象,各自有自己的属性,各自的方法中操作的this指向各自的对象的。这个a方法最终是父类的方法,所以this也是父类对象的。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复qq_34316891: 这个this是在父类方法中,是指父类的对象的啊。
2 年多之前 回复
qq_34316891
qq_34316891 public void a(){ System.out.println(this.x); }这个方法中不是有一个this关键字吗,应该谁调用a方法就应该输出谁的x,那我是子类调用的应该输出子类的x,就是6啊,如果没有int x=6这条一句,才会输出7啊,
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.17 11:12

首先,你贴图根本看不清楚。直接把代码贴出来,不要贴图。

qq_34316891
qq_34316891   2016.03.17 11:16

class Fu{
int x=7;
int y=2;
public void a(){
System.out.println(this.x);
}
}
class Zi extends Fu{
int x=6;
}
public class a122 {
public static void main(String[] args){
Zi zi=new Zi();
zi.a();
}
}

qq_34316891
qq_34316891   2016.03.17 11:21

求大神解答,很想弄懂为什么不对,谢谢了。

qq_34316891
qq_34316891   2016.03.17 11:28

我认为结果应该输出是6,Zi类里面重写了X,所以zi对象去调用a方法的时候,返回的应该是zi的X,也就是6,然而输出的是7,我就不明白了。

wojiushiwo945you
wojiushiwo945you 你这个不是重写,只是又定义了一个与父类同名的成员变量,本质上这个子类对象会有两个x的变量空间的。要看是谁的方法,输出谁的成员变量。
2 年多之前 回复
qq_34316891
qq_34316891   2016.03.17 11:44

public void a(){
System.out.println(this.x);
}这个方法中不是有一个this关键字吗,应该谁调用a方法就应该输出谁的x,那我是子类调用的应该输出子类的x,就是6啊,如果没有int x=6这条一句,才会输出7啊,

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java中关于继承的问题
java中关于继承
Java中继承子类对父类的引用问题
定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。但当这样定义时: Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的
java 中父类引用指向子类对象时
继承和方法重写已经很熟悉了,这次 主要验证一下,当一个父类的引用指向一个对象的时候,它会调用子类的方法,而不是父类的。 引用在栈内存中存在对象的内存地址。真正的对象(通过 new Student()创建的)存放在堆内存里。 在这块堆内存区域内,存在的是子类的属性(包括自己特有的,以及通过super()构造方法中从父类获得的) 和方法(继承父类但没有覆盖的,以及覆盖父类的方法和自己特
一个字的伤感网名又是一个伤感的故事
一个字的伤感网名又是一个伤感的故事 — 一个字的伤感网名又是一个伤感的故事 男孩爱上了一个女孩,女孩也很喜欢他,渐渐的两个人走到了一起,同居了,当男孩的嘴第一次吻到女孩的唇时,女孩就决定这一辈子都跟定他了,于是女孩调皮的问:你会爱我多久?男孩捏着女孩的鼻子温柔的说:你想要多久呢?女- 孩想了想天真的说:那就一辈子吧,这一辈子你都不许喜欢别的女孩!男孩笑着说:嗯,好!女孩又想了想嘟起小嘴:
关于java继承的一道经典面试题
package com.test; class Father{ int x = 1; public Father(){ System.out.println("father"); } public Father(String s){ System.out.println("father:"+s); } } class Son extends Father{ int x
Java子类父类初始化顺序
今天复习了一下Java基础知识,发现一个挺有趣的问题: Father类:package p2; public class Father { public Father() { // TODO Auto-generated constructor stub say(); } public void say() { System.out.println("I'm father"
一个关于成员变量的多态问题
首先看下面的代码:class Fu{ int i = 10; } class Zi extends Fu{ int i = 20; } class Test{ public static void main(String[] args) { Fu test = new Zi(); System.out.println(Fu.i);
父类类型的引用变量问题
说明父亲类型引用变量对数据和方法的调用规则
java父类与子类的多态性
父类: public class base { public String s1 = "base string"; public static String s2 = "base static string"; public void show() { System.out.println(this.s1); } public void show_static() {
java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。 public class FatherTest { private String name; FatherTest(){ System.out.println("--父类的无