黑马程序员技术交流社区

标题: 请教getname()与setname()的问题 [打印本页]

作者: 孙沛    时间: 2012-9-3 20:06
标题: 请教getname()与setname()的问题
本帖最后由 孙沛 于 2012-9-3 20:20 编辑

看到视频里初始化对象之后有这两个方法
public void setname(String s){
    name = s;//请问这个name为什么前面不加Sting
                  //请问为什么不用return name而用void
}
public getname(){
    return name; //请问这个name是从哪里来的
}
大家别嫌弃我是菜鸟啊,真的不懂,另外给我讲解下,setname和get那么的执行的原理吧
作者: 朱烈葵    时间: 2012-9-3 20:11
public void setname(String s){
    name = s;//请问这个name为什么前面不加Sting  这个String 前面是指给变量指定属性类型,这里name是给八s赋值给name,就是把传进来的数值给你新建的对象的name属性
                  //请问为什么不用return name而用void  这里的void是指格式,没什么实际意义
}
public getname(){
    return name; //请问这个name是从哪里来的 name来自的类里面的属性值
}

作者: 黄基焜    时间: 2012-9-3 20:18
//请问这个name为什么前面不加Sting
在完整的代码里面已经声明的name变量的数据类型是String,所以在函数里面不需要再声明一次。
你去看看完整的代码。

//请问为什么不用return name而用void
因为这个函数只是设置name的值而已,没有未知内容,所以不需要返回值类型。
而且你这个问法有点问题,是因为用了void的返回值类型之后,才不用return。
void是没有具体返回值类型,所以return省略不写。

//请问这个name是从哪里来的。
如果是name的值哪里来呢,就是上面setname函数赋予。
如果你问的是name这个变量是哪里来,这个name就是完整代码里面所声明变量
作者: 周兴华    时间: 2012-9-3 20:19
public void setname(String s){
     name = s;//请问这个name为什么前面不加Sting    //楼主仔细看代码,在类的成员变量里面应该会有定义一个name对象,即private String name;
                                                                             //而行就相当于this.name = s;
                   //请问为什么不用return name而用void   //setName方法是用参数s改变name的值,不用做返回值的动作
}
public getname(){   //这行错了,要改成public String getName()
     return name; //请问这个name是从哪里来的    //返回的就是成员变量name
}

一般代码如下

public class Student {
private int age;
private String name;
Student(int age,String name){
  this.age=age;
  this.name=name;
}
public void setName(String name){
  this.name=name;
}
public String getName(){
  return name;
}
}
作者: 吴通    时间: 2012-9-3 21:00
本帖最后由 吴通 于 2012-9-3 21:17 编辑

楼主你好
这个属于面向对象的封装思想。
通过封装可以把不需要对外提供的内容隐藏起来,只需要对外提供访问方式就行了。
通过private关键字把name私有,那么需要提供一种能够访问人name的方式
通过set和get来实现这个功能,也就是设置和获取。
调用的函数能够通过set来初始化变量,通过get返回值来获取这个变量。
set设置不需要返回值,故它的类型为void ,get的返回值就是name的类型,故为String

class Person
{
private String name;
private int age;
public void setName(String n)  //下面getName也为String
{
  name=n;
}
public String getName()
{
  return name;
}
public int setAge(int a)   //下面getAge也为int
{
  age=a;
}
public int getAge()
{
  return age;
}
    void speak()
}

class PersonDemo1
{
public static void main(String[] args)
{
  Person p=new Person();
  p.setName("lishi");
  p.setAge(20)
  System.out.println(p.getName()+"::"+p.getAge());
}
}

可以看出set接收的类型就是get的返回值类型,
想age,setAge(int a),里面是int类型的,则获取也是int的,setName(String n),是String类型的,则获取get也是String类型的。
因为获取的当然是设置的值,那么获取的当然是设置值的类型。
getName里面的return name的name就是setName里面设置的

作者: 杨千里    时间: 2012-9-3 21:07
本帖最后由 冰舞世界 于 2012-9-3 21:08 编辑

java语言具有封装的特性,private私有是封装的一种特性。
成员变量一旦被private;外部的东西就不能访问它了
例如
class Person
{
    private name; // name 被private了,Person类外部就访问不到name,  


我们在外部要想访问Person中的name,就必须对name进行设置和获取
name被private了 ,不能直接访问或者获取,必须先改变name的属性,用set()方法设置一下 即

public void setName(String s){
          name = s; // 不加String,是因为这句的意思对Private了的name 进行设置,已经知道name就是person中的private 的name。如果String name相当于给name指定类型,重新定义      
}
这段的意思对name进行设置,不需要return,

设置好了 就获取
public String getName()
{
           //通过上面的setName()方法对private 了name进行设置,那么现在就可以获取到了。
           return name;
          //这个name还是成员变量中的name,只不过是现在这个name,被访问的权限大了而已
}
任何成员变量和方法一旦被private,外部想访问,就必须通过set和get方法,进行设置和获取。

作者: 彭润生    时间: 2012-9-3 21:13
类中的成员变量肯定有String name;
方法前修饰符为void setName()不需要有返回值所以不用写return,如果要写也可以写return;。
而在方法getName()中获取name所以需要返回值,楼主写错了,应该是 String getName(){  return name;}
作者: 杨卫腾    时间: 2012-9-3 22:02
哥们,对于你说的那个name前边为什么不加String,其实这个在前边已经定义过了,name是个私有化成员变量。
当这个Person类中对name进行了私有化时,是为了安全,不让外部进行随意的修改。所以用方法setName()和getName()加以访问。
规范代码如下:
  1. class Person
  2. {
  3.         private String name;
  4.         Person(String name)
  5.         {
  6.                 this.name = name;
  7.         }

  8.         public void setName(String name)
  9.         {
  10.                 this.name = name;
  11.         }

  12.         public String getName()
  13.         {
  14.                 return name;
  15.         }
  16. }
复制代码

作者: 夏天    时间: 2012-9-3 22:11
{:soso_e101:}
作者: 夏天    时间: 2012-9-3 22:13
表示我无法回答,压力很大
作者: 徐传任    时间: 2012-9-16 18:03
bucuo..........




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