多态,继承,父类引用

最近复习Java的基础题,遇到了有趣的题目,看了看帖子,竟然是2007年在论坛上讨论的问题,果真是太阳底下无新鲜事

class Base{
 
   int i;

   Base(){
   add(1); 
   System.out.println(i);
 }
 
 void add(int v){
    i+=v;
    System.out.println(i);
 }
 
 void print(){
    System.out.println(i);
   }
}
class MyBase extends Base{
   MyBase(){
    add(2);
 }
   void add(int v){
     i+=v*2;
     System.out.println(i);
   }
}
public class TestClu {
  public static void main(String[] args) {
  
    go(new MyBase());
  //System.out.println();
 } 
    static void go(Base b){
    b.add(8);
   //b.print();
 }
}

下面整理一下思路,所用到的知识点

1.全局变量int默认为0

2.子类的构造过程中,必须 调用其父类的构造方法

3.如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法

围绕这三个知识点,我们可以知道

go(new MyBase());执行go(Base b) 因为确定对象时MyBase()

调用父类时

 Base(){
   add(1); 
   System.out.println(i);
       }

add用的时MyBase()里的add

因此add(1)就是用了下面的方法

 void add(int v){
     i+=v*2;
     System.out.println(i);
   }

i默认为0,i=1*2=2

目前i=2

下面调用MyBase()构造函数

  MyBase(){
    add(2);
 }

add(2)也用了上面的方法

i=2+2*2=6

MyBase()对象里i目前是6

开始执行b.add(8)

i=6 v=8

i=6+2*8=22

因此最终的答案是22

发布了47 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35097794/article/details/105064334