28 关于JAVA多态中认识的一个误区

问题再现

有下面三个JAVA代码,其中内容如下
问:
输出的结果是0还是1?

// Father.java
package demo01;
public class Father {
    public int num=0;
    public void method(){
        System.out.println("我是父类中的方法");
    }
}

// Son.java
package demo01;
public class Son extends Father{
    public int num=1;
    @Override
    public void method(){
        System.out.println("我是子类方法");
    }
}

// TestMain.java
package demo01;

public class TestMain {
    public static void main(String[] args) {
        Father f = new Son();
        System.out.println(f.num); // 结果是啥?
    }
}

我的答案

我觉得是1,new Son()把Son对象的地址给了变量f,那么f.num自然指向的是子类中的num,也就是1啦。

打脸的结果

运行之后发现是0。

原因

一个很简单的问题,一个人有什么,首先要看你是谁?
你是帅哥,你就有颜。
你是富翁,你就有钱。
你是总统,你就有权。

那么变量f有什么呢?得看变量是啥。
f是Father类型的。
Father有num,是0。
所以f.num=0

方法的覆盖

那有人会说,为啥f.method就输出了 我是子类方法 这样的结果呢?
因为人家已经告诉你了,是Override操作。
Override就是覆盖掉了。
怎么才能覆盖,得先有一个原来的,新的才能去覆盖旧的。
假设父类方法中没有这个方法,子类也就根本谈不上覆盖。

变量没有覆盖

方法可以覆盖,变量有覆盖吗?
JAVA从来没说过,也没有在子类的num变量给出Override这样的标识。

改一下代码更容易理解

```java
// Father.java
package demo01;
public class Father {
    public int numF=0; //换个名字
    public void method(){
        System.out.println("我是父类中的方法");
    }
}

// Son.java
package demo01;
public class Son extends Father{
    public int numS=1; //换个名字
    @Override
    public void method(){
        System.out.println("我是子类方法");
    }
}

// TestMain.java
package demo01;

public class TestMain {
    public static void main(String[] args) {
        Father f = new Son();
        System.out.println(f.numF); // f.numS其实都无法访问
    }
}

总结

  1. 其实子类中的变量和父类中的变量根本就是两个独立不同的个体。
  2. 方法才有覆盖,变量没有
  3. 一个引用类型变量有啥属性和方法,只关注它的引用类型有啥
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值