Объявите класс в Java - PullRequest
       1

Объявите класс в Java

0 голосов
/ 08 февраля 2019

Я новичок.У меня есть проблема о классе в Java.Таким образом, у меня есть два класса Father и класс Son расширяет класс Father

class Father
{
   Father(){};
   public void SayHi()
   {
       System.out.println("Hello world");
   }
}
class Son extends Father
{
   Son(){}
   public void SayHiToo()
   {
       System.out.println("Hello world, too!");
   }

}
class DO
{
    public static void  main(String[] args)
    {
          Father c1 = new Father();     //(1)
          Son c2 = new Son();           //(2)
          Father c3 = new Son();        //(3)
    }
}

Мой вопрос касается: я знаю, что (1), (2) означает, что c1 может использовать только функции в классе Father, а c2 может использовать функциив классе Сын и Отец Но если я объявлю с3, как это, что это значит?Большое спасибо

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

Ссылка на Отца всегда может относиться к экземпляру Сына, потому что Сын - это Отец.Что делает возможной ссылку этого супертипа на экземпляр подтипа, так это то, что подтип гарантированно сможет делать все, что может делать супертип.Независимо от того, переписывает ли экземпляр Сына унаследованные методы Отца или просто наследует их, любой, у кого есть ссылка Отца на экземпляр Сына, может свободно вызывать все доступные методы Отца.По этой причине переопределяющий метод должен выполнять контракт суперкласса.

0 голосов
/ 08 февраля 2019

Это станет намного понятнее, если вы дадите своим классам более подходящие имена.

Важно помнить следующее: наследование означает специализация : подкласс - это особый вид его суперкласса.

Теперь вы понимаете, почему class Father и class Son extends Father действительно неправильны: a Son равен , а не a (особый вид) Father.

Вместо Father и Son, давайте использовать Animal и Cat:

class Animal {
    public void makeSound() {
        System.out.println("Beep!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miaow!");
    }
}

Теперь легче понять, что они означают:

Animal c1 = new Animal(); // 1
Cat c2 = new Cat();       // 2
Animal c3 = new Cat();    // 3

Cat c4 = new Animal();    // 4 WRONG!

A Cat является Animal, поэтому в (3) разрешено присваивать объект Cat переменной типа Animal - Cat, гарантированно иметь всеметоды, доступные на Animal.Итак, любой метод, который вы могли бы вызвать c3, существует в объекте, к которому относится c3.

С другой стороны, присваивая Animal переменной типа Cat, как в (4), недопустимо, поскольку у класса Cat могут быть дополнительные методы, которые нельзя вызвать для объекта Animal.Если (4) разрешено, вы можете попытаться вызвать эти методы, что не должно быть возможно.

0 голосов
/ 08 февраля 2019

С Father c3 = new Son();, c3 может использовать только методы Father, но, поскольку это Son, вы можете использовать его как Son, чтобы использовать также Son's метод

Father c3 = new Son();
c3.SayHi();
Son sc3 = (Son) c3;
sc3.SayHiToo();

Но будьте осторожны с вашей моделью: Son это тип Father?№

Например:

  • a Car является Vehicule
  • a Smartphone является Phone
0 голосов
/ 08 февраля 2019

Это похоже на создание экземпляра Сына, который будет вести себя как Отец!

Я бы посоветовал вам прочитать о полиморфизме Java.

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