java中重写实例变量的解析

java中重写实例变量的解析,java,overloading,overriding,Java,Overloading,Overriding,我知道,当您重载方法时,java会在编译阶段解析它,所以这就是为什么在编写类似以下内容时: public class SomeClass{ private static void someMethod(Object obj){ System.out.println("obj"); } private static void someMethod(String str){ System.out.println("str"); }

我知道,当您重载方法时,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,因为在编译和执行类似操作时解决了加载问题:

 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获取执行方法。

在Java中,只有方法是多态性而不是变量

所以当你这么做的时候

 Animal animal = new Lion();

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

是的,确实如此。变量的访问基于引用,而不是实例。从概念上讲,变量是不可重写的。是的,的确如此。变量的访问基于引用,而不是实例。从概念上讲,不存在对变量的重写。