多态,继承,父类引用

最近复习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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值