将方法参数作为'对象'类型

时间:2017-02-12 15:42:41

标签: java

假设我有以下方法: -

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

我在这样的地方使用它: -

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

显然,Kaal是一个类。

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

另外,上面的内容有何不同?

(鉴于我们只更改abhay的定义): -

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

" Java总是按值调用'。而不是对象,只有对象的引用作为参数传递,其中此引用是值。"

如果上述事实与此问题的答案有任何关联,请尝试根据上述事实进行解释。

3 个答案:

答案 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
    }
}