Java中的超类和子类

时间:2015-12-11 14:37:11

标签: java subclass superclass

对你来说,这可能很简单,但我不知道有什么区别。我只是想知道这两个代码之间的区别。假设我有一些如下所述的代码。

第一类是Animal,它将是超类

public class Animal {

    private String name;
    private int weight;
    private String sound;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setWeight(int weight){
        if(weight > 0){
            this.weight = weight;
        } else {
            System.out.println("Weight must be bigger than 0");
        }
    }

    public int getWeight(){
        return weight;
    }

    public void setSound(String sound){
        this.sound = sound;
    }

    public String getSound(){
        return sound;
    }
}

第二类是Dog,它扩展了Animal类

public class Dog extends Animal {

    public void digHole(){
        System.out.println("Dig a hole");
    }

    public Dog(){
        super();

        setSound("bark");
    }
}

最后一个类是WorkWithAnimals,它将打印输出

public class WorkWithAnimals {

    public static void main(String args[]){

        Dog fido = new Dog();

        fido.setName("Dadu");
        System.out.println(fido.getName());

        fido.digHole();
        fido.setWeight(-1);
    }
}

我的问题是,Animal fido = new Dog()和Dog fido = new Dog()有什么区别?

由于Dog已经扩展了Animal,为什么我们必须编写像Animal fido = new Dog()这样的代码?

他们两个都打印出相同的结果,不是吗?

6 个答案:

答案 0 :(得分:1)

Animal fido = new Dog()

Dog fido = new Dog()

两者都指的是同一个物体,狗。 OOP允许您创建引用其子级的变量类型的超类。这是abstraction的目的。如果你不知道这意味着什么,你应该找一本java书并阅读它。

答案 1 :(得分:1)

想象一下:

secondString

strcpy(concatString,uppercaseFirstString); strcat(concatString,uppercasesecString); 作为参数类型,我可以传递public void sleep(Animal a){ a.sleep(); } Animal或任何扩展Cat的内容。

但如果我写了这个:

Dog

现在我被限制在Animal类型

同样在第一种情况下,我不必了解public void sleep(Dog d){ d.sleep(); } 的各种子类如何实现Dog

答案 2 :(得分:0)

如果您像这样定义实例fido

 Animal fido = new Dog()

然后,您可以fido调用Animal上定义的所有方法。但是,如果不进行强制转换,则无法进行此类调用:

fido.digHole(); // this will not compile
((Dog)fido).digHole(); // this will work

答案 3 :(得分:0)

“Animal”类不包含digHole,因此您应该得到编译时错误;因此:

Animal fido = new Dog();
fido.dighole(); //<--compile time error

而,

Dog fido = new Dog();
fido.dighole(); 

会好的。

答案 4 :(得分:0)

差异与您将来如何使用这些实例有关。例如:如果要将元素添加到集合中,您很可能会使用泛型来避免类型转换。

或者对于更复杂的用途,寻找GoF设计模式(特别是策略)以及为什么使用接口(在这种情况下是超类)改进代码设计以提高可读性和灵活性。

答案 5 :(得分:0)

这是OOP的基础,可以把这个例子当作现实生活中我们有动物案例代表动物类我们有一只狗,狗是动物,具有一般动物的所有属性,如一只猴子或袋鼠,但是这三只动物各自都有自己的做事方式,就像只有其中一只做过的东西一样!