为了账号安全,请及时绑定邮箱和手机立即绑定

java中的set get

如题,对于私有的数据,不允许随意更改,set是重置,get是返回。 既然基本数据不能更改,那么get怎么返回呢,要和set一起使用吗 我这里很迷茫,希望大神举个例子说明……

添加回答

4回答
已采纳
编辑回答

私有数据不允许随意更改,是指的语法上的,不是设计上的。

public class Foo{
    private int i;
    public void setI(int j){
        i = j;
    }
    
    public static void main(String[] args){
        Foo a = new Foo();
        a.i = 42; //错误,不允许直接访问对象的private成员
        a.setI(42); //OK,setI是public方法,可以间接修改i
    }
}

把成员变量声明为私有,是为了封装。设置set/get 是为了提供一个接口来访问私有成员。要不要提供这个接口,怎样提供,取决于你的设计,业务逻辑。而且set和get比直接访问数据成员更好的地方在于,可以进行控制,比如上面的setI方法不一定真的就把i改了,可以是

 public void setI(int j){
         //只能设为非负数
        if(j < 0 )
            throw new IllegalArgumentException("Only non-negative numbers expected!");
        else i = j;
    }

或者

 public void setI(int j){
         System.out.println("想改我,没门");
    }

同理get也是

public int getI(){
     throw new UnsupportedOperationException("不是说我提供了get方法,就代表你真的能get到");
}

这些操作你都没办法通过像 a.i 这样直接访问成员来完成。

2 反对 0个回复 2017-03-20
你还没有登录,请先登录注册慕课网帐号

回复
编辑回答

谢邀,对不起来晚了。

关于最近江湖上的有些传闻说:

私有数据不允许随意更改,是指的语法上的,不是设计上的。

是指的语法上的,不是设计上的。

不是设计上的。

......

我跳起来就是一巴掌,属性的访问级别不需要反复推敲和设计吗?

首先更正一下题主,set是设置,get是取得,私有变量是该类内部的属性,一般用于内部操作。不能从外部随便设置和获取,所以当你觉得某些私有属性可以通过外界来设置和获取,那你就提供公有的getset方法让外界来操作你的私有变量。

举个栗子:
比如现在我要get你的内裤,我能不问你就直接伸手就get吗?

//语义:取得红神的内裤
String underpants = redGod.underpants;//私有属性不能这样访问

那你肯定不高兴对吧,除非你是Gay,把内裤的属性设置成公有的,大家可以随便玩像这样:

public String underpants;
//其他地方调用
redGodBitch.underpants = "threePointType";//公有属性可以这样访问
String underpants = redGodBitch.underpants;//公有属性可以这样访问

但是考虑到你尚存一息操守,所以现在内裤尚且是私有属性,看到你提供了get内裤的方法,说明关于这件事你很乐意配合外界去get,那我就直接调用你的get方法,因为这个get方法是你提供的。

//语义:红神我要get你的内裤
String underpants = redGod.getUnderpants();

但是get时候发现控制台输出:

NullPointException:红神很皮,没穿内裤。

我是不是要让你穿,set跟get类似,我总不能上手就直接给你穿吧,因为你觉得这个属性是私有属性不允许外界直接操作。

//给红神*穿上三点式
redGodBitch.underpants = "threePointType";//私有属性不能这样访问

但是我发现你提供了set方法,我会调用你的set方法让你去穿。

//红神*请穿上三点式
redGodBitch.setUnderpants("threePointType");

所以显而易见,set是用来设置对象的属性,get是用获取对象的属性,并无一定的关系和先后顺序,有些对象的属性在对象创建的时候就已经设置好了:

private String name = "redGodBitch";
private String underpants = "threePointType";

上面这类直接get是可以获取到。这就是get和set的意义。

在写业务逻辑的时候你肯定知道这个属性是空还是不为空还是不确定是不是空;

为空你就不get,不为空你就get。不确定你就先get再判断。

set和get方法实现时也可以加入其他的逻辑,比如常用的判断set值是否为空:

public void setUnderpants(String underpants){
    if(underpants==null||"".equals(underpants)){
        throw new RunTimeException("不要这样对我");
    }
    this.underpants = underpants;
}

当然不建议加入太复杂的逻辑 后期不好维护。

并且你要知道get set方法是一种公约,大家约定要这样写,你用其他公有方法设置和获取私有属性也是可以的。只不过有些框架需要调用默认的getset方法,以后如果你还没有放弃Java你就会接触到。

2 反对 1个回复 2017-03-21
你还没有登录,请先登录注册慕课网帐号

回复
编辑回答

其实这就是作,和直接改区别不大。为什么要用get和set呢?最主要的是提供统一的处理,面向接口。而定义变量的目的是什么?无论是私有还是公有都是为了使用和修改,如果不能修改,那就是常量了。

1 反对 0个回复 2017-03-20
你还没有登录,请先登录注册慕课网帐号

回复
编辑回答

set/get是public的,get可以得到同一个类中的private数据,其他类可以调用public的get,就可以得到这个数据了,这样做的目的是不允许以直接赋值的方式修改成员变量,因为那样根本就不知道是哪里修改了这个数据。而调用方法的过程是可以控制的,可以知道是哪里调用了set方法,哪里调用了get方法

反对 0个回复 2017-03-20
你还没有登录,请先登录注册慕课网帐号

回复

举报

0/150
提交
取消
意见反馈 常见问题 APP下载
官方微信