2017-02-12 52 views
-2

假设我有以下方法: -有一个方法参数作为“对象”型

public static void abhay(Object a){ 
.... 
} 

和我的地方像这样使用: -

public static void main(String[] args){ 
... 
Kaal b = new Kaal(); 
abhay(b); 
... 
} 

其中Kaal是一类,显然。

现在,方法abhay内的a的类类型(编译时的对象类型)是什么?换句话说,在编译器的眼里,当方法abhay里面有什么类a

另外,以上与以下不同?

(因为我们只改变abhay定义): - 。

public static void abhay(Kaal a){ 
.... 
} 

“Java是永远‘通话按值’而不是对象,只有参考的对象,传递作为一个论点,这里的参考是价值。“

如果上述事实与这个问题的答案有任何相关性,请尝试在上述事实的背景下解释。

+0

'”的......我的地方像这样使用: - .. “' - 而且不会编译 –

+2

你发布的代码不会编译,因此很难回答你 - 这已经够难了,因为你的问题不是很清楚。但是在第一种情况下,'a'的编译时类型是'Object',你会发现如果你试图使用'Kaal'中声明的任何方法... –

+1

这将是一个对象。欢迎您投下并检查它的类型,尽管 –

回答

0

答案很简单。考虑下面的方法签名:

public static void abhay(Object a) 

,你通过abhay(new Kaal());

调用它,它好像是说:

Object a = new Kaal(); //only able to access members of Object 

因为你告诉Java来处理它作为一个对象,它会被处理作为一个对象。要访问的Kaal成员:

((Kaal)a).kaalMethod(); 

这仅仅是一个符合在参数表中给出的数据类型的Java的问题。它与“通过价值”无关。此外,Kaal和Object都是对象。你甚至在这里处理的是基元,其中的值是指基元的实际内容。

4

编译器关于当前它是在方法。

它不知道,不关心这个方法是如何调用的签名只有忧虑。

因此,编译器看到abhay()已声明a是一个对象;这就是编译器知道的a

当然,在运行时,像b instanceof Kaal这样的调用将导致true

而只是为了记录:这有没有与值调用或调用引用。

0

Kaal作为参数,你可以访问Kaal方法

public static void abhay(Kaal a){ 
    a.getSomeKaalMethod(); // works 
    .... 
} 

Object作为参数,并通过一个Kaal类,你不能访问Kaal方法或属性

public static void abhay(Object a){ 
    a.getSomeKaalMethod(); // doesnt work 
    .... 
} 

除非您将物体投射到Kaal

public static void abhay(Object a){ 
    Kaal k = (Kaal)a; 
    k.getSomeKaalMethod(); // works 
    .... 
} 

如果是instanceofKaal其他你可能想看看聪明我不明白为什么你会采取Object而不是类

public static void abhay(Object a){ 
    if(a instanceof Kaal){ 
     Kaal k = (Kaal)a; 
     k.getSomeKaalMethod(); // works 
    } 
} 
相关问题