有关新关键字的问题

时间:2015-01-10 13:09:10

标签: java

我很难理解新关键字的概念。我知道它用于实例化对象;例如如果我有一个名为Superclass的类,我可以通过编写:

来创建该类的对象
Superclass supeclassobject = new Superclass(); 

我明白,但我不明白的是,这也是可以接受的: 例如。如果你将一个Superclass对象传递给一个将它作为参数的方法,那么以下内容仍然可以工作:

public void MethodTakingSuperClassObjectAsArugment (new Superclass()){
*CODE HERE*
}

我无法理解它是如何工作的。你没有给对象命名,所以你怎么能在方法中引用它?这对我来说很有意义:

Superclass sobject = new Superclass();
public void MethodTakingSuperClassObjectAsArugment (sobject){
    *CODE HERE*
    }

1 个答案:

答案 0 :(得分:0)

你有一些误解。

首先,有一个方法定义,然后有一个方法调用

方法定义是声明方法的地方。您可以为其提供修饰符,例如public / private / protected,返回类型,名称,参数列表,可选throws和正文:

public static int myInt( double myParameter ) {
    return (int)myParameter;
}

此处,参数必须具有名称。否则,你将无法在体内引用它们。

然后是方法调用。在其他方法中,例如main,您可以调用您的方法:

int a = myInt( 15.7 );

您通过了15.7而没有给它起个名字。实际在方法调用中传递的值称为参数,而不是参数,它是给出的正式名称和类型方法定义。

如果您的方法定义包含SuperClass类型的参数,它将类似于:

public static void myMethod( SuperClass myParameter ) {
    ...
}

您无法在参数声明中使用new。但是当你调用方法,并且你必须将参数传递给它时,你可以使用:

myMethod( new SuperClass() );

就像之前您不需要为15.7命名一样,您现在不需要为新对象命名。当Java将其传递给方法时,该方法将其视为myParameter的值。

你的第二个误解是关于物体的名称。物体实际上没有名字。但他们确实有引用。您可以从局部变量,字段或另一个对象内部引用对象。在这些情况下,您为引用指定名称,而不是对象。所以你可以这样做:

Superclass myVar = new SuperClass();
Superclass anotherVar = myVar;

这里有两个参考变量。您将对新引用的引用分配给myVar。然后将同一对象的引用分配给anotherVarmyVaranotherVar都将引用到同一个对象。该对象没有名称。您现在可以执行myVar = null之类的操作。但该对象仍然存在,您可以通过anotherVar访问它。

将参考变量视为箭头。您为箭头指定了一个名称,您可以将箭头指向相应类型的任何对象。或者你可以为它指定null,这意味着箭头没有指向任何东西。

回到参数问题,有时你可以看到这样的东西:

myMethod( new SuperClass() {
   // Code here
} );

这与我们之前完全一样。它是一个方法调用。您在大括号中看到的代码不是myMethod的代码。它实际上是新对象的代码。它是一个匿名类,扩展 SuperClass,并且在这些大括号中有一些自己的代码。因此定义了类并创建了一个实例,并且该实例 - 扩展SuperClass的匿名类是作为myMethod的参数传递的。在myMethod内,可以使用myParameter访问它。它与在同一个文件中的某处写入相同:

private class SomeClass extends SuperClass() {
    // Code here
}

And then calling `myMethod` like this:

myMethod( new SomeClass() );