我目前正在修改Java se7认证,任何完成这些考试的人都知道他们使用的一些代码示例是多么荒谬。故意编写难以理解的代码。 最近我看到很多代码写得像这样:
Object obj=new Animal();
这提供了什么好处?我知道这是有效的代码,但这只是你在考试中不会使用大量代码的其中一项吗?如果不是何时以及为什么要这样做?
答案 0 :(得分:5)
它表明Object
是Animal
的基类(父类)。
换句话说,即使你没有写
public class Animal extends Object {
}
编译器添加在" extends Object&#34 ;;因为,所有类都扩展Object
。
对于Java语言中的所有类都是如此,虽然为教学目的选择的示例很差,但如果您理解这样的概念,它(在某些方面)是一种通用的测试方式。可能的情况是你不会在常规开发中使用这种技术。
答案 1 :(得分:2)
这不是没用的东西。它表明Java类型系统允许您将任何对象存储在Object
类型的变量中,而不仅仅是使用new Object()
直接实例化的对象,这是最简单的示例,可以演示它。
每个对象都是Object
类的子类。它演示了当您将变量的类型声明为某种类型时,您不仅可以在那里放置那个确切类型(在您的示例中为Object
),还可以放置任何子类型(示例中为Animal
)
虽然对所有对象使用基类可能看起来不太有用,但更复杂的类层次结构可能会更好地证明它。
我们假设您有更多Animal
的子类:Dog
,Cat
,Hamster
。现在让我们说你还有许多Dog
,Cat
和Hamster
的子类(如果有任何不同类型的仓鼠)。
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
的确切类别不相关。代码说明了这一点。