A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李阳 中级黑马   /  2013-1-8 13:50  /  2681 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李阳 于 2013-1-8 14:37 编辑

class ExtendsDemo
{
        public static void main (String args[])
        {
                SonClass s = new SonClass();
                s.show();
                System.out.println(s.name);
        }
}
class FatherClass
{
        String name = "china";
        public void show()
        {
                System.out.println(this.name);
        }

}
class SonClass  extends FatherClass
{
        String name = "beijing";
}
/*

子类继承父类,没有对父类的show()方法重写。
为什么子类对象调用show()方法显示的是父类的成员变量?
*/

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
是啊,就是这么回事啊,没有为什么啊,就那样的,要解释的话那就分析一下,
首先你子类new出来个子类对象s,s调用的show方法,那么JVM会去子类中找show这个方法,
没找到(这里就是你说的没重写父类方法),那么他就要去父类里边找啊,然后调用show方法打印china,
然后主函数,打印s.name,就是子类当中name啊

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
System.out.println(this.name);
手头没有编译器,你可以试试去掉这个“this",打印的应该是子类的成员变量
根据this的特点:本类功能内部使用了本类对象,才用this表示。子类虽然集成了父类的方法,但是子父类中的成员变量都可以访问,只是用this和super来区分调用
回复 使用道具 举报
子类继承父类,实际上是确立一种引用关系,子类并没有正真的拥有所继承的内容。子类要用到父类的内容时,会去父类找。所以调用show()方法,显示的是父类的内容。
我这样理解对不对?
回复 使用道具 举报
杨建聪 发表于 2013-1-8 14:12
System.out.println(this.name);
手头没有编译器,你可以试试去掉这个“this",打印的应该是子类的成员变量 ...

试过了,显示的还是父类的
回复 使用道具 举报
子类继承父类,是继承关系,子类会拥有父类的变量和方法,你的子类当中没有重写父类的show方法,那么调用子类对象的show方法时候会用继承下来的父类中的方法,就是调用了父类中的show了,打印就是china了,即使你去掉this,打印出来的还是china,父类都不知道你子类能不能有同名变量,难道你要他打印子类当中的name?所以打印出来的不是beijing而是父类中的name:china。
回复 使用道具 举报 1 0
黑马王振宇 发表于 2013-1-8 14:27
子类继承父类,是继承关系,子类会拥有父类的变量和方法,你的子类当中没有重写父类的show方法,那么调用子 ...

谢谢了:handshake
回复 使用道具 举报

只要创建一个类的实例对象时,都会有一个默认的引用指向这个类本身,也就是this。
你上面的FatherClass中的this就是它本类的一个引用,
FatherClass中定义的name属性,只是属于本类的一个属性,
因此,本类的引用(this)当然只会调用本类的属性。
所以当你调用时会打印出FatherClass的内容。
super指的是父类的一个引用。以下是实验代码:
class FatherClass {
        public int value;
        public void f() {
                value = 100;
                System.out.println
                ("FatherClass.value:"+this.value);
        }
}

class ChildClass extends FatherClass {
        public int value;
        public void f() {
                super.f();
                value = 200;
                System.out.println
                ("ChildClass.value="+this.value);
                System.out.println(super.value);
        }
}
public class TestInherit {
        public static void main(String[] args) {
                ChildClass cc = new ChildClass();
                cc.f();
        }
}
打印结果:
FatherClass.value:100
ChildClass.value=200
100
可以发现当调用子类中的f()方法时,通过super.f()调用了父类中f()方法.
而this.value打印的是各自类中的属性值。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为父类中的show方法并没有传递参数,继承类执行时,同名变量优先找父类中的调用,而函数优先找子类中的执行,所以输出的是china和beijing。若要输出子类中名字,可以将show方法改为有参数并输出传入的参数的方法。下面为修改后的代码,已测试。
class Demo
{
        public static void main (String args

[])
        {
                SonClass s = new SonClass();
                s.show(s.name);
                System.out.println(s.name);
        }
}
class FatherClass
{
        String name = "china";
        public void show(String name)//改为有参数的方法
        {
                System.out.println(name);//若此处为this.name则输出仍未china;
        }

}
class SonClass  extends FatherClass
{
        String name = "beijing";
}
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马