我知道当你重载方法时,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
获取方法。