确定输出:
public class Test1{
public static void main(String args[]){
ChildClass c = new ChildClass();
c.print();
}
}
class ParentClass{
int id = 1;
void print(){
System.out.println(id);
}
}
class ChildClass extends ParentClass{
int id = 2;
}
Run Code Online (Sandbox Code Playgroud)
我知道答案是1,我猜这是因为因为打印函数没有被覆盖ChildClass,所以它具有与它相同的定义ParentClass.为什么ID不是子类中给出的ID,因为Java使用后期绑定?
以下示例的问题是,我已阅读到,如果您覆盖一个函数,则除非更改后代对象,否则无法更改返回类型,在这种情况下,您可以将返回类型从更改为ParentClass,ChildClass但不是这样在任何一种情况下。在第一个示例中,我们将返回类型从String更改为Object,在第二个示例中将其从Object更改为String,这两个都不是类A或B。也许是这样的情况,您可以在任何覆盖的函数中返回更具体的类型?
我:这绝对是错误的,因为在覆盖时您将返回一个更通用的类型。
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getValue());
}
}
class B {
public String getValue() {
return "Any object";
}
}
class A extends B {
public Object getValue() {
return "A string";
}
}
Run Code Online (Sandbox Code Playgroud)
II:这一定是正确的,但是我不明白,因为我认为您只能覆盖从将B类中的B类型返回到A类中的A类型。那是唯一的例外,在Java的早期版本中,即使那样不允许,所以我看不到如何将Object更改为String。
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getValue());
}
}
class B {
public Object getValue() {
return "Any object";
} …Run Code Online (Sandbox Code Playgroud)