[老人的讨论帖]你知道为什么嘛?

justinavril 2009-08-19 11:09:33
加精
好久没来CSDN了,忙,迷茫的芒~~ 不说废话,直接上代码:


//问题1:输出是什么?为什么?

class A {
public int i = 10;
}

class B extends A{
public int i = 20;
}

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

System.out.println(b.i);
System.out.println(a.i);
}
}


//问题2:输出是什么?为什么?

class A {
private int i = 10;

public void printI(){
System.out.println(i);
}
}

class B extends A{
private int i = 20;
}

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

b.printI();
a.printI();
}
}

//问题3:输出是什么?为什么?

class A {
private int i = 10;

public void printI(){
System.out.println(i);
}
}

class B extends A{
private int i = 20;

public void printI(){
System.out.println(i);
}
}

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

b.printI();
a.printI();
}
}
...全文
4201 224 打赏 收藏 转发到动态 举报
写回复
用AI写文章
224 条回复
切换为时间正序
请发表友善的回复…
发表回复
wvhuihui 2012-10-25
  • 打赏
  • 举报
回复
dsb_csdn 2012-08-31
  • 打赏
  • 举报
回复
第二个以为都是20,1,3虽然答案猜对了,还是不甚理解啊。
shaohuayuan 2012-06-07
  • 打赏
  • 举报
回复
太深奥了
gangzi220 2012-05-22
  • 打赏
  • 举报
回复
这是我以前面试题
zhaotongbeyond 2012-05-21
  • 打赏
  • 举报
回复
20 10
10 10
20 20
ming15111277652 2012-04-27
  • 打赏
  • 举报
回复
大家好 我是java新手 很多地方都不懂 我想问一下第一个代码中 A a = b; 是什么意思呀
zkvistor 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 215 楼 zkvistor 的回复:]
第一题:20  10 
20就不用揭示了  A a=b 把b 赋给a 那么就相当于是把b的引用赋给了a,传值传副本
传对象传引用,但是字段(i算的上是一个全局变量)没有重载的 所以本来是a.i=b.i应该是 20  但是字段是没有重载的 引用不了b里的i所以还是 10
第二题:都是 10   
B继承A 但是B中没有实现Print()方法,所以b.Print()调用的是父类A的方法,当调用a.Print()时打印出来的是 10  A a=b a的引用实际上就是b的引用  所以 同样打印出来的还是10
第三题:20  10
B中实现了Print()方法  所以b.Print()显示的是20 a.Print()调用的还是B类中的Print()方法,传对象就是传引用 ,但是i还是引用的是A类中的i所以打印出来的是 10 

另外像 A a=new B()

B b=new B()
A a =b这有什么区别 ?


[/Quote]

第三题 20 20
原理和第二题差不多
zkvistor 2009-09-29
  • 打赏
  • 举报
回复
经典的问题 值得琢磨
zkvistor 2009-09-29
  • 打赏
  • 举报
回复
第一题:20 10
20就不用揭示了 A a=b 把b 赋给a 那么就相当于是把b的引用赋给了a,传值传副本
传对象传引用,但是字段(i算的上是一个全局变量)没有重载的 所以本来是a.i=b.i应该是 20 但是字段是没有重载的 引用不了b里的i所以还是 10
第二题:都是 10
B继承A 但是B中没有实现Print()方法,所以b.Print()调用的是父类A的方法,当调用a.Print()时打印出来的是 10 A a=b a的引用实际上就是b的引用 所以 同样打印出来的还是10
第三题:20 10
B中实现了Print()方法 所以b.Print()显示的是20 a.Print()调用的还是B类中的Print()方法,传对象就是传引用 ,但是i还是引用的是A类中的i所以打印出来的是 10

另外像 A a=new B()

B b=new B()
A a =b这有什么区别 ?

gsk09 2009-09-28
  • 打赏
  • 举报
回复
.net
的结果是:
20 10
10 10
20 10
东方友诚 2009-09-06
  • 打赏
  • 举报
回复
这三个问题都含有三个类:A,B,TestPolm, Java虚拟机在编译的时候生成三个文件A.class,B.class,TestPolm.class;.class是跨平台文件,下一步将执行.class文件;类的属性直接编译到.class文件中的,类的方法在运行时动态生成调用;B.class中并没有A类中的属性,A类的属性在A.class中,如果在B.class需要使用A.class中的属性,那么B.class会去调用A.class文件;如果B.class中的某个属性的名称与A.class中的相同,由于它们两个在内存分配的地址不同,还是不同的东西;
在问题一中,B.i是从TestPolm.class中调用B.class中的属性i(注意:对象b中有两个i,名称相同但地址不同,默认访问B.class中的i,也可以通过super.i去调用A.class中的i),A a = b中的a对象类型仍然B类型的,调用a.i是从B.class中调用A.class中的i,在问题二中调用的是A.class中的方法,当然访问的是A.class中的属性;问题三中进行了方法重写,相当于A中的方法被替换了(原来的方法没有了),是虚方法调用 ,也叫多态,但用这种方法时不用对象a去调用对象b中新增加的属性和方法。
z_berry 2009-08-27
  • 打赏
  • 举报
回复
还是跟C++对比着来比较有意思,Java语法太浅显
biantiandiyun 2009-08-26
  • 打赏
  • 举报
回复
好好学习了
kaifaye 2009-08-24
  • 打赏
  • 举报
回复
太行了楼主
idealab 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sunnyfun888 的回复:]
楼主这一大堆说明:
1.类在被创建实例的时候就已经决定了能使用哪些方法,哪些变量。
2.当有继承关系时,同名变量不会被覆盖,而是会放在一个堆栈中。
3.当有继承关系时,方法的寻找路径是先本类,找不到找父类...
4.当有继承关系时,方法调用 this指向的变量 的寻找路径是先方法所在的类,找不到找父类...

[/Quote]

sunnyfun888貌似没说清楚哦,特别是第3条和第4条
j9dai 2009-08-24
  • 打赏
  • 举报
回复
michaelnami 2009-08-24
  • 打赏
  • 举报
回复
我也搞不太清楚
Bookman 2009-08-24
  • 打赏
  • 举报
回复
厉害,长见识了。
junyi541 2009-08-24
  • 打赏
  • 举报
回复
理解理解……
owen_008 2009-08-24
  • 打赏
  • 举报
回复
我是101~呵呵
加载更多回复(198)

62,615

社区成员

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

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