2016-09-19 154 views
0

我见过很多关于对象引用的问题,并且部分理解了它们的工作原理。尽管如此,我仍然有一些疑虑。将一个对象的引用赋值给Java中的其他对象?

首先,本声明中的所有词语意味着什么?

Box b = new Box();

我知道new Box()导致创建一个对象,并返回参照到对象。如果我没有错,这个参考被存储在b中。那么最初的Box是什么?根据我读过的内容,这是定义Box的类。虽然我不确定。这使我想到我的下一个问题。

我试图了解初始期限在声明中表示,以我尝试了这一点:

class LOL 
{ 
    public static void main(String args[]) 
    { 
     Box b=new Box(); 
     Cup c=new Cup(); 
     Box f=new Cup(); //***** 
     f.daa(); //Prints Box.daa 
     f.display(); //Prints Cup.display 
     f.disp(); //ERROR! 
    } 
} 
class Box 
{ 
    void display() 
    { 
     System.out.println("Box.display"); 
    } 
    void daa() 
    { 
     System.out.println("Box.daa"); 
    } 
} 
class Cup extends Box 
{ 
    void display() 
    { 
     System.out.println("Cup.display"); 
    } 
    void disp() 
    { 
     System.out.println("Cup.disp"); 
    } 
} 

那么,什么是怎么回事?线*****实际上做了什么?创建的对象的类型为Cup(我认为),为什么它不能调用f.disp()?我的头不能包裹这个。

+0

在'Box f = ...'中,'Box'是变量'f'的类型。这意味着它可以存储对“Box”类型的任何引用,并且包含任何子类型。 –

+0

“那么最初的”Box“是什么? Java是一种静态和强类型的语言。这意味着:每个变​​量都有一个在编译时已知的类型,您只能将该类型的值(或子类型,即子类)赋值给此变量。 'Box b'说:“我想要一个名为'b'的变量,它的(静态)类型是'Box''。然而,在运行时,'b'引用的对象可以是“Box”或“Box”的任何子类(例如,在您的示例中为“Cup”)。 – Turing85

+0

@ Turing85你的评论应该是一个答案 –

回答

1

Box f = new Cup();创建一个新的杯子并将其存储在Box类型的变量f中。下面的代码看到fBox类型,并将其视为这样。由于Box没有称为disp()的方法,因此无法执行f.disp()

在致电disp()之前,您必须将Box f...更改为Cup f...或者将f改为输入Cup

+0

好吧,所以对象是杯型的,但它下面的代码认为它是Box的类型?所以只有Box内容可以访问? –

+0

你是非常接近的:对象是类型为Cup和Box类型的对象,因为Cup也是一个Box(Cup是Box的子类)。下面的代码只知道它是一个Box对象(因为它是一个Box变量),因此只能访问Box成员 – Breeze

+0

啊,是的,我现在明白了。清理完了!虽然没有足够的代表upvote:p –

0

您需要了解面向对象的概念。在这里你需要应用基本继承和重写概念。

  • CupBox的子类。
  • Boxdisplay()daa()方法。
  • Cup已覆盖的Boxdisplay()方法,继承daa()Cup本身disp()方法。

Box f = new Cup(); 

在这里,你创建的Cup一个对象,它是在Box型参考举行,这是可以做到,因为CupBox

f.disp(); 

这给出了一个编译错误作为disp()方法,因为它没有在Box类中定义不能在编译时解决。

+0

我喜欢这个解释,谢谢。 “因为杯子是一个盒子”明确表示 –

相关问题