这些与对象的区别(Java 继承)

Difference of these to objects(Java Inheritance)

我有以下代码:

class ExampleClass
{
    public static void main(String[] args)
    {
        Bz bz1 = new Bz();
        Az bz2 = new Bz(); // Perfectly possible.
    }
}

class Az
{

}

class Bz extends Az
{

}

现在,我不明白的是为什么可以从 class Az 这样创建一个对象。 又有什么区别呢

这只是一个示例代码,我只想知道有什么区别。

谢谢。

这就是您使用 extends 定义的确切关系。 Bz "is a" Az(以及更多)。 就像每个拇指都是手指,但不是每个手指都是拇指。

两者之间存在"is a"关系类。所以Bz"is a"Az。这就是为什么您可以通过将变量声明为其超类类型 (Az bz2)

来创建 Bz (new Bz()) 的实例

尝试在另一个领域翻译:

    class ExampleClass
{
    public static void main(String[] args)
    {
        Cat bz1 = new Cat();
        Animal bz2 = new Cat(); // Perfectly possible.
    }
}

class Animal
{

}

class Cat extends Animal
{

}

猫是猫,也是动物。这就是子类继承的简单概念。

看看这样写是不是更有意义

class Cat
{
    public static void main(String[] args)
    {
        // 1)
        Cat cat = new Cat();
        // 2)
        Animal anotherCat = new Cat(); // Perfectly possible.
    }
}

class Animal {}

class Cat extends Animal {}

在 1) 中,您正在创建一个 Cat 对象,并且您将公开 CatAnimal 中的所有方法,因为 CatAnimal(在 Java 中翻译为 extends)。

在 2) 中,您正在创建一个 Cat 对象,您将公开 Animal.

中的所有方法

不同之处在于您使用 catanotherCat 向世界公开了两个不同的界面。

例如,假设您正在编写一个处理喂养动物的方法,签名可能类似于

public void abstract feed(Animal animal, Food food);

你只想要一个 Animal,你不关心它是 Dog 还是 Cat
一旦你编写了 feed 的实现,你可能想说 animal.eat,其中 eat 将是所有 Animal 上的一个方法。

parent/superclass可以看作是子class的泛化。 例如这样使用:

class Person
{
    public void talk()
    {
        System.out.println("I am a Person");
    }
}

class Student extends Person
{
    @Override
    public void talk()
    {
        System.out.println("I am a Student (also a Person)");
    }
}

class Test()
{
    public static void main(String[] args)
    {
        List<Person> people = new ArrayList<Person>();
        people.add(new Person());
        people.add(new Student());  //ok, because a student IS also a person

        //Will call the "right" methode, we only care about people and not the student details.
        for(Person person : people)
           person.talk();

    }
}
Bz bz1 = new Bz();

object bz1 将不支持 运行 时间多态性。

如果 child class Bz 没有创建自己的方法,superclass 中某些方法的默认实现将不会执行。

 Az bz2 = new Bz();

object bz2 将支持 运行 时间多态性,并且能够支持它的其他子class 声明(如果您碰巧创建了任何子声明)。因为它是一个继承 is-A UML 关系所以这样的声明是可能的。

superclass 中的某些方法的默认实现将在 child class Bz 没有自己创建的情况下执行。

第二种情况将支持面向 Object 的编程的所有多态性方面,而第一种情况将是独立的 class。但是它将继承 parent class 属性。