求两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);
输出:? 展开
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);
输出:? 展开
2个回答
展开全部
第一题是 5 第二是10 20 吧?
这个应该考得多态
第一个用B的实例化生成父类A,调用属性就返回的A的属性
第二个分别实例化了A 和B,但是B覆盖了A的方法,所以调用p2.m()方法的时候打印20而不是10
这个应该考得多态
第一个用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属性。所以这个属性的定义是冗余的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询