Java 为什么实例化一个 class using 对象?

Java why instantiate a class using object?

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

Object obj=new Animal();

这有什么好处?我知道这是有效的代码,但是这只是您永远不会像考试中的许多代码那样使用的东西之一吗?如果不是,你会在什么时候以及为什么这样做?

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

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

虽然对所有对象使用基础 class 似乎没有用,但更复杂的 class 层次结构可能会更好地证明它。

假设您有更多 Animal 的子class:DogCatHamster。现在假设您还有许多 DogCatHamster 的子class(如果有任何不同种类的仓鼠)。

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 class 公开的接口,并且没有在继承链中添加任何内容。

你也可以有例如一组 5 条狗:

Dog[] dogs = new Dogs[5];

可以放狗的地方,但不能放猫或仓鼠。

你可以有一个动物数组,你可以在其中放置任何动物,但不能放置其他对象,例如号码:

Animal[] animals = new Animals[5];

现在,你为什么要有这样一个数组?例如,如果你的 Animal class 有一个 getName 方法,那么你总是可以 运行:

animals[2].getName();

不管是哪种动物。但是如果 Dog class 有方法 bark()Cat class 没有,那么你将无法 运行:

animals[2].bark();

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

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

证明ObjectAnimal的基础class(父class)。

换句话说,即使你没有写

public class Animal extends Object {
}

编译器在"extends Object"中加入;因为,所有 classes 扩展 Object.

对于 Java 语言中的所有 classes 都是如此,虽然出于教学目的选择的示例不当,但(在某些方面)是马马虎虎的方式测试您是否理解这样的概念。很可能您不会在常规开发中使用此技术。

如果 obj 变量的使用不依赖于它是 Animal,这将很有用。例如,假设您将新对象传递给使用 toString() 打印它的函数。然后 obj 的确切 class 不是 relevant.and 代码说明了这一点。

它基本上是一个动态绑定.. 对象 obj= new Animal();这意味着您正在为动物 class 创建对象,它的地址存储在引用变量 obj.. Object obj 表示只能通过animalclass object....访问objectclass的功能.... 让我们通过这个小程序来理解

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

输出你好