解析 Java 中覆盖实例变量



我知道当你重载方法时,java会在编译阶段解决它,所以这就是为什么当你写这样的东西时:

public class SomeClass{
    private static void someMethod(Object obj){
        System.out.println("obj");
    }
    private static void someMethod(String str){
        System.out.println("str");
    }
    public static void main(String[] args) {
        Object obj = new SomeClass();
        obj.someMethod(obj);
    }
}

你会得到 OBJ,因为 oveload 是在编译时解析的,并做这样的事情:

 public abstract class Animal {
                public void careFor() {
        play();
    }
    public void play() {
        System.out.println("pet animal");
    }
}
 public class Lion extends Animal {
    public void play() {
        System.out.println("toss in meat");
    }
    public static void main(String[] args) {
        Animal animal = new Lion();
        animal.careFor();
    }
}

你会被扔进肉里,因为覆盖方法是在运行时阶段解决的。但我不明白的是。为什么当您覆盖实例变量时,您会在编译阶段遇到解决之类的情况。例如:

public abstract class Animal {
    String name = "???";
    public void printName() {
        System.out.println(name);
    }
}
public class Lion extends Animal {
    String name = "Leo";
    public static void main(String[] args) {
        Animal animal = new Lion();
        animal.printName();
    }
}

在这种情况下,我会得到???.因此,当您覆盖变量时,它看起来像是在编译阶段解决。是这样吗?

在Java中,只有方法才是多态的,而不是变量。

所以当你这样做时

 Animal animal = new Lion();

您从Animal获取所有变量,从执行Lion获取方法。

最新更新