这些与对象的区别(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
对象,并且您将公开 Cat
和 Animal
中的所有方法,因为 Cat
是 Animal
(在 Java 中翻译为 extends
)。
在 2) 中,您正在创建一个 Cat
对象,您将公开 Animal
.
中的所有方法
不同之处在于您使用 cat
和 anotherCat
向世界公开了两个不同的界面。
例如,假设您正在编写一个处理喂养动物的方法,签名可能类似于
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 属性。
我有以下代码:
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
对象,并且您将公开 Cat
和 Animal
中的所有方法,因为 Cat
是 Animal
(在 Java 中翻译为 extends
)。
在 2) 中,您正在创建一个 Cat
对象,您将公开 Animal
.
不同之处在于您使用 cat
和 anotherCat
向世界公开了两个不同的界面。
例如,假设您正在编写一个处理喂养动物的方法,签名可能类似于
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 属性。