Java持有对象,对象为';s超级级';s型
我有两个班,动物和狗。正如你们所能理解的,狗是从动物延伸而来的。我可以毫无问题地编写这些类,但我注意到我可以创建一个新的dog对象,如下所示:Java持有对象,对象为';s超级级';s型,java,inheritance,Java,Inheritance,我有两个班,动物和狗。正如你们所能理解的,狗是从动物延伸而来的。我可以毫无问题地编写这些类,但我注意到我可以创建一个新的dog对象,如下所示: Dog firstDog = new Dog("rocky"); 没关系,但当我尝试创建新实例时,如下所示: Animal secondDog = new Dog("alex"); 没有任何错误,但我无法访问我在Dog类中编写的任何字段或方法,即使它们是公共的。因此,如果我想在一个变量中保存一个对象,该变量的类型与其超类的类型相同,我可以访问仅实现该
Dog firstDog = new Dog("rocky");
没关系,但当我尝试创建新实例时,如下所示:
Animal secondDog = new Dog("alex");
没有任何错误,但我无法访问我在Dog类中编写的任何字段或方法,即使它们是公共的。因此,如果我想在一个变量中保存一个对象,该变量的类型与其超类的类型相同,我可以访问仅实现该超类的字段和方法(例如名称、颜色、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");
你在告诉JavasecondDog
是一种Animal
,就是这样。允许您将Dog
分配到和Animal
引用中的原因是Dog
是Animal
的子类,因此它是允许的
但是,secondDog
明确表示为动物,只能从Animal
类访问属性和行为
要访问狗的属性和行为
,您需要强制转换它:
((Dog)secondDog).speakDog();
将它投射到狗
就像告诉Java:“嘿,相信我,这个对象是一只狗”
现在只需要更加具体,你就可以访问狗的属性。(如果不是,它仍被视为动物(更高级))
但是,如果您将其强制转换为一个不是Animal
子类的类,您将得到一个ClassCastException
实质上,
- 如果
保持为secondDog
(未被强制转换为Animal
),则它只能从Dog
访问所有非私有字段和方法Animal
- 如果
被铸造为secondDog
,它可以访问Dog
动物的所有继承字段和方法,以及
狗的所有非私有字段和方法
- 投射动物对象以显示它是狗
Dog secondDog = (Dog) new Animal("alex);
看看这个:
Animal a = new Dog();
Dog d = (Dog) a; // no problem, the type animal can be casted to a dog, because its a dog
Cat c = (Dog) a; // raises class cast exception, you cant cast a dog to a cat
仅当它是子类时才强制转换。否,无法通过动物类访问狗的属性。考虑基本对象“对象”,其中许多子类流。 可以说JFrame=newjframe(“”); 或 对象objFrame=新JFrame(“”); 框架将允许您访问JFrame的所有属性 objFrame。???将仅允许您访问对象的属性
我不知道为什么第二只狗应该被创造成动物而不是狗:)可能的复制品;恕我直言;这完全是胡说八道。关键是告诉java编译器secondDog的类型是Animal。动物就是动物;而不是狗。附加的强制转换不会改变任何东西(在此上下文中)。当然,当你知道你的动物是狗时,你可以把它扔给狗;使用狗的方法。但这不是你的代码所做的。是的,我理解。当我没有对狗施法时,我只能访问所有来自动物的非私有字段和方法。但是,如果我在Dog类中重写其中一个方法,我会在主函数中正确地得到被重写的方法?@azuosxela你是对的,如果该方法被重写,你将在子类中调用被重写的方法。例如,如果您执行System.out.println(secondDog);(即使不强制转换),它也会从
Dog
类调用toString()
。