将不存在的参数传递给方法

时间:2016-07-31 15:10:22

标签: java

我对Java编程很新,因为我已经在标题中说过,我希望传递一些可能存在或不存在作为类实例的参数。如果它不存在,我想创建它。到目前为止我的代码:

public class TestClass {

public static void main(String[] args) {
    Person Ted = new Person();
    Person Jack = new Person();
    Item it = new Item(Ted);
    Item itSec = new Item (Pierce); //Person Pierce doesn't exist => should be created
}
}

public class Person {
public Person(){
    //some code
}
}

public class Item {

public Item(Person name){
    if(!(name instanceof Person)){
        Person name = new Person(); //create that missing instance
    }
    else{
        //some code
    }

void getItem(Person name){
    System.out.println(name);
}
}

5 个答案:

答案 0 :(得分:1)

你误解了一些事情。

在声明之前,您无法使用标识符。以下内容在您的代码中不正确:

Item itSec = new Item (Pierce);

那是因为你没有在此行之前声明Pierce。您不必创建类的实例,但需要有效的标识符。你应该以这种方式宣布它:

Person Pierce;

此时标识符或引用是空的,或者说,它等于null。所有不是本地的对象引用都是以这种方式启动的,或者它们相等false0,取决于它们的类型。结果与您明确声明的结果相同:

Person Pierce = null;

但让我们继续前进。说已经声明了引用。 (顺便说一下,Java使用camelCaseNotation来表示变量,因此pierce是正确的。)我们说我们在Pierce为空或指某些点时对象,我们不知道。现在我们称之为:

Item itSec = new Item (Pierce);

new Item(Pierce)调用类Item中的构造函数public Item(Person name){...},您应该知道它。但现在,在那个构造函数中就有了这条线:

if(!(name instanceof Person)){

你滥用的。如果变量name等于null或现有对象,则此行检查的内容不是,但变量类型namePerson 的子类型。在这个地方总会返回true,因为函数标题public Item(Person name){...}说明了这一点:函数是public,是构造函数,参数是Person类型(所以Person或者子类型)。

你想在这里说的是:

public Item(Person name){
    if(name==null)){ //if the reference is empty
        this.name = new Person(); //I'll explain this below
    }
    else{
        this.name = name; //otherwise the local "name" will stay null
    }
}

我使用this.name,这是一个跳跃。为什么?在您的代码Person name = ...中,这是不正确的,因为name在构造函数完成后不会持续。您需要Item类对象中的一个字段,该字段将保存此值。所以可以用这种方式定义Item类:

public class Item {
Person name;
//...
}

现在,字段name保存在行中指定的值:

this.name = new Person();

您需要使用this来消除您name的含义。一个是Item类字段,另一个是Person name构造函数参数。

现在,我们回到main函数。如果您希望变量Pierce引用新创建的Person,则仍需要执行此操作。分配可以在此处进行,但首先您必须在类Item中创建一个函数,该函数返回其字段name的值。所以:

getName() {
    return name;
}

现在从main函数调用它:

Pierce = itSec.getName();

那就是它。最后,这个功能没有意义:

void getItem(Person name){
        System.out.println(name);
    }
}

它没有获取任何物品。它只打印传递给它的内容。这并不意味着如果你用getItem(Pierce)打电话,你会看到"皮尔斯"屏幕上。它将调用Pierce表示的对象中的toString函数,并且实际上,您将获得一个标准对象标识符。但是如果你定义一个函数:

void printItem() {
    System.out.println(name);
}

然后你可以这样称呼它。对于现有对象itSec

itSec.printItem();

对于getter函数,它应该返回你要求的内容,但这是另一个故事。

答案 1 :(得分:0)

没有实例化,你有什么期望?

Person Pierce = new Person();
Item itSec = new Item (Pierce);

答案 2 :(得分:0)

Item itSec = new Item (Pierce); //Person Pierce doesn't exist => should be created
  

如果它不存在,我想创建它。

没有"如果"关于它。代码从未声明该变量,因此永远不会存在。 (并且永远不会在其当前状态下编译。当然,您的Java编译器正在告诉您这一点。)鉴于需要创建始终,只需创建它:

Person Pierce = new Person();
Item itSec = new Item(Pierce);

修改:根据正在进行的评论,听起来像您希望拥有更像Map的内容。考虑一个例子:

Map<String,Person> people = new HashMap<String,Person>();
people.put("Pierce", new Person());

Map基本上是键/值对的集合,其中名称是键,Person是值。您可以根据需要动态添加/编辑/删除元素。

然后使用它,您将在地图上调用另一个操作:

Item itSec = new Item(people.get("Pierce"));

您可以使用各种操作来检查集合中是否存在值,添加它等等。您甚至可以扩展该类以添加您自己的操作,如果在尝试获取它时它不存在则创建一个操作

如果变量不存在,Java不会为你动态创建变量,但Map(或其他类似结构)上的操作可以检查元素是否存在,添加它,删除它等

答案 3 :(得分:0)

您不能使用不存在的变量......

Item itSec = new Item (Pierce);

上面的代码段永远不会有效,因为Pierce未定义。

代码:

 if(!(name instanceof Person)){
    Person name = new Person(); //create that missing instance
}

没有任何意义,因为这与调用

相同
Person Ted = new Person();
Person Jack = new Person();

其中Person实例实际上并不包含任何数据(除非你在实例化Person时有一些魔法!)

我假设你真正想要传递的不是一个对象,其变量是一个人的名字,而是一个包含人名的Person对象。

如果是这样,您的代码应该是这样的:

Person p1 = new Person("Ted");
Person p2 = new Person("Jack");

如果确实想要进行某些实例化,如果某些内容不存在,那么可能能够执行以下操作:

Item(String personName) {
  if(isExisting(personName)) {
    getPerson(personName);
  } else {
    Person p = new Person(personName);
}

boolean isExisting(String personName) {
  // Check if person exists somewhere
}

Person getPerson(String personName) {
  // Retrieve the Person instance with the same person name.
}

答案 4 :(得分:0)

     if(!(name instanceof Person)){
      Person name = new Person(); 
    } 

意思更少,因为&#39; name&#39;总是对象是这种情况下的人的实例..           项目itSec =新项目(皮尔斯);           Pierce不是一个对象..我们只能将Person对象传递给Item类的构造函数。没有任何方法可以通过传递未知的变量来创建任何类的对象。