Java继承和对象转换

时间:2010-04-12 13:08:19

标签: java inheritance

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

A class Person speaks "i am a person"
A class Student speaks "i am a student"
Student extends from Person
Person p = new Student
那么什么是p呢?

18 个答案:

答案 0 :(得分:12)

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!

答案 1 :(得分:9)

p既是Student又是Person,但如果您调用方法(如whoAreYou()),Java会首先尝试在Student中找到它}然后在Person

答案 2 :(得分:7)

“我是学生”?

这称为Dynamic Binding

答案 3 :(得分:5)

我想我知道你的意思......

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");
    }

}

答案 4 :(得分:4)

"i am a student" 

这是Java的polymorphism。方法speaks()basePerson中定义,在overriddenderived中为Student

在Java中,基类reference可以引用派生类对象,并且当在这样的引用上调用重写方法时,引用引用的对象的type决定要执行的方法的版本。

答案 5 :(得分:2)

即使您对p的引用被声明为Personp实际上也是Student的实例。因此,无论学生说什么,p都会“说话”。

将“Student实例称为”Person“是合法的,因为”学生从人员延伸“。

答案 6 :(得分:2)

P会说学生。因为Student对象被转换为Person对象。

答案 7 :(得分:2)

以上问题完全属于继承机制不同实体使用的相同属性。

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

答案 8 :(得分:0)

这里p会说我是学生。这是动态绑定的一个例子。

答案 9 :(得分:0)

有动态方法调度/动态绑定。 人p =新学生();
p是一个引用于Student对象的Person类型的引用变量.Student是子类,Person是扩展的父类。两个类都有静态或不静态的方法。

答案 10 :(得分:0)

在Java中,当学生从Person扩展时,您可以决定学生从人那里调用什么样的行为,您可以限制学生说是否是人,您可以将其实现为静态,然后静态方法不会被覆盖。他们只是影子。如果您故意想要实例方法,那么您可以实现其特定行为。

答案 11 :(得分:0)

这里P是持有子类对象的Parent类Object。这是因为这里存在父子关系(通过继承),因为您将Parent类扩展到Student类中。因此,Parent类Object可以保存其所有子类的对象。现在P可以访问其子类的所有属性。

答案 12 :(得分:0)

人“P”是这里用学生的对象初始化的参考。因此,当程序的执行开始时,将在运行时调用Student的类函数。

答案 13 :(得分:0)

P会说话:我是学生。

但它只会有两个类的共同行为。学生有但不在人的任何行为,P将无法访问该行为。

答案 14 :(得分:0)

这里显示了像超类这样的多态的概念可以保存子类的引用,同时它也显示了继承的概念,如学生是一个人意味着类学生扩展了人。所以这里的人是超级班,学生是儿童班。根据多态性,Person Class(Super Class)可以保存Student类(Sub-Class)的引用。

答案 15 :(得分:0)

这是java中单继承的一个例子。在这个例子中," Person"是一个基础类,其中"学生"是派生类。除非指定任何内容,

Person p=new Student();

object p(看起来像Person的对象)将访问Student类的属性,该属性覆盖了自己的基类Person的属性。

答案 16 :(得分:0)

如果该方法不是静态的,则将像其他人提到的那样调用Student的方法。请注意,如果方法是静态的,那么将调用Person的方法。这称为隐藏。

答案 17 :(得分:0)

我猜是"i am a student"。这是basic polymorphism