小编dro*_*y11的帖子

Java继承和后期绑定,为什么int id具有父类值而不是子类1?

确定输出:

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使用后期绑定?

java inheritance

7
推荐指数
2
解决办法
182
查看次数

getValue()方法有两种覆盖方法。哪一个是正确的?

以下示例的问题是,我已阅读到,如果您覆盖一个函数,则除非更改后代对象,否则无法更改返回类型,在这种情况下,您可以将返回类型从更改为ParentClassChildClass但不是这样在任何一种情况下。在第一个示例中,我们将返回类型从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)

java constructor

0
推荐指数
1
解决办法
759
查看次数

标签 统计

java ×2

constructor ×1

inheritance ×1