Ano*_*mus 7 java oop class object
我有一个基本的任务,但对OOP来说是非常新的并且正在努力.其他在线资源开始增加我的困惑.
我需要:
编写类Person的代码.Person对象具有属性名称,年龄和地址.
编写类Dog的代码.Dog对象具有属性名称和年龄.
在Person和Dog类中提供设置Person对象和Dog对象之间的双向关联所需的任何其他代码.Person对象充当Dog对象的所有者,Dog对象充当Person对象的宠物.
修改Person类,以便Person对象可以充当最多20个Dog对象的所有者.
显然这是一个非常简单的例子.
我的代码到目前为止:
人员类:
public class Person
{
// instance variables - replace the example below with your own
private String name;
private int age;
private String address;
/**
* Constructor for objects of class Person
*/
public Person()
{
this.name = name;
this.age = age;
this.address = address;
}
//Set Methods:
public void setName () {
this.name = name;
}
public void setAge () {
this.age = age;
}
public void setAddress () {
this.address = address;
}
//Get Methods:
public String getName () {
return name;
}
public int getAge () {
return age;
}
public String getAddress () {
return address;
}
}
Run Code Online (Sandbox Code Playgroud)
狗类:
public class Dog
{
// instance variables - replace the example below with your own
private String name;
private int age;
public Dog()
{
this.name = name;
this.age = age;
}
//Set Methods:
public void setName () {
this.name = name;
}
public void setAge () {
this.age = age;
}
//Get Methods:
public String getName () {
return name;
}
public int getAge () {
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
主要:
public class Main
{
//Blank
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码目前没用,并且没有做任何事情,但我不确定如何"关联"对象和在哪里做.作业规范指定一个人充当狗的"所有者".
这就是我的问题所在.设置对象之间的关系.
这里的主要问题是一致性:如果Dog d1是Person p1的宠物,那么p1必须是d1的所有者,反之亦然.如果像许多人建议的那样,我们有2个方法(Person.addDog()和Dog.setOwner()),那么用户很容易犯错并且无法调用这两个方法(或者使用错误的参数调用).由于Dog只能拥有一个所有者,因此简单而安全的界面将使用单一方法Dog.setOwner(Person p),p如果我们希望狗没有所有者,则可以为null.除了设置字段之外,此方法Dog.owner必须从前一个所有者的宠物列表中删除此狗,并且(如果p!= null)将其自身添加到新所有者的宠物列表中.Person添加和删除宠物的类的方法应该对类可见,Dog但对用户不可见(它们应该是包私有的),而方法Dog.setOwner应该是公共的.
这是双向关系的常见问题;您不能在构造函数中传递它们,因为当另一个初始化时,其中一个还不存在。因此,您必须“从外部连接它们”
你提到的 20 条狗表明他们希望你使用数组来保存狗,但数组列表会更好。我将使用数组列表,但如果您愿意,可以向您展示如何使用数组
public class Person
{
ArrayList<Dog> dogs=new ArrayList<Dog>(); //this will hold all the dogs that the Person has as pets
public void giveDog(Dog dog){
dogs.add(dog)
}
.....
.....
Run Code Online (Sandbox Code Playgroud)
同样,狗类也有一个主人
public class Dog
{
Person owner;
public void setOwner(Person owner){
this.owner=owner;
}
.....
.....
Run Code Online (Sandbox Code Playgroud)
使用这两种方法可以创建双向关系。
这显然是一项任务,所以你别无选择,只能为了未来;像这样的双向关系可能很有用。但如果使用不当,它们也很危险。最重要的是,初始化后对象必须正常工作。它不能依赖于 setOwner() 或 GiveDog() 被调用:换句话说,无宠物的人和无主的狗必须表现得“正确”(无论这在上下文中意味着什么。未能实现这一点可能会导致容易出现错误的代码。如果这是不切实际的,那么无主的狗或无狗的人肯定不可能接触到程序的其余部分;工厂方法对此可能有用,但这超出了这个问题的范围