日期:2014-05-20  浏览次数:20595 次

[老人的讨论帖]你知道为什么嘛?
好久没来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中的数据。

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


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