gpt4 book ai didi

Java 用对象的父类(super class)类型保存对象

转载 作者:行者123 更新时间:2023-12-02 09:40:25 25 4
gpt4 key购买 nike

我有两个类“动物”和“狗”。正如你可以质疑的那样,狗是从动物延伸而来的。我可以毫无问题地编写这些类,但我注意到我可以创建一个新的狗对象,如下所示:

Dog firstDog = new Dog("rocky");

没关系,但是当我尝试创建这样的新实例时:

Animal secondDog = new Dog("alex");

没有任何错误,但我无法访问我在 Dog 类中编写的任何字段或方法,即使它们是公共(public)的,因此如果我想在类型与其父类(super class)类型相同的变量中保存对象,我可以到达仅实现该父类(super class)的字段和方法(对于本示例名称、颜色、setColor() 和 toString()),并且没有任何方法可以到达在子类中实现的字段和方法。当我尝试调用 SecondDog 的 toString() 函数时,我是否理解正确,它调用我在 Dog 类中编写的方法,我知道我在 Dog 类中重写了此函数,但我无法访问我在 Dog 类中实现的其他方法。 java如何处理这些?

动物类别:

public class Animal {
private String name;
private String color;

public Animal(String name){
this.name=name;
}

public void setColor(String color){
this.color=color;
}

public String toString(){
return"Hi, my name is " + this.name + ". I'm " + this.color;
}
}

狗类:

public class Dog extends Animal {
private int age;
public Dog(String name){
super(name);
setColor("gray");
this.age = 7;
}
public String speakDog(){
return"wof!";
}
public String toString(){
return super.toString() + " and I " + speakDog();
}
}

最佳答案

当你写下这个:

Animal secondDog = new Dog("alex");

您告诉 Java secondDog 是一个 Animal,就是这样。允许您将 Dog 分配给 Animal 引用的原因是因为 DogAnimal 的子类,因此这是允许的。

但是,secondDog 明确是一个 Animal 将只能访问 Animal 类中的属性和行为。

要访问 Dog 的属性和行为,您需要对其进行强制转换:

((Dog)secondDog).speakDog();

将其转换为 Dog 就像告诉 Java:“嘿,相信我。这个对象是一只 Dog”。

现在只要更具体一点,您就可以访问狗的属性。 (如果不是,它仍然被视为动物(更高级别))。

但是,如果将其转换为不是 Animal 子类的类,则会收到 ClassCastException

<小时/>

本质上,

  • 如果 secondDog 保留为 Animal(未转换为 Dog),则它只能访问所有非私有(private)字段和方法来自动物

  • 如果secondDog被转换为Dog,它可以访问从Animal继承的所有字段和方法加上来自 Dog 的所有非私有(private)字段和方法。

关于Java 用对象的父类(super class)类型保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com