【发布时间】:2017-05-23 12:39:05
【问题描述】:
我知道,当你重载方法时,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 overloading overriding