Java为什么要使用对象实例化一个类?

时间:2016-06-27 12:57:11

标签: java java-7

我目前正在修改Java se7认证,任何完成这些考试的人都知道他们使用的一些代码示例是多么荒谬。故意编写难以理解的代码。 最近我看到很多代码写得像这样:

Object obj=new Animal();

这提供了什么好处?我知道这是有效的代码,但这只是你在考试中不会使用大量代码的其中一项吗?如果不是何时以及为什么要这样做?

4 个答案:

答案 0 :(得分:5)

它表明ObjectAnimal的基类(父类)。

换句话说,即使你没有写

public class Animal extends Object {
}

编译器添加在" extends Object&#34 ;;因为,所有类都扩展Object

对于Java语言中的所有类都是如此,虽然为教学目的选择的示例很差,但如果您理解这样的概念,它(在某些方面)是一种通用的测试方式。可能的情况是你不会在常规开发中使用这种技术。

答案 1 :(得分:2)

这不是没用的东西。它表明Java类型系统允许您将任何对象存储在Object类型的变量中,而不仅仅是使用new Object()直接实例化的对象,这是最简单的示例,可以演示它。

每个对象都是Object类的子类。它演示了当您将变量的类型声明为某种类型时,您不仅可以在那里放置那个确切类型(在您的示例中为Object),还可以放置任何子类型(示例中为Animal

虽然对所有对象使用基类可能看起来不太有用,但更复杂的类层次结构可能会更好地证明它。

我们假设您有更多Animal的子类:DogCatHamster。现在让我们说你还有许多DogCatHamster的子类(如果有任何不同类型的仓鼠)。

public class Animal { // implicitly extends Object
    // ...
}
public class Dog extends Animal {
    // ...
}
public class Cat extends Animal {
    // ...
}
public class Hamster extends Animal {
    // ...
}
public class Hamster extends Animal {
    // ...
}
Labrador extends Dog {
    // ...
}
// etc.

现在,如果你想在变量中加Animal,你可以写:

Animal animal = new Cat();

或:

Animal animal = new Labrador();

现在,您问题的确切代码:

Object obj = new Animal();

可以通过几种不同的方式使用:

如果您想确保使用Object类公开的接口,并且以后在继承链中没有添加任何内容。

你也可以有例如一排5只狗:

Dog[] dogs = new Dogs[5];

你可以放狗,但不能放猫或仓鼠。

你可以拥有一系列可以放置任何动物的动物,但不能放置其他物体,例如:数:

Animal[] animals = new Animals[5];

现在,为什么你会有这样的阵列?例如,如果您的Animal类具有getName方法,那么您始终可以运行:

animals[2].getName();

无论哪种动物在那里。但是,如果Dog类有方法bark()Cat类没有,那么您将无法运行:

animals[2].bark();

(并非没有显式转换)即使Dog实例确实存储在该索引下的动物中,因为编译器在运行期间不知道该数组中的内容 - 它可以保证在那里会有一些动物,所以你只能称那些肯定会出现在所有动物身上的方法。

这可能听起来很傻,但你会发现它确实在很多地方使用过。例如,在GUI编程中,您可以使用滚动面板,您可以在其中放置任何组件,如按钮或文本字段,但根本不能放置任何对象,这完全由该机制保证 - 例如JPanel对象具有方法add()采用类Component的组件但不必使用new Component()创建,但可以是例如JLabel或其他JPanel

答案 2 :(得分:1)

它基本上是一个动态绑定.. Object obj = new Animal();它意味着您正在为动物类创建对象,并且其地址存储在引用变量obj中。 Object obj意味着你只能通过动物类对象访问对象类的功能.... 让我们通过这个了解一个小程序

class Object
{
    void fun()
    {
        System.out.println("hello");
    }
}

class Animal extends Object
{
    void fun1()
    {
        System.out.println("hi");
    }

    public static void main(String args[])
    {
        Object obj = new Animal();
        obj.fun();
    }
}

输出问候

答案 3 :(得分:0)

如果obj变量的使用不依赖于Animal,则此功能非常有用。例如,假设您将新对象传递给使用toString()打印它的函数。然后,obj的确切类别不相关。代码说明了这一点。