Java继承和对象转换
我是编程新手,我有一个问题,请帮助我。(这个问题是java问题,但我不记得语法,但我在这里写的主要是它。) 那么p在说什么?“我是一名学生”Java继承和对象转换,java,inheritance,Java,Inheritance,我是编程新手,我有一个问题,请帮助我。(这个问题是java问题,但我不记得语法,但我在这里写的主要是它。) 那么p在说什么?“我是一名学生” 这被称为p既是一个学生又是一个人,但是如果你调用一个方法(比如whoAreYou()),Java将首先尝试在学生中找到它,然后在人中找到它,即使你对p的引用被声明为人,p实际上是Student的一个实例。因此,p会“说”学生说的任何话 将学生实例称为“人”是合法的,因为“学生是从人扩展而来的”我猜我是学生“。这是。我想我知道你的意思 p会说他是一个学生,因
这被称为
p
既是一个学生
又是一个人
,但是如果你调用一个方法(比如whoAreYou()
),Java将首先尝试在学生
中找到它,然后在人中找到它,即使你对p
的引用被声明为人
,p
实际上是Student
的一个实例。因此,p
会“说”学生说的任何话
将学生
实例称为“人
”是合法的,因为“学生是从人扩展而来的”我猜我是学生“
。这是。我想我知道你的意思
p会说他是一个学生,因为你会覆盖这个人说话的方法。在Java中,它应该如下所示:
class Person
{
public void speak()
{
System.out.println("I'm a person!");
}
}
class Student extends Person
{
@Override
public void speak()
{
System.out.println("I'm a student");
}
}
如果方法不是静态的,那么学生的方法将被调用。只要小心,如果speak方法是静态的,那么将调用Person的方法。这叫做隐藏
"i am a student"
这就是Java的多态性
。方法speaks()
在base
classPerson
中定义,并在derived
classStudent
中被覆盖
在Java中,基类引用
可以引用派生类对象,当对此类引用调用重写的方法时,引用引用的对象的类型决定要执行的方法的版本 p
只是变量,它不会更改其中对象的类型
你可以想象一个杯子:你可以在里面放任何液体,但是杯子不会改变液体的类型
abstract class Fluid{
public String getTemp(){
return "unknown";
}
}
class Coffee extends Fluid{
public String getTemp(){
return "hot";
}
}
class Cola extends Fluid{
public String getTemp(){
return "ice-cold"
}
}
Fluid cup = new Coffee();
System.out.println(cup.getTemp()); //It's coffe in there, so it's hot!
p会说学生。因为Student对象被强制转换为Person对象。这是java中单一继承的一个示例。在这个示例中,“Person”是一个基类,其中as“Student”是一个派生类。除非指定了任何内容
Person p=new Student();
对象p(看起来像人的对象)将访问已覆盖其基类Person属性的Student类的属性。这里它显示了多态性的概念,如超级类可以容纳子类的引用,同时它还显示了继承的概念,如Student是Person意味着Student扩展了Person类。所以这里的人是一个超级班,学生是一个儿童班。根据多态性,人类(超类)可以持有学生类(子类)的引用。上述问题完全属于继承机制,不同实体使用相同的属性
class Person {
String identity;
Person() {
this.identity = "Person";
System.out.println("A class " + this.getClass().getName()
+ " speaks i am a " + identity);
}
}
public class Student extends Person {
public Student() {
this.identity = "Student";
System.out.println("A class " + this.getClass().getName()
+ " speaks i am a " + identity);
}
public static void main(String[] args) {
Person p = new Student();
}
}
p将发言:我是学生
但它只会有两类人的共同行为。如果学生有任何行为,但不是面对面,P将无法访问该行为 这里的Person“p”是一个引用,用student对象初始化。因此,当程序开始执行时,将在运行时调用Student的class函数。这里p是保存子类对象的父类对象。这是因为父类和子类关系(通过继承)的存在是因为您正在将父类扩展到学生类中。因此父类对象可以保存其所有子类的对象。现在P可以访问其子类的所有属性。在Java中,当Student从Person扩展时,您可以决定Student从Person调用什么样的行为,您可以限制Student说,如果它是Person,您可以将其实现为静态,那么静态方法不会被重写。它们只是影子。如果您有意想要实例方法,那么就实现它的特定行为。
有动态方法分派/动态绑定。
人员p=新学生()
p是一个引用变量,即调用Student对象的Person类型。Student是子类,Person是扩展的父类。两个类的方法是静态的还是非静态的。这里p将说明我是学生。这是一个动态绑定的示例。这实际上取决于“speaks”是否定义为静态
。。。但在这个问题上,我猜不是这样的。“一个X类说话……”似乎暗示着一个静态方法;这肯定比“X类型的对象说话…”更令人怀疑。如果它是一个static
方法,那么p
将说出它声明的类型,“我是一个人”
。Java没有动态绑定。这只是动态调度。具体来说,Java中的所有方法都相当于C++/C#的虚拟方法。也。。。天哪,独角兽!很好的观点…是的,我们已经变得很少见了。只有5个用户的用户名中有“unicorn”(但你是其中唯一一个有unicorn头像的人;)我打赌还有更多的用户有unicorn头像,但没有unicorn名称(像我;)。对于Java初学者来说,这是一个很好的例子(而且,因为没有使用“abstract”+1),现在P将说我是学生。
class Person {
String identity;
Person() {
this.identity = "Person";
System.out.println("A class " + this.getClass().getName()
+ " speaks i am a " + identity);
}
}
public class Student extends Person {
public Student() {
this.identity = "Student";
System.out.println("A class " + this.getClass().getName()
+ " speaks i am a " + identity);
}
public static void main(String[] args) {
Person p = new Student();
}
}