子类父类定义同一个变量的问题

sling2007 2011-02-22 02:05:28
今天的一个笔试题:
下面的代码,执行后的结果是什么?(第一行是输出1,第二行输出2,)
还有2问:为什么?这种现象(A B中定义相同属性的现象)叫做什么?
public class TT {
public static void main(String[] args) {
B b=new B();
System.out.println(b.getA());
System.out.println(b.getB());
}
}

class A {
int x = 1;
public int getA() {
return x;
}
}

class B extends A {
int x = 2;
public int getB() {
return x;
}
}
...全文
423 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sling2007 2011-02-22
  • 打赏
  • 举报
回复
我爱死你们了
INTRUSTION 2011-02-22
  • 打赏
  • 举报
回复
对象访问属性时访问到的总是以他被声明时的类型的属性 调用方法总是调用它实际类型的方法
但是如果调用的是父类的方法 他不能访问子类属性 但是子类方法可以通过super访问父类属性
silenceburn 2011-02-22
  • 打赏
  • 举报
回复
同意LS兄台的说法,
这个还是叫 shadowing 比较好,
叫覆盖、重写会引起概念上的一些混淆,
dracularking 2011-02-22
  • 打赏
  • 举报
回复
上面第四个纠正一下:是自定义变量名与系统中已存在类型重叠时
dracularking 2011-02-22
  • 打赏
  • 举报
回复
关于这个主题,分门别类大概有四种
Shadowing, Overriding, Hiding and Obscuring

1.shadowing 指属性的隐藏
2.overriding 指实例方法的覆盖,运行时可发生多态
3.hiding 指静态方法的覆盖,无多态

4.obscuring 算是自定义变量对系统级类型属性的隐藏
看一下这个:

class A {
static int MIN_PRIORITY = 59;
};

public class Obscure {
static A Thread;

public static void main(String args[]) {

// print value of class
// variable Thread.MIN_PRIORITY

System.out.println(Thread.MIN_PRIORITY);

// print value of
// java.lang.Thread.MIN_PRIORITY

System.out.println(java.lang.
Thread.MIN_PRIORITY);
}
}

打印:
59
1


dracularking 2011-02-22
  • 打赏
  • 举报
回复
这种叫法上是shadowing

最常见的例子就是应用于setter中,当然楼主提到的是子类对父类属性的shadow

int width;
. . .
public void setWidth(int width) {
this.width = width;
}

shadowing会容易造成迷惑,所以一般对shadowing持慎用态度
mopishv0 2011-02-22
  • 打赏
  • 举报
回复
jdk 1.6得到的结果是
1
2
LZ可以看看属性覆盖
http://mopishv0.blog.163.com/blog/static/54455932201010121468354/
对象访问属性时访问到的总是以他被声明时的类型的属性 调用方法总是调用它实际类型的方法
但是如果调用的是父类的方法 他不能访问子类属性 但是子类方法可以通过super访问父类属性
magong 2011-02-22
  • 打赏
  • 举报
回复
叫override,(覆盖、改写)
不过属性的override和方法不一样,属性虽被override但是本类中访问的会是本类中的属性,而不会是子类中的覆盖后属性。
keeya0416 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 easyroom 的回复:]
因为B中的x覆盖了A中的x,所以在B中直接访问x访问到的是B里面的x

这种现象较覆盖,
在B中可以这样访问A里的x

Java code
public int getC() {
return super.x;
}
[/Quote]
我觉得这个还不算是覆盖,叫 隐藏 比较好,毕竟父类的那个还是存在
而方法,子类对象是无法调用到父类被覆盖的方法
easyroom 2011-02-22
  • 打赏
  • 举报
回复
因为B中的x覆盖了A中的x,所以在B中直接访问x访问到的是B里面的x

这种现象较覆盖,
在B中可以这样访问A里的x
public int getC() {
return super.x;
}

62,615

社区成员

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

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