首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2012-02-14 
[老人的讨论帖]你知道为什么嘛?好久没来CSDN了,忙,迷茫的芒~~ 不说废话,直接上代码:Java code//问题1:输出

[老人的讨论帖]你知道为什么嘛?
好久没来CSDN了,忙,迷茫的芒~~ 不说废话,直接上代码:

Java code
//问题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);   }}

Java code
//问题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();   }}

Java code
//问题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();   }}


[解决办法]
第一个问题,
----------------
20
10
----------------

因为变量是没有多态的,说白了,A.i和B.i是两个不同的成员变量。
函数才有重写这一说。

[解决办法]
关于多态,看一些资料吧。
这个是非常基础的知识,也是最重要的知识,到C++了,C#里面,也都是受用的东西!
[解决办法]
现在理解了……

第二个:因为被调用的只有 基类的方法。那么基类都是访问 A.i = 10 这个变量。

第三个:多态,两次其实都是在运行B这个类的print
[解决办法]
1.20 10
A类的i没有被覆盖

2.10 10
B类没有重写printI方法,所以执行的还是父类的方法

3.20 20
B类重写printI方法,打印自己的i变量
[解决办法]
好久不见楼主,怎么搞这个东西了?
[解决办法]
探讨
我太想当然了,猜错了,我面壁去了啊。

[解决办法]
楼主这一大堆说明:
1.类在被创建实例的时候就已经决定了能使用哪些方法,哪些变量。
2.当有继承关系时,同名变量不会被覆盖,而是会放在一个堆栈中。
3.当有继承关系时,方法的寻找路径是先本类,找不到找父类...
4.当有继承关系时,方法调用 this指向的变量 的寻找路径是先方法所在的类,找不到找父类...

[解决办法]
好久不见哇猴子兄
[解决办法]
1.变量没有多态 10 10
2.输出的变量是“就近原则”,两个都是调用a的println() 所以
3.输出的变量是“就近原则”,两个都是调用b的println() 所以

个人理解
[解决办法]
1.20 10 因为i是变量,A中的i没有被覆盖

2.10 10 因为B类没有重写printI方法,执行的还是父类的方法

3.20 20 因为B类重写printI方法
[解决办法]
第一个:20,10//当 B b = new B(); 的时候,由于B继承了A,它会先得到父类的值,然后再得到子类中的值,不存在重写父类方法,在这里打印的属性为各自的值。
 
 
第二个:10,10//由于B继承了A,所以会继承父类的方法,当子类中没有重写父类方法时默认调用父类方法,所以b打印出来为10

第三个:20,20//经过断点调试看到,当运行时实际打印的都是B中的printI(),但是B中的i具有两个值,1=10,1=20,因为B 继承了A,B继承A,B重写了父类中所有的方法。所以最后printI的都是B中的数据。

我理解不深刻。
是通过测试,断点调试看到它的运行步骤的。
如果写错了希望大家帮我改正。
谢谢。


------解决方案--------------------


答案不重要,只要你想过为什么就行了。都带了星星了就自己想吧。
[解决办法]
1题简单,不用多说,不存在覆盖
3.覆盖自己也能分析出来,
2.以前见到过,知道答案,就是不知道原理,劳驾猴哥解释一下?
上述这些题就是会的人,稍有不慎,就会出错
[解决办法]
这样的结果又是多少呢???

Java code
class A {   public int i = 10;      public void say(){           System.out.println(" 这是一个A类方法");       }}class B extends A{   public int i = 20;      public void say(){       System.out.println("这是一个B类方法");    }}public class ooDemo05{   public static void main(String args[]){      B b = new B();      A a = b;      b.say();      a.say();      System.out.println(a instanceof B);      System.out.println(a instanceof A);      System.out.println(b.i);      System.out.println(a.i);   }} 

热点排行