2015-03-31 63 views
-1

我有以下代码:差异的这些对象(Java继承)

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

class Az 
{ 

} 

class Bz extends Az 
{ 

} 

现在,我不明白的是为什么它可以从类Az那样创建一个对象。 有什么区别。

这只是一个示例代码,我只是想知道它们之间的区别。

谢谢。

+1

你是什么意思“从Az类创建一个对象”?我建议你阅读关于继承的教程,例如https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html – 2015-03-31 14:39:10

+0

Person p = you; JavaDeveloper p2 = you;两者都指向你。当使用p时,编译器只知道你是一个人,而当使用p2时,编译器知道你是一个Java开发人员。 – 2015-03-31 14:40:14

+0

如果'Bz'是'Dog','Az'是'Animal',那么它就有意义,'Dog'是'Animal' :) – Maroun 2015-03-31 14:41:22

回答

3

看它是否更喜欢这个

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因为CatAnimal(在Java的转换到extends)。

2)您正在创建Cat对象,并且您将公开Animal的所有方法。

不同之处在于,您使用catanotherCat将世界上的两个不同界面暴露在外。

例如,假设你正在编写与饲养动物交易的方法,该签名可能是这样的

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

你只是想要一个Animal,你不在乎,如果它是一个DogCat
一旦你编写了feed的实现,你可能想要说animal.eat,其中eat将是所有Animal的一种方法。

+0

这是一个很容易理解的问题和基本继承的例子! – EA91 2015-03-31 14:45:26

+0

我们非常欢迎你,我希望它是有道理的,我没有犯任何重大错误:D – 2015-03-31 14:56:34

0

这就是你定义的确切关系。 Bz“是一个”阿兹(还有更多)。 就像每个拇指都是手指,但不是每个手指都是拇指。

0

这两个类之间存在“是”的关系。所以Bz“是”Az。这就是为什么你可以通过声明的变量作为它的超类型(Az bz2

0

尝试在其他领域的翻译创建Bznew 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 
{ 

} 

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

+0

我们想出了完全一样的例子:D – 2015-03-31 14:42:13

+0

也许意大利人的爱情猫很多...我真的这样做 – abarisone 2015-03-31 14:43:52

0

父/超类可以看作是子类的泛化。 这用于像这样,例如:

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

    } 
} 
0
Bz bz1 = new Bz(); 

对象BZ1将不支持的运行时间的多态性。

超类中的某些方法的默认实现将不会在子类Bz无法自行执行的情况下执行。

Az bz2 = new Bz(); 

对象BZ2将支持运行时多态性,并能够支持其他它的子类的声明,如果你碰巧产生任何污染。由于它的继承是-A UML关系,所以这样的声明是可能的。

超类中的某些方法的默认实现将在子类Bz不自行创建时执行。

面向对象程序设计的所有多义性方面都将在第二种情况下得到支持,而第一种情况则是独立类。但它会继承父类的属性。