问一个继承的问题

brightyq 2010-11-29 02:17:54
public class ExtendTest {
public static void main(String[] args){
SubClass subClass=new SubClass();
System.out.println(subClass.getValue());
}
}

class BaseClass{
int j=2;
public int getValue(){
return j;
}

}
class SubClass extends BaseClass{
int j=3;
}


上述代码,为什么输出是2,而不是3?
...全文
175 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lei001 2010-12-04
  • 打赏
  • 举报
回复
成员变量无法覆盖的
silence_zXg 2010-12-03
  • 打赏
  • 举报
回复
因为是继承关系,子类没有重写父类的那个getValue方法,所以当调用的时候调的是父类的那个方法,所以就返回了父类的成员变量
queen25 2010-11-30
  • 打赏
  • 举报
回复
jdk 帮助 里面有例子 讲的很详细 可以找出来看下

「已注销」 2010-11-30
  • 打赏
  • 举报
回复
感觉你们都没说点子上 这个问题是继承的问题吗 明显是局部变量跟成员变量的问题 当局部变量与成员变量名称相同时 成员变量被覆盖…………抱歉 个人看法 未必正确……
ACDINO 2010-11-30
  • 打赏
  • 举报
回复
上面都说的很详细了
楼主想要输出3 在subClass里面再写一遍getValue方法就可以了
TillPerfect 2010-11-30
  • 打赏
  • 举报
回复
subClass.getValue()该代码执行时,调用的,是父类中的方法,很显然,父类方法是无法访问子类的变量的,所以,该方法的返回值,是父类中变量j的值。
初始化子类时,会先执行父类的构造函数。我们也可以由此理解下,子类“继承”得来的东西,与子类自己定义的东西,是不一样的。否则,也就不会有“覆盖”这么一说了。
自己的东西,自己初始化就好了。而父类那边的东西,还是要父类自己去初始化的,子类有受限制的使用权。

额,说的不够专业,勉强各位看看。。。
fantasy0126 2010-11-30
  • 打赏
  • 举报
回复
非静态方法是多态的
但非静态数据成员,不是多态的...

这个问题 貌似有N个人有疑问了
brightyq 2010-11-29
  • 打赏
  • 举报
回复
子类没有重写父类的getValue方法,但应该有继承过来的方法。你指作用域是什么作用域?
Isnotsuitable 2010-11-29
  • 打赏
  • 举报
回复
int J 虽然是同一个变量名,但是作用或不同,所以为2
brightyq 2010-11-29
  • 打赏
  • 举报
回复
子类继承父类,那子类应该也有一个getValue方法。
子类有j这个变量,为什么返回的是父类的j变量,不是子类本身的j变量?
Isnotsuitable 2010-11-29
  • 打赏
  • 举报
回复
如果子类有同样的方法,那就会执行子类的方法
Isnotsuitable 2010-11-29
  • 打赏
  • 举报
回复
package property;

public class test {
public static void main(String[] args) {
SubClass subClass = new SubClass();
System.out.println(subClass.getValue());
}
}

class BaseClass {
int j = 2;

public int getValue() {
return j;
}

}

class SubClass extends BaseClass {
int j = 3;
public int getValue(){
return j;
}

}
gxifu 2010-11-29
  • 打赏
  • 举报
回复
子类调用父类的方法

在 SubClass 复写 getValue(){} 则输出 3
zdjray 2010-11-29
  • 打赏
  • 举报
回复
可以这么理解,实际上是

class BaseClass{
int j=2;
public int getValue(){
return this.j;
}


java没有对变量的overriding,只会出现在方法中

假如如下所写就是你想象的那种情况

public class ExtendTest {
public static void main(String[] args){
SubClass subClass=new SubClass();
System.out.println(subClass.getValue());
}
}

class BaseClass{
protected int j=2;
public int getValue(){
return j;
}

class SubClass extends BaseClass{
public int getValue(){
j = 3;
return j;
}

}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