黑马程序员技术交流社区

标题: 关于setName和getName为什么要这样设置? [打印本页]

作者: VV烽火    时间: 2015-10-10 22:35
标题: 关于setName和getName为什么要这样设置?
class  Introduce
{
        public static void main(String[] args)
        {
                Student stu = new Student();
                stu.setName("小白");
                stu.setAge(23);
                stu.introduce();
        }
}

class Student
{
        private String name;
        private int age;

        public String getName()    //getName里面为什么能return 出name?这个name值是从哪儿来的,为什么能获取到?
        {
                return name;
        }

        public void setName(String stuName)     //为什么这个函数不直接这样写:     public String setName(String stuName)
        {                                                                                                                           {        name=stuName;
                name=stuName;                                                                                                  return name;
        }                                                                                                                           }  还要多此一举的定义一个getName,搞不懂书上为什么要这样定义这                                                                                                                                        两个函数?

        public int getAge()
        {
                return age;
        }

        public void setAge(int stuAge)
        {
                if(stuAge<=0)
                {
                        System.out.println("年龄非法!");
                }
                        else
                        {
                                age=stuAge;
                        }
        }

        public void introduce()
        {
                System.out.println("大家好,我叫"+name+",我今年"+age+"岁了。");
        }

}
虽然不是什么大问题,也没什么影响,但是很纠结,想了半天都没想通,有没有哪位大大能解决下?

作者: 斑点狗    时间: 2015-10-10 22:35
一般情况下,这样的设计是方便程序设置该私有属性并且也能通过调用另一个方法获取到该属性中现在的值。如果按你的意思,在setName中写上return name;看似方便使用,在web中这样调用setName(String stuName) 和getName()这样的形式很多,方便传值。有时你只需要获取带属性值时,这时你已经不需要设置该值了,但是现在的方法必须要传一个String stuName的形参,才能获取到该值。这样很不方便。
  还有getName()方法中的name你疑惑从哪里来的,这里的name是在前面已经定义好的实例变量,它的生命周期是这个类的对象的生命周期,在你这个类的对象还存在时,name就一直可以用,前面setName(String stuName)设置好name值之后,这时的name就已经被赋过新值了,调用getName()就可以获取到更改后的name的值了。
作者: ltxjxqy3    时间: 2015-10-10 22:49
第一个问题 name是一开始就定义好的成员变量name,通过getName方法可以获取到name的值;第二个问题因为get和set是两个方法,一个是赋值一个是取值,两个方法的功能是不一样的
作者: sandwicher    时间: 2015-10-10 23:10
setXxx河getXxx是一对方法,用来操作类变量(就是用private修饰的变量),setXxx用来设置值,getXxx用来获取值;这样做是为了保证类变量不会被随便修改,因为可以在方法体内加入一些判断条件;还有个好处就是,可以在不同的地方赋值和访问。
getName是类中的方法,可以使用该类中private修饰的变量,所以可以return出name,name的值是String类型,默认是null,可以通过setName给它赋值。
setName,你调用的时候需要给个参数,然后就传给了stuName,最后就赋给了类中的name,这样name就有值了,他只是为了赋值,就不需要返回值了;你那样写返回值的更没有意义,那个值本来是要赋值的,你又给返回去了,有啥用。
作者: 没下雨    时间: 2015-10-11 00:01

天上飘来五个字,我要黑马币
作者: 569015640    时间: 2015-10-11 09:51

第一个问题 name是一开始就定义好的成员变量name,通过getName方法可以获取到name的值;第二个问题因为get和set是两个方法,一个是赋值一个是取值,两个方法的功能是不一样的
作者: llyy    时间: 2015-10-11 10:23
因为考虑到安全性, name和age用private修饰 。用private修饰的变量外界的类是无法访问的,只用本类可以访问,那么就在本类中定义一个setName用来专门设置变量的值,用getName来获取变量的值。age是同样的原理,你赋值后也可以通过 对象.introduce()来一起获取name和age的值。
作者: 清心玉质    时间: 2015-10-11 14:07
name值是通过set方法中将传入的参数赋值给了类变量,再将类变量return。
第二个疑问就是为什么取值赋值不写在一个方法里。简单说因为是两个功能,在具体点就是每取一次值即使不做修改也要重新传一遍值,你说麻烦不麻烦
作者: 雨来    时间: 2015-10-11 15:15
看来你没有仔细看毕老师的视频,要不就是你没有看完教学视频。

1、首先为什么可以return  name  因为 name 这个变量和这个方法都属于Students类的成员,
并且已经生明了  语句是private String name; 同一个类中虽然这个变量加了private关键字修饰 但同一个类中是没有限制了 除非加了final 关键修饰的时候  不能再次运算、以及赋值(说白了就是值不能改变了)。
2、//为什么这个函数不直接这样写?
如果像你那样写 如果你调用那个方法 首先违反了  定义函数的基本规则  一个方法 尽量单一一个功能  还有就是每取一次值即使不做修改也要重新传一遍值
作者: VV烽火    时间: 2015-10-11 22:06
sandwicher 发表于 2015-10-10 23:10
setXxx河getXxx是一对方法,用来操作类变量(就是用private修饰的变量),setXxx用来设置值,getXxx用来获 ...

