3

很长一段时间以来,我一直在与 java 中的 setter 和 getter 作斗争。

例如,如果我想使用适当的 set 和 get 方法编写一个包含姓名、性别、年龄等信息的类。然后在另一个类中,我想以此为例测试我的集合和吸气剂:

personInfo = myInfo() = new Personinfo("Anna", "female", "17");

我怎么做?

我知道我可以打印如下:

public void printout() {
    System.out.printf("Your name is:  " + getName() + 
              " and you are a " + getSex());
}
4

7 回答 7

2

这是一个简单的示例,向您展示如何做到这一点:

public class Person {
private String name;
private String gender;
private int age;
Person(String name, String gender, int age){
    this.name = name;
    this.gender = gender;
    this.age = age;
}
public void setName(String name){
    this.name = name;
}
public void setGender(String gender){
    this.gender = gender;
}
public void setAge(int age){
    this.age = age;
}
public String getName(){
    return this.name;
}
public String getGender(){
    return this.gender;
}
public int getAge(){
   return this.age;
}
public static void main(String[] args)
{
    Person me = new Person("MyName","male",20);
    System.out.println("My name is:" + me.getName());
    me.setName("OtherName");
    System.out.println("My name is:" + me.getName());
}
}

这将打印出:

我的名字是:我的名字

我的名字是:其他名字

于 2013-07-08T14:49:30.463 回答
1

您需要在另一个类中创建一个类的对象。然后,您可以在它们上调用.get().set()方法。我将在 2 分钟内发布一个示例

第一类(我称之为人)将具有返回其字段的方法

private String name = "";
private String age = 0;

public Person(String name, int age) {
  this.name = name;
  this.age = age;
}

public String getName() {
  return name;
}

public int getAge() {
  return age;
}

第二个类将在创建第一个类的对象后调用这些方法

bob = new Person("Bob", 21);
System.out.println("Your name is: " +  bob.getName() + 
                    " and you are " +  bob.getAge());
于 2013-07-08T14:39:25.050 回答
1

让 eclipse 为你处理它

单击您的变量 Source > Generate Setter / Getter

于 2013-07-08T14:40:42.490 回答
1

getter 和 setter 的目的是让您限制/扩展属性的范围或功能,彼此独立。


您可能希望您的“名称”属性在您的 PersonInfo 类之外是只读的。在这种情况下,您有一个 getter,但没有 setter。您可以通过构造函数传入只读属性的值,并通过getter检索该值:

public class PersonInfo
{
    //Your constructor - this can take the initial values for your properties
    public PersonInfo(String Name)
    {
        this.name = Name;
    }

    //Your base property that the getters and setters use to 
    private String name;

    //The getter - it's just a regular method that returns the private property
    public String getName()
    {
        return name; 
    }
}

我们可以使用 getName() 在这个类实例之外获取 'name' 的值,但是由于 name 属性是私有的,我们不能从外部访问和设置它。而且因为没有设置器,我们也无法更改此值,使其成为只读的。


作为另一个例子,我们可能想在修改内部值之前做一些验证逻辑。这可以在setter中完成,并且是 getter 和 setter 可以派上用场的另一种方式:

public class PersonInfo
{
    public PersonInfo(String Name)
    {
        this.setName(Name);
    }

    //Your setter
    public void setName(String newValue)
    { 
        if (newValue.length() > 10)
        {
            this.name = newValue;
        }
    }

现在,如果我们要设置的值的长度大于 10,我们只能设置 'name' 的值。这只是一个非常基本的示例,您可能需要在那里进行错误处理,以防有人干扰无效值在你的方法中并在它不起作用时抱怨。


您可以对所需的所有值遵循相同的过程,并将它们添加到构造函数中,以便您可以初始设置它们。至于实际使用此模式,您可以执行以下操作来查看它的实际效果:

public static void main(String[] args)
{
    PersonInfo myInfo = new PersonInfo("Slippery Sid",97,"male-ish");
    var name = myInfo.getName();
    System.out.printf("Your name is: " myInfo.getName() + " and you are a " myInfo.getSex());

    myInfo.setName("Andy Schmuck");
    System.out.printf("Your name is: " myInfo.getName() + " and you are a " myInfo.getSex());
}
于 2013-07-08T15:09:48.277 回答
0

您可以通过实例化构造函数来创建对象,如下所示

Personinfo pi = new Personinfo("Anna", "female", "17");

然后,您可以在该对象上调用方法,如下所示

pi.setName("Alan");

或者

pi.getName();
于 2013-07-08T14:42:26.627 回答
0

在personInfo中:

public Person(String n, int a, String s){
    this.name=n;
    this.age=a;
    this.sex=s;
}
public String getName(){
   return this.name;
}
public int getAge(){
   return this.age;
}
public String getSex(){
   return this.sex;
}
public void setName(String n){
   this.name = n;
 }
 public void setAge(int a){
   this.age = a;
 }
 public void setSex(String s){
   this.sex = s;
 }

然后修复打印语句:

System.out.println("Your name is: " + myInfo.getName() + " and you are a " +        myInfo.getSex());
于 2013-07-08T14:43:56.227 回答
0

这是你的做法:

public class PersonInfo {

    private String name;
    private String sex;
    private int age;


    /** GETTERS **/

    public String getName(){
        return name;
    }

    public String getSex(){
        return sex;
    }

    public int getAge(){
        return age;
    }

    /** SETTERS **/

    public void setName(String name){
        this.name = name;
    }

    public void setSex(String sex){
        this.sex = sex;
    }

    public void setAge(int age){
        this.age = age;
    }
}

class Test{
    public static void main(String[] args){
        PersonInfo pinfo = new PersonInfo();
        pinfo.setName("Johny");
        pinfo.setSex("male");
        pinfo.setAge(23);

        //now print it

        System.out.println("Name: " + pinfo.getName());
        System.out.println("Sex: " + pinfo.getSex());
        System.out.println("Age: " + pinfo.getAge());

    }
}

或者你也可以添加这个:

@Override
public String toString(){
    return "Name: " + this.name + "\n" +
            "Sex: " + this.sex + "\n" +
            "Age: " + this.age;
}

然后就到了.toString

编辑:

在类中添加这个构造函数来初始化对象:

public PersonInfo(String name, String sex, int age){
    this.name = name;
    this.sex = sex;
    this.age = age;
}
于 2013-07-08T14:46:13.743 回答