我对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);
}
}
答案 0 :(得分:1)
你误解了一些事情。
在声明之前,您无法使用标识符。以下内容在您的代码中不正确:
Item itSec = new Item (Pierce);
那是因为你没有在此行之前声明Pierce
。您不必创建类的实例,但需要有效的标识符。你应该以这种方式宣布它:
Person Pierce;
此时标识符或引用是空的,或者说,它等于null
。所有不是本地的对象引用都是以这种方式启动的,或者它们相等false
或0
,取决于它们的类型。结果与您明确声明的结果相同:
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或现有对象,则此行检查的内容不是,但变量类型name
是Person
的子类型。在这个地方总会返回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类的构造函数。没有任何方法可以通过传递未知的变量来创建任何类的对象。