java中重写实例变量的解析
我知道,当您重载方法时,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"); }
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获得执行方法。是的,确实如此。变量的访问基于引用,而不是实例。从概念上讲,变量是不可重写的。是的,的确如此。变量的访问基于引用,而不是实例。从概念上讲,不存在对变量的重写。