假设我有以下方法: -
public static void abhay(Object a){
....
}
我在这样的地方使用它: -
public static void main(String[] args){
...
Kaal b = new Kaal();
abhay(b);
...
}
显然,Kaal
是一个类。
现在,方法a
中abhay
的类类型(编译时的对象类型)是什么?换句话说,在编译器的眼中,a
的类是什么,当在方法abhay
内时?
另外,上面的内容有何不同?
(鉴于我们只更改abhay
的定义): -
public static void abhay(Kaal a){
....
}
" Java总是按值调用'。而不是对象,只有对象的引用作为参数传递,其中此引用是值。"
如果上述事实与此问题的答案有任何关联,请尝试根据上述事实进行解释。
答案 0 :(得分:4)
编译器仅关心当前所用方法的签名。
它无法了解并且不关心如何调用该方法。
因此,编译器看到abhay()
已声明a
为对象;这就是编译器对a
的了解。
当然,在运行时,b instanceof Kaal
之类的调用会产生true
。
只是为了记录:这与没有与call-by-value或call-by-reference有关。
答案 1 :(得分:0)
答案很简单。给定以下方法签名:
public static void abhay(Object a)
并通过abhay(new Kaal());
就像说:
Object a = new Kaal(); //only able to access members of Object
因为您告诉Java将其作为Object处理,所以它将被视为Object。访问Kaal
的成员:
((Kaal)a).kaalMethod();
这只是Java遵守参数列表中给出的数据类型的问题。它与"传递价值"无关。此外,Kaal和Object实例都是对象。你甚至不处理这里的原语,其中值指的是原语的实际内容。
答案 2 :(得分: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
....
}
你可能想检查instanceof
Kaal
是否明智我不明白为什么你会选择Object
代替班级
public static void abhay(Object a){
if(a instanceof Kaal){
Kaal k = (Kaal)a;
k.getSomeKaalMethod(); // works
}
}