标题:【求助】遇到一个继承的问题想求助
只看楼主
jiari56
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-10
结帖率:0
已结贴  问题点数:20 回复次数:11 
【求助】遇到一个继承的问题想求助
想请论坛前辈们指点下这个问题出现这样结果的原因,代码如下:
Country.java:
程序代码:
package cn.myself;

class Country{
    String name="xianfan";
    
    String value(String name){
        name = "China";
        return name;
    }
}


City.java:
程序代码:
package cn.myself;

class  City extends Country{
    String name;
    String value(String name){
        name = "Hefei";
        super.value("成功");
        System.out.println(name);
        System.out.println(super.name);
        return name;
    }
    public static void main(String[] args) {

        City c=new City();

        String a = c.value("失败");
        System.out.println(a);

        }
}

运行结果是:
Hefei
xianfan
Hefei


我思考了很久,也找了一些课程的super看了看,我知道this和super的用法,但这个例子出现的结果让人难以明白运行过程中发生了什么情况,实在想不通,特地前来论坛提问寻求前辈们指点帮助!

[此贴子已经被作者于2016-4-10 05:11编辑过]

搜索更多相关主题的帖子: China 
2016-04-10 05:08
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
得分:7 
为什么Country和City没有public也对

未佩好剑,转身便已是江湖
2016-04-10 08:55
Tony_PC
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:12
专家分:56
注 册:2016-4-9
得分:7 
子类的value方法对父类的value方法进行了重写,父类方法的会被隐藏,成员变量也是一个道理,程序是先从main函数执行的,使用子类创建对象,虽然传了参数,但是value中的 name = "Hefei"; 语句将name的值再次改成了hefei,所以第一个会是hefei,第二个使用super调用父类的成员变量,结果是xianfan,方法调用完成回到main函数,第三个会是hefei,如果你去掉value中的赋值语句,结果就会变成  失败,xianfan,失败。  至于为什么 super.value("成功"); 没有用, 你需要将他的值赋值给一个字符串对象,但是你父类同样赋了值  name = "China"; 。所以如果这样改 name=super.value("成功");   结果会变成 China xianfan China。 super.value("成功")调用父类的方法,方法中返回的只是形参的值,如果父类方法中 改成 this.name="China",这样第二个输出中super.name的值才会发生改变。

[此贴子已经被作者于2016-4-10 11:22编辑过]

2016-04-10 10:44
Tony_PC
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:12
专家分:56
注 册:2016-4-9
得分:0 
回复 2楼 alice_usnet
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,没有public类,系统默认认定和源文件名相同的类为public类

[此贴子已经被作者于2016-4-10 11:27编辑过]

2016-04-10 11:01
jiari56
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-10
得分:0 
回复 3楼 Tony_PC
谢谢前辈打了这样多字解我疑惑,我在仔细看您的解答,如果有不明白的地方可能会再次向您提问,谢谢您了
2016-04-10 15:30
jiari56
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-10
得分:0 
回复 2楼 alice_usnet
我只知道类名前如果有public的话那么类名必须和源文件名保持一致,但是具体底层是怎样一种原理我没有研究过,暂时只是这样知道着
2016-04-10 15:32
jiari56
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-10
得分:0 
回复 3楼 Tony_PC
谢谢前辈指点!到现在终于想明白了,第一个是因为没有用name去接收传递过来的name值所以本地依然name是"hefei",第二个结果是因为父类的方法里没有用this把它存储为对象属性而只是形参,依然是离开方法了即不存在了,所以成员属性依然是"xianfan",前辈,我这样理解是不是正确的呢?
2016-04-10 16:18
Tony_PC
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:12
专家分:56
注 册:2016-4-9
得分:0 
回复 7楼 jiari56
对的。你父类的函数形参不用name,换一个别的变量名,就算不使用this也是能改变成员变量的属性的。如果重名了就要使用this来访问被覆盖的成员变量。
2016-04-10 21:00
jiari56
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-10
得分:0 
回复 8楼 Tony_PC
确实是这样的,我后来改成其他形参确实结果变了,谢谢前辈指点!我的基础还是太薄弱了
2016-04-11 05:39
紫月一殇雪
Rank: 8Rank: 8
来 自:北大某鸟
等 级:蝙蝠侠
威 望:4
帖 子:131
专家分:764
注 册:2015-11-12
得分:7 
新人上路

---------------------来自北大某鸟
2016-04-11 10:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463465-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.454511 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved