英文:
How to get the reference class of an subclass object
问题
以下是翻译好的内容:
我正在学习多态性,但似乎无法解决这个问题。我找不到正确的方法来检查我的对象是作为超类还是子类引用。基本上,我想利用一个方法来执行某些操作,取决于引用类,而不是对象类。在这个示例中,我在if条件中使用了 "instanceof",但这当然是错误的,因为两者都将列为Animal...
主类:
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Animal dog1 = new Dog();
Dog dog2 = new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
for (Animal animal : animalList) {
if (animal instanceof Animal) {
animal.talk();
} else if (animal instanceof Dog) {
animal.talk();
((Dog) animal).walk();
}
}
}
}
Animal类:
public class Animal {
public void talk() {
System.out.println("你好,我是一只动物");
}
}
Dog类:
public class Dog extends Animal {
public void walk() {
System.out.println("狗可以走路");
}
}
英文:
I am getting into polymorphism but I can't seem to solve this issue. I can't seem to find the correct way of checking whether my object is referenced as the superclass or a subclass. Basically I want to utilize a method to do certain things, depending on the reference class, and NOT the object class. In this example I used "instanceof" in the if condition, but that is wrong of course since both will be listed as Animal...
Main class:
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Animal dog1 = new Dog();
Dog dog2=new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
for (Animal animal:animalList) {
if (animal instanceof Animal){
animal.talk();
}
else if(animal instanceof Dog){
animal.talk();
((Dog)animal).walk();
}
}
}
}
Animal class:
public class Animal {
public void talk(){
System.out.println("Hello I'm an animal");
}
}
Dog class:
public class Dog extends Animal{
public void walk(){
System.out.println("Dogs can walk");
}
}
答案1
得分: 0
我会尝试类似这样的代码:
Animal animal1 = new Animal();
Animal animal2 = new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(animal1);
animalList.add(animal2);
for (Animal animal : animalList) {
animal.talk();
if (animal instanceof Dog) {
((Dog)animal).walk();
}
}
英文:
I would try something like this:
Animal animal1 = new Animal();
Animal animal2 = new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(animal1);
animalList.add(animal2);
for (Animal animal : animalList) {
animal.talk();
if(animal instanceof Dog){
((Dog)animal).walk();
}
}
答案2
得分: 0
不确定它是否有帮助。
在Java中,您可以使用不同的参数定义相同的方法。每个对狗对象的引用将被传递给 do(Dog dog)
方法。对其他动物使用 do(Animal animal)
。
但这仍然是基于对象类型,而不是引用。在您的逻辑中,所有引用都应该是 Animal,因为您正在遍历一个 Animal 列表。
在 for 循环中,不再与 dog1 变量有关。
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Animal dog1 = new Dog();
Dog dog2 = new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
for (Animal animal : animalList) {
do(animal);
}
}
public static void do(Animal animal) {
animal.talk();
}
public static void do(Dog dog) {
dog.talk();
dog.walk();
}
}
英文:
Not sure it can help.
In java you can define the same method with different parameters. Every reference to a dog object will be passed to the do(Dog dog)
method. Every other animal to do(Animal animal)
But this is still based on the object type, not the reference. In your logic all references should be Animal as you are walking through a list of Animal.
Within the for loop there is no link to the dog1 variable anymore.
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Animal dog1 = new Dog();
Dog dog2=new Dog();
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
for (Animal animal:animalList) {
do(animal);
}
}
public static void do(Animal animal) {
animal.talk();
}
public static void do(Dog dog) {
dog.talk();
dog.walk();
}
}
答案3
得分: 0
Here's the translated code portion:
如果每只 `Dog` 每次说话都会走路,那么 `Dog` 应该变成:
public class Dog extends Animal {
@Override
public void talk(){
super.talk();
walk();
}
public void walk() {
System.out.println("狗可以走路");
}
}
然后你的 `main` 应该变成:
public class Main {
public static void main(String[] args) {
Animal dog1 = new Dog();
Dog dog2 = new Dog();
Animal plain = new Animal(); // 添加一个新的普通动物用于测试。
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
animalList.add(plain);
for (final Animal animal: animalList)
animal.talk();
}
}
至于你的代码问题是每个 Animal
引用都指向一个 Animal
实例(或任何继承它的类)或 null
。你可以通过改变 if
条件的顺序来修复它,如下所示:
for (Animal animal: animalList) {
if (animal instanceof Dog) {
animal.talk();
((Dog)animal).walk();
}
else
animal.talk();
}
对应于:
for (Animal animal: animalList) {
animal.talk();
if (animal instanceof Dog)
((Dog)animal).walk();
}
英文:
If every Dog
walks every time it talks, then Dog
should become:
public class Dog extends Animal {
@Override
public void talk(){
super.talk();
walk();
}
public void walk() {
System.out.println("Dogs can walk");
}
}
and your main
should then become like:
public class Main {
public static void main(String[] args) {
Animal dog1 = new Dog();
Dog dog2 = new Dog();
Animal plain = new Animal(); //Added a new plain Animal for testing.
List<Animal> animalList = new ArrayList<>();
animalList.add(dog1);
animalList.add(dog2);
animalList.add(plain);
for (final Animal animal: animalList)
animal.talk();
}
}
As for your code, the problem is than every Animal
reference points to either an Animal
instance (or any class which extends it), or null
. You could fix it by changing the order of the if
conditions like so:
for (Animal animal: animalList) {
if (animal instanceof Dog) {
animal.talk();
((Dog)animal).walk();
}
else
animal.talk();
}
which corresponds to:
for (Animal animal: animalList) {
animal.talk();
if (animal instanceof Dog)
((Dog)animal).walk();
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论