Наследование Java и приведение объектов - PullRequest
7 голосов
/ 12 апреля 2010

Я довольно новичок в программировании, у меня есть вопрос, пожалуйста, помогите мне. (этот вопрос - вопрос 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 ]

12 голосов
/ 12 апреля 2010

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!
9 голосов
/ 12 апреля 2010

p является Student и Person, но если вы вызываете метод (например, whoAreYou()), Java сначала попытается найти его в Student, а затем в Person.

7 голосов
/ 12 апреля 2010

«Я студент»?

Это называется Динамическое связывание

5 голосов
/ 12 апреля 2010

Я думаю, я знаю, что вы имеете в виду ...

р сказал бы, что он студент, потому что вы переопределите метод, в котором говорит человек. В 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 голосов
/ 12 апреля 2010
"i am a student" 

Это polymorphism Java в действии. Метод speaks() определен в base классе Person и overridden в derived классе Student.

В Java базовый класс reference может ссылаться на объект производного класса, и когда для такой ссылки вызывается переопределенный метод, type объекта, на который ссылается ссылка, определяет версию метода быть выполненным.

2 голосов
/ 16 сентября 2015

Выше вопрос, полностью принадлежащий механизму наследования одного и того же свойства, используемого разными сущностями.

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();
    }
}
2 голосов
/ 18 сентября 2013

P скажет студент. Поскольку объект Student преобразуется в объект Person.

2 голосов
/ 12 апреля 2010

Даже если ваша ссылка на p объявлена ​​как Person, p на самом деле является экземпляром Student. Поэтому p будет «говорить», что бы ни говорил студент.

Допустимо ссылаться на экземпляр Student как "Person", поскольку "ученик расширяется от личности".

0 голосов
/ 07 февраля 2016

В Java, когда ученик расширяется от человека, вы можете решить, какое поведение ученик вызывает у человека. Вы можете ограничить ученика, чтобы сказать, что это человек, вы можете реализовать его как статический, тогда статические методы не будут переопределены. они просто тень. Если вы намеренно хотите использовать метод экземпляра, тогда вы реализуете его специфическое поведение.

0 голосов
/ 03 февраля 2016

Здесь P - Объект родительского класса, который содержит объект дочернего класса. это связано с тем, что здесь существуют отношения между родителями и детьми (посредством наследования), поскольку вы расширяете класс Parent в класс Student. Таким образом, родительский класс Object может содержать объекты всех своих дочерних классов. Теперь P может получить доступ ко всем свойствам своего дочернего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...