Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java继承和对象转换_Java_Inheritance - Fatal编程技术网

Java继承和对象转换

Java继承和对象转换,java,inheritance,Java,Inheritance,我是编程新手,我有一个问题,请帮助我。(这个问题是java问题,但我不记得语法,但我在这里写的主要是它。) 那么p在说什么?“我是一名学生” 这被称为p既是一个学生又是一个人,但是如果你调用一个方法(比如whoAreYou()),Java将首先尝试在学生中找到它,然后在人中找到它,即使你对p的引用被声明为人,p实际上是Student的一个实例。因此,p会“说”学生说的任何话 将学生实例称为“人”是合法的,因为“学生是从人扩展而来的”我猜我是学生“。这是。我想我知道你的意思 p会说他是一个学生,因

我是编程新手,我有一个问题,请帮助我。(这个问题是java问题,但我不记得语法,但我在这里写的主要是它。)

那么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
class
Person
中定义,并在
derived
class
Student
中被
覆盖


在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();
    }
}