我的意思是setName赋值晚return回去不就相当于前面定义那个getName一样的功能了吗?为什么还要多设置一个getName?
作者: sandwicher    时间: 2015-10-11 22:16
VV烽火 发表于 2015-10-11 22:06
我的意思是setName赋值晚return回去不就相当于前面定义那个getName一样的功能了吗?为什么还要多设置一个 ...

setName赋值时,你已经知道值了,这时候返回来没意义;这样你想得到Name值,还得给它传进去一个值,你得到的值就是你传进去的那个值,这样有啥意义
在其他地方,你想得到Name值的时候,用getName就得到了,这样把赋值和取值分开多好。
作者: VV烽火    时间: 2015-10-11 22:17
斑点狗 发表于 2015-10-11 16:41
一般情况下,这样的设计是方便程序设置该私有属性并且也能通过调用另一个方法获取到该属性中现在的值。如果 ...

哦,是不是指有时只需要给name这个属性赋值,并不需要立即返回去,然后如果在setName中return name回去的话,每一次调用setName给name赋值时都会返回一个值,而设置了getName方法后,只当我需要这个值的时候才调用getName来获取这个值。是这样吗?
作者: VV烽火    时间: 2015-10-11 22:22
sandwicher 发表于 2015-10-11 22:16
setName赋值时,你已经知道值了,这时候返回来没意义;这样你想得到Name值,还得给它传进去一个值,你得 ...

你是指先用setName赋值,只是当需要用的时候才用getName调用吗?而不是在setName中设置了return在赋值时就会立刻返回来?
作者: sandwicher    时间: 2015-10-11 22:23
VV烽火 发表于 2015-10-11 22:17
哦,是不是指有时只需要给name这个属性赋值,并不需要立即返回去,然后如果在setName中return name回去的 ...

就是这样的
作者: sandwicher    时间: 2015-10-11 22:25
VV烽火 发表于 2015-10-11 22:22
你是指先用setName赋值,只是当需要用的时候才用getName调用吗?而不是在setName中设置了return在赋值时 ...

是的 就是这样的

作者: kamo    时间: 2015-10-11 22:29
你好
   首先第一个问题,这个是class内部定义了name,对于类内部的一般函数来说,可以直接访问name。
   第二个问题,是这样的,你的name定义的是private,所以外部类是不能访问到的,但是别人要用怎么办?于是,就公开了(public)两个函数,一个是set(设置值),另一个是get(获取值),明显这两个函数功能是不同的。至于为什么这么麻烦,这是为了保护数据安全,也就是封装。
我推测你可能没学了解  关于public,private等访问修饰符的知识 以及 面向对象的 性质。建议可以先看看你理论,再结合实例学习。
  希望能对你有所帮助。
作者: VV烽火    时间: 2015-10-11 22:48
kamo 发表于 2015-10-11 22:29
你好
   首先第一个问题,这个是class内部定义了name,对于类内部的一般函数来说,可以直接访问name。
    ...

我用private修饰name就已经封装了好不,我在setName中提供了共有的访问方法并且return了name值,现在我问的是为什么不把setName和getName两个函数合并成一个函数,既可以赋值有能return值,不是少写一个函数更简单吗
作者: 斑点狗    时间: 2015-10-12 08:56
VV烽火 发表于 2015-10-11 22:17
哦,是不是指有时只需要给name这个属性赋值,并不需要立即返回去,然后如果在setName中return name回去的 ...

是这样的
作者: chengaq0    时间: 2015-10-12 18:32
根据面向对象的特性中的封装特性:
隐藏属性和实现细节,只对外提供实现的方式
属性也就是成员变量(非静态成员变量),对外是不公开的,只能通过方法来设置和获取,
方法名:get/set +成员变量名首字母大写,一种规范,不是必须这么写的,但这么写
可以让你的代码更易于查看,阅读
作者: kamo    时间: 2015-10-12 21:29
VV烽火 发表于 2015-10-11 22:48
我用private修饰name就已经封装了好不,我在setName中提供了共有的访问方法并且return了name值,现在我问 ...

你这样思考很好,但是函数功能越单一越好,这是设计。你强行混一起当然也能,但是程序一旦大了,维护就困难了。然后你想想吧,你把这两个功能混一起,你用用,比如你要获取name有它,那它另一个功能不就没在用?那又何必设计在一起。这是以前的工程师们设计的结晶,是有他的道理的。
作者: 韩文昊    时间: 2015-11-1 11:00
这样的设计是方便程序设置该私有属性并且也能通过调用另一个方法获取到该属性中现在的值。如果按你的意思,在setName中写上return name;看似方便使用,在web中这样调用setName(String stuName) 和getName()这样的形式很多,方便传值。有时你只需要获取带属性值时,这时你已经不需要设置该值了,但是现在的方法必须要传一个String stuName的形参,才能获取到该值。这样很不方便。   还有getName()方法中的name你疑惑从哪里来的,这里的name是在前面已经定义好的实例变量,它的生命周期是这个类的对象的生命周期,在你这个类的对象还存在时,name就一直可以用,前面setName(String stuName)设置好name值之后,这时的name就已经被赋过新值了,调用getName()就可以获取到更改后的name的值了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2