关于一个简单的类继承问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 15:54:17
public class A {
int x = 2;
int printa() {
return x;
}
}

public class B extends A{
int x=3;
int printa(){
return x;
}
}

public class Main {
public static void main(String[] args) {
A a = new B();
System.out.println(a.x);
System.out.println(a.printa());
}}

程序如上,结果是
2
3
能帮我讲一下继承的子类、超类转换的具体机制吗?最好答案切题且详细全面。或者把这个结果的原因讲下~

=.= 我也发现了

是不是被override的关系?~

不熟悉java~用c#尝试了下..当方法被覆盖的时候...调用的是B的方法~而当方法被隐藏的时候..调用的是A的~~

我同学说是内存切割的缘故..我不是很懂...不过应该没错...人家混MS的 =.=

这个是多态问题,子类继承父类的方法但是不继承父类的属性。
当父类为子类实例化的时候,父类和子类如果都有相同名的属性和方法,调用的时候,是调用子类的方法,而属性是父类的,切忌,多态是指方法重载和重写,和属性无关!
属性在编译之前就已经是固定的了,我去给你找个帖子看看,也是个面试题
http://topic.csdn.net/u/20090319/21/04a90625-47ea-40f0-b25a-5045f01a760c.html
好好看看人家的评论吧

System.out.println(a.x);
这一行是class A 里面的 所以先输入2
子类继承父类继承父类里面所有的东西

因为class B 继承了A
所以继承了A中的2
但是 B中的3把A中的2给覆盖了
所以显示是3

输出就是 2 3

你的类都没有构造函数。B会自动调用A的构造函数。这个时候你的System.out.println(a.x); 其实调用的是A的x,而当你System.out.println(a.printa()); 的时候,因为这个方法被override了,所以,调用的是B的x。

不知道对不对。
ps.你写的什么代码啊,我晕。

我先给出一个结论:父类引用指向子类对象时,父类与子类同名的属性和方法都会被覆盖。 (一般对属性的覆盖叫对属性的隐藏)

对于上面的结论我们