为什么在实例化对象时需要列出两种对象类型?

bob*_*bob 5 java object

如果我将JungleCat作为Cat的子类(JungleCat 扩展 Cat),那么我说:

JungleCat cat1 = new JungleCat();
Cat cat2 = new Cat();
Cat cat3 = new JungleCat();
JungleCat cat4 = new Cat(); //this one is illegal, right?
JungleCat cat5;
Run Code Online (Sandbox Code Playgroud)

我想知道什么是对象类型的cat1,cat2,cat3,cat4,和cat5?我也想知道为什么在实例化对象时存在冗余:为什么在实例化对象时需要列出两个对象类型.

我很抱歉,如果这是一个非常基本的问题,但这是我想要一劳永逸地知道的事情,并且有一个很好的理由,我知道我可以在这里得到一个很好的答案(而不是Yahoo Answers,等):P

Roh*_*ain 5

在以下声明中: -

JungleCat cat1 = new JungleCat();
Run Code Online (Sandbox Code Playgroud)

你可以把它分成两部分: -

JungleCat cat1;  // This creates a reference of type `JungleCat`
cat1 = new JungleCat();   // This creates an object of type `JungleCat`.
Run Code Online (Sandbox Code Playgroud)

现在,您正在进行cat1引用,指向该JungleCat对象.引用只不过是指向所创建对象的链接,因此您可以访问它们.

您也可以像这样创建对象: -

new JungleCat();   // Will create an unnamed object
Run Code Online (Sandbox Code Playgroud)

但是,在上面的例子中,您只能在实例化的地方使用方法和属性.但是,稍后,由于您没有访问该对象的引用,您也无法访问它的属性.


现在,让我们继续讨论第二个声明: -

Cat cat = new JungleCat();
Run Code Online (Sandbox Code Playgroud)

在这里,你可以猜到,你有类型的引用和类型Cat - Super Class的对象JungleCat.这就是我们所说的Polymorphism.

因此,基本上,您可以创建任何超类型的引用,并使其指向任何子类型的对象.这很容易理解 - "因为JungleCat只是一只猫.所以,你总能有一个Cat参考点指向JungleCat".

反之亦然.例如: -

JungleCat ref = new Cat();
Run Code Online (Sandbox Code Playgroud)

现在这无效.因为a Cat不是必须的JungleCat.它可以是任何其他猫.因此,您无法将JungleCat参考点指向Cat对象.


现在这是您的实际关注点: -

我想知道cat1,cat2,cat3,cat4和cat5的对象类型是什么

好了,cat1,cat2...不是对象,而是指向某些对象的引用.您可以从上面的解释推断出每个参考类型.

对象类型是对象创建语句的RHS上使用的类型.与new关键字一起使用的类型是Object.您可以使用指向同一对象类型的不同类型的引用.

因此,您可以将两者cat1cat2引用指向同一对象类型.