问题再现
有下面三个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其实都无法访问
}
}
总结
- 其实子类中的变量和父类中的变量根本就是两个独立不同的个体。
- 方法才有覆盖,变量没有
- 一个引用类型变量有啥属性和方法,只关注它的引用类型有啥