求问基础知识?谢谢?

jdjtwq 2005-03-19 02:49:07
class A{
int i=10;
}
public class B extends A{
int i=100;
B b=new B();
//A a=new A();
public static void main(String[] args){
System.out.println(b.i);
//System.out.println(a.i);
}
}
请问输出是多少?如果把注销去掉,并把注销语句前一句注销,那么结果是什么?

这种现象的名称是什么?

谢谢!
...全文
108 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
边城狂人 2005-03-19
  • 打赏
  • 举报
回复
class A {
int v = 10;
}

class B extends A {
int v = 100;
}

public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();

System.out.println("a.v = " + a.v);
System.out.println("b.v = " + b.v);
System.out.println("c.v = " + c.v);
}
}

看这个例子,输出是
a.v = 10
b.v = 100
c.v = 10

也就是说,对于成员变量,是根据引用类型来调用的,而不是根据实际的类类型来调用的。你们看,c 实际是 B 的对象,但是是 A 类型的引用,结果输出来的是 A 中定义的 v 的值。这就很明显了。其原因,对于成员变量,只有隐藏一说,并不能重载/改写,而对于方法,才有改写一说。

再看两个例子,看看他们的结果:
其一:
class A {
int v = 10;

public int getV() {
return v;
}
}

class B extends A {
int v = 100;
}

public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();

System.out.println("a.v = " + a.getV());
System.out.println("b.v = " + b.getV());
System.out.println("c.v = " + c.getV());
}
}

结果是:
a.v = 10
b.v = 10
c.v = 10

注意,我只给 A 定义了 getV() 方法,所以不管什么对象什么引用,都是调用的 A 的 getV() 方法,而 A 的 getV 只能访问到 A 的 v。那么再来看看第二个例子,在 B 中重载了 getV() 方法:

class A {
int v = 10;

public int getV() {
return v;
}
}

class B extends A {
int v = 100;

public int getV() {
return v;
}
}

public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();

System.out.println("a.v = " + a.getV());
System.out.println("b.v = " + b.getV());
System.out.println("c.v = " + c.getV());
}
}

结果是:
a.v = 10
b.v = 100
c.v = 100

这是因为方法是要卖实际类型来调用的,因为 b 和 c 的实际类型都是 B,所以调用了 B 的 getV() 方法,这个方法中访问到的是 B 的 v 值,所以输出100。
shendiaodaxia 2005-03-19
  • 打赏
  • 举报
回复
说得不错,可以多看点这方面的书籍.
topil 2005-03-19
  • 打赏
  • 举报
回复
来晚了,呵呵。ASPserver(代码研究员) 说的很清楚了
jdjtwq 2005-03-19
  • 打赏
  • 举报
回复
谢谢各位了
allen1671 2005-03-19
  • 打赏
  • 举报
回复
super.i 调用父类的i
老無所依 2005-03-19
  • 打赏
  • 举报
回复
当子类和父类中有同名成员变量时,父类成员变量将被隐藏,可以用super 这个关键字来引用被隐藏了的变量
所以楼主的题中,父类变量i被隐藏,那么结果就该是100,10
Mark大先生 2005-03-19
  • 打赏
  • 举报
回复
100!!
chg2008 2005-03-19
  • 打赏
  • 举报
回复
子类屏蔽父类的i
输出当然是 100
10
nuboy 2005-03-19
  • 打赏
  • 举报
回复
应该输出100
这种现象叫 屏蔽(shadow)
如果你想访问父类的i
可以用
super.i;

62,634

社区成员

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

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