求两JAVA题的输出结果和解题思路,谢谢

classA{publicintdata=5;publicvoidprint(){System.out.println(data);}}classBextendsA{pu... class A{
public int data=5;
public void print(){
System.out.println(data);
}
}
class B extends A{
public int data=2;
public void print(){
System.out.println(data);
}
}
public class TestAB {
public static void main(String[] args){
A a=new B();
a.print();
System.out.println(a.data);
}
}

输出:?

public class A{
public void m(int i){
System.out.println(10);
}
}
public class B extends A{
public void m(int k){
System.out.println(20);
}
public static void main(String[] args){
A p1=new A();
A p2=new B();
p1.m(1);
p2.m(2);

输出:?
展开
 我来答
AB文心雕龙BA
2013-06-11 · TA获得超过221个赞
知道小有建树答主
回答量:165
采纳率:0%
帮助的人:156万
展开全部
Java继承的重要特点是多态,就是如果子类对象赋值给父类对象,在调用方法时,如果子类没有重写父类的方法,则沿着继承链找父类的方法。但是属性不符合多态的要求。所以:
第一个结果是2,5
第二个结果是10,20
coclely
2013-06-11 · TA获得超过262个赞
知道小有建树答主
回答量:227
采纳率:100%
帮助的人:183万
展开全部
第一题是 5 第二是10 20 吧?

这个应该考得多态
第一个用B的实例化生成父类A,调用属性就返回的A的属性
第二个分别实例化了A 和B,但是B覆盖了A的方法,所以调用p2.m()方法的时候打印20而不是10
追问
第一题我用eclipse做出来是2 5   第二题不清楚

求问下 A a=new B();怎么理解
追答
第一题漏看了。答案是 2  5 没错,中间一个print()给我略过了。
A a = new B() 这个只会在继承的时候出现,而且是用子类的构造器对应父类对象
这个写法其实我不知道SUN公司为什么要这样定义的。。可能是为了要体现继承这个特点?
按定义来说,有子类和父类,父类可以有很多子类,所以按集合来说,父类是包含子类的
所以 不管用哪个子类实例化,都可以算是父类的一部分,a = new B()这样就不会出错。但我个人老觉得这样写不规范的样子,自己一般还是B b = new B();
这样的写法其实也算常用 比如 List list = new ArrayList();
子类继承于父类的,只有方法,并且有覆盖的情况出现。而属性是和父类分开算的。你用哪个对象调属性,就是哪个对象的属性值 。
所以才有a.print()是2 但是 a.data却是5的情况,因为print()是覆盖过的方法,但是data是A类里面的属性。
事实上题目中这种写法是很不规范的。子类如果和父类拥有同一个属性,根本不用重新定义,直接都可以用的。不写的情况下b.data都不会出错。能正常返回A类中的data属性。所以这个属性的定义是冗余的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式