日期:2014-05-20  浏览次数:20702 次

学JAVA一段时间,一直搞不懂set和get方法的问题
这个两个代码,为什么一个需要用set get方法来访问,一个不需要??不是说用private关键字设置的变量不能直接访问吗?为什么第一个代码可以给变量赋值,第二个代码不行??
Java code
class Person
{
    private String name;
    private int age;
    Person(){
        System.out.println("this is a void Person()");
    }
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String info(){
        return "the man is name:"+name+" age:"+age;
    }
}

class Teacher extends Person
{
    private    String title;
    Teacher(){
        System.out.println("teacher()");
    }
    Teacher(String name,int age,String title){
        super(name,age);
        this.title = title;
    }
public String info(){
        return super.info()+" title:"+title;
        }
    public String toString(){
        return "i`am a teacher wang!";
    }
}
public class Testequals
{
    public static void main(String arg[]){
        Teacher teach1 = new Teacher("wang",45,"high");
        Teacher teach2 = new Teacher("wang",45,"high");
            System.out.println(teach1.info());
            System.out.println(teach1.toString());
            System.out.println(teach1.equals(teach2));
    }

}



Java code
class Student {
    private String name;
    private String sex;
    
    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
public class TestStudent{
    public  static void main(String[] args){
        Student student=new Student();
        student.setName("zhangsan");
        student.setSex("male");



------解决方案--------------------
你举得这个例子,两个都可以不用setter getter,因为是在同一个类的类体当中,类的任何类型变量都可以直接操作,这时候使用setter getter看不出来效果。既可以直接this.xxx=xxx 也可以调用this.setXxx(xxx)进行赋值,既可以用this.xxx也可以用this.getXxx()取值

出现区别的在于类之外调用类的值,给你贴个例子
Java code

class Student {
    private String name;
    private String sex;

    public Student(){

    }
    public Student(String name ,String sex){
          this.name=name; //在同一个类 ,等同this.setName(name);
          this.sex = sex; //在同一个类 ,this.setSex(sex);         
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
public class TestStudent{
    public  static void main(String[] args){
        Student student=new Student();
//        student.name="abc" 这一行会编译出错        
// 在Student类体之外,要想给name属性赋值
        //必须要用public的setter方法,因为name属性声明为private类型
        //这就是setter的意义

        student.setName("zhangsan");
        student.setSex("male");
    }
}

------解决方案--------------------
什么时候要用就看你自己了,没有发现你的第一个代码中有直接修改变量的,有的只是通过构造的时候赋值的
可以参考下面的代码
Java code
public class Person
{
    private String name;
    private char sex;
    private int age;

    public Person()
    {
    }
    public Person(String name, char sex, int age)
    {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public  String getName()
    {
        return this.name;
    }
    public void setSex(char sex)
    {
        this.sex = sex;
    }
    public char getSex()
    {
        return this.sex;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public int getAge()
    {
        return this.age;
    }
    public  void print()
    {
        System.out.println("name: " + name + "\n" + "sex: " + sex + "\n" + "age: " + age);
    }
}