java getter和setter作用是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java getter和setter作用是啥?相关的知识,希望对你有一定的参考价值。

在java中经常是声明一个私有的变量,然后给出他们的公共的getter和setter方法。比如:private String name;
public String getName()
return name;

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

请问:这样做的好处是什么?为什么要定义getter和setter呢。直接public String name;这样不是省去很多麻烦吗?

注:希望真正懂的给个明确的答案。在浏览一些技术方面的帖子的时候发现有些人根本就不懂(也许是只学了点皮毛),就那里里信口开河胡说乱说。

一、getter

1、按照客户的期望返回格式化数据。

2、控制服务的顺序(例如只有当连接建立时getter方法才返回相应实例)。

二、setter

1、可以限制和检验setter方法传入的参数。

2、隐藏对象内部数据结构。

3、保持对象在每个状态的完整性。

setter方法用来去设置该变量的值,然后在用getter方法去调用该变量的值。

setter用来改变数据成员的值时,操作必须由这个对象自己来触发public用来改变数据成员的值时,操作可以由任何对象来触发这是面向对象的封装,总之就是自己的数据成员,只对自己可见,也只有自己才能改变其值。

扩展资料

java使用getter和setter的好处:

1、实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。

2、隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

3、用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。

参考技术A

get和set就是java中的封装技术。首先我们需要知道,一旦一个变量被“private”私有化了,那么在其他类文件就不能引用(使用)它。使用“private”是把被使用的变量保护起来,使别人不知道这个变量的名称是什么,有保护的作用。

而set和get就是在和“private”私有化的变量在同一个类文件中,set和get是“public”共有的,也就是说这两个方法是可以被在其他类文件中使用的。set方法的意思是定义一个方法含一个参数,把所含有的这个参数(后期自己设置)赋给你需要私有化的变量(在当前类中设置),相当于充当媒介,外界想要改变已经“private”私有化的变量,必须要在其他类文件中给方法set一个参数,通过set变量来更改。

set的名字可以随便取,如此一来其他类中根本不知道在另一个类中“private”私有化的变量名称,也不能直接更改。get则是获取这个私有化的变量值。是定义了一个带返回类型的方法,这个返回类型就是已经被你私有化变量的类型。以题目为例,你私有化了String类型的name,那么get方法的返回类型就是String类型,同时返回当前类中name的值。

这样一来在其他类文件中,可以通过set方法来给和更改另一个类中的加密变量值,可以通过get来获取另一个类中加密的变量值,而这个被加密的变量则变量名始终没有人知道。

扩展资料:

“java中的封装”是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。

封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

参考资料:百度百科-java中的封装

参考技术B 其实说得明白点吧,这只是java类(特别的很多时候是一个javabean)的两个方法,以提供对某个变量(字段)设置与访问的两个入口,在很多时候也正如你说,跟定义成public是没有两样的,具体的原因在于:
(1)由于很多框架都是调用这两个方法来实现沟通,这是一种习惯了。
(2)get/set方法也不一定只是简单的作一个赋值,或一个返回值吧,在这里可以作一些权限的控制,比如不是每个角色都可以赋值的。再比如返回的值不一定是值本身,可以是经过处理了的,比如加密,这用public定义是不能作到的。

批斗一下一些说法:public不好?那干脆去掉好了咯。实现隐藏?你用get/set不是一样可以取到它,设置它,这如何叫隐藏?本回答被提问者采纳
参考技术C 定义为private 是为了实现数据的隐藏和封装;

而set get 方法提供了类与外部的接口;

在大型软件中这是很有必要的,它有利于代码的维护

举个例子,

一个父类有多个子类(甚至还有间接子类),程序代码中,子类是不能直接访问父类的private属性的;这时提供的set get方法是很有必要的

诚然,若将父类的属性声明为protected,在子类中就可以直接访问了,但是这种方法破坏了数据的隐藏和封装原则,关键是不利于代码的维护,如果父类中的一个属性改名了,那么在子类中用到该属性名的代码,要发生大范围的修改,而前面的private,set,get方法就比较好,对代码只需小范围的修改,一般都是这么用的,这是一个良好的编程习惯

这是我的一点理解,希望有所帮助
参考技术D 哎,这样写叫实体类,叫javabean

JavaBean严格来说能重用的类才叫javabean,但通常指的是与数据库字段相对应的字段,然后写成get和set方法

目的很简单嘛!数据的转载于传输嘛!

如果把数据库里面的数据给 封装进集合,然后在从集合里面取值的话,变量就只能取一次啦,因为每次循环的时候值都被覆盖啦!方法就不一样啦,对象.方法,你想怎么用就怎么用,只要集合在,里面的数据就不会丢的!

自己去试下,把数据库里面的记录读取出来分别用变量与对象去封装 看看谁方便,谁好用,谁的优点多。

去问下老师,同学就可以啦,而且还很直观?提问浪费资源分啊。。。

ECMAScript 6 类中的 getter 和 setter 是啥?

【中文标题】ECMAScript 6 类中的 getter 和 setter 是啥?【英文标题】:What are getters and setters for in ECMAScript 6 classes?ECMAScript 6 类中的 getter 和 setter 是什么? 【发布时间】:2015-03-29 03:00:15 【问题描述】:

我对 ECMAScript 6 类中 getter 和 setter 的意义感到困惑。目的是什么?以下是我所指的示例:

class Employee 

    constructor(name) 
        this._name = name;
    

    doWork() 
        return `$this._name is working`;
    

    get name() 
        return this._name.toUpperCase();
    

    set name(newName)
        if(newName) 
            this._name = newName;
        
    

【问题讨论】:

和 C# 中的类似,如果你碰巧知道的话。 相关:What is the argument for using ES6 getters and setters over getProperty/setProperty convention? 可以在以下位置找到解释这一点的好文章:coryrylan.com/blog/javascript-es6-class-syntax“在我们上面的类中,我们的 name 属性有一个 getter 和 setter。我们使用 '_' 约定来创建一个支持字段来存储我们的 name 属性。如果每次调用 get 或 set 时都没有这个,它会导致堆栈溢出“......它还谈到了变量不是真正的“私有”,但是有许多新方法可以在 JS 类中创建私有变量;我最喜欢的只是使用 Typescript,但我也使用过 Symbol 方法 【参考方案1】:

ES6 中的 Getter 和 setter 与其他语言中的用途相同……包括 ES5。 ES5 已经允许通过 Object.defineProperty 使用 getter 和 setter,尽管它们不太干净且使用起来更麻烦。

实际上,getter 和 setter 允许您使用标准的属性访问表示法进行读取和写入,同时仍然能够自定义如何检索和更改属性,而无需显式的 getter 和 setter 方法。

在上面的 Employee 类中,这意味着您可以像这样访问 name 属性:

console.log(someEmployee.name);

看起来类似于普通的属性访问,但实际上它会在返回名称之前调用toUpperCase。同样,这样做:

someEmployee.name = null;

将访问 setter,并且不会修改内部 _name 属性,因为 name 的 setter 中引入了保护子句。

另请参阅一般问题Why use getters and setters?,了解有关为什么能够修改成员访问功能很有用的更多信息。

【讨论】:

【参考方案2】:

这些setter和getter允许你直接使用属性(不使用括号)

var emp = new Employee("TruMan1");

if (emp.name)  
  // uses the get method in the background


emp.name = "New name"; // uses the setter in the background

这只是设置和获取属性的值。

【讨论】:

您是指属性而不是属性吗?让我有点困惑 好眼光,@Krizzu。属性存在于 JavaScript 中,与属性完全不同。答案确实是指属性而不是属性。我已经编辑了答案。我不认为回答者会介意。 :) 我不太确定这真的是一个优势,它以某种方式隐藏了使用 setter/getter 的概念。一个类的客户可能认为它直接使用属性,但它不合适,但我同意它遵守信息/细节隐藏原则。也许如果我们因此使用它,它会使使用更容易,我只需要更多地习惯它...... 你能在一个setter中传递多个参数吗?如果可以,你如何使用它? @大卫拉伯格 如果你想手动创建setter和getter,这里有一个很好的例子,来自coryrylan.com/blog/javascript-es6-class-syntax Set: set name(newName) this._name = newName; Get: get name() return this._name.toUpperCase(); 【参考方案3】:

ES6 getter 和 setter 的动机与 Java 中的类似概念截然不同。

在 Java 中,getter 和 setter 允许类定义 JavaBean。 getter 和 setter 的要点是它允许 bean 具有与公共字段所隐含的完全正交的“接口”。所以我可以有一个不是 JavaBean 属性的字段“名称”,并且我可以有一个不是字段的 JavaBean 属性“地址”。

JavaBean 属性也可以通过 Java 反射被数千个框架(例如 Hibernate)“发现”。因此,getter 和 setter 是“公开” bean 属性的标准方法的一部分。

Getter 和 setter 作为函数,也具有它们“抽象”实现的价值。它可以是字段或计算(“合成”)值。因此,如果我有一个名为“zipcode”的 bean 属性,它以存储的字符串开头。现在假设我想将其更改为从地址/城市/州计算的值?

如果我使用一个字段,这段代码会中断:

      String zipcode = address.zipcode();

但如果我使用吸气剂,这不会中断:

      String zipcode = address.getZipcode();

JavaScript 没有像 JavaBeans 这样的东西。据我所知,GET 和 SET 的预期值仅限于上述“合成”(计算)属性。

但它比 java 好一点,虽然 Java 不允许您将“字段”兼容地转换为方法,但 ES6 GET 和 SET 允许这样做。

也就是说,如果我有:

       var zipcode = address.zipcode;

如果我将 zipcode 从标准对象属性更改为 getter,上面的代码现在调用 GET 函数。

请注意,如果我没有在定义中包含 GET,这将不会调用 zipcode GET 方法。相反,它只会将函数 zipcode 分配给 var。

所以我认为这些是理解 Java 和 JavaScript ES6 getter 和 setter 之间的一些重要区别。

【讨论】:

【参考方案4】:
class Employee 

    constructor(name) 
      this._name = name;
    

    doWork() 
      return `$this._name is working`;
    

    get name() 
      // when you get this by employeeInstance.name
      // the code below will be triggered
      // and you can do some logic here
      // just like `console.log` something you want
      console.log('get triggered!')
      return this._name.toUpperCase();
    

    set name(newName) 
      // the same as `get`
      // when you employeeInstance.mame = 'xxx'
      // the code below will be trigged
      // and you can also do some logic 
      // like here is a `console.log` and `if check`
      console.log('set triggered!')
      if (newName) 
        this._name = newName;
      
    
  

  const employeeInstance = new Employee('mike')
  employeeInstance.name
  employeeInstance.name = '' // this won't be successful, because the `if check`
  console.log(employeeInstance.name)

  // => 
  // get triggered
  // set triggered
  // get triggered
  // MIKE

无论如何gettersetter 就像一个间谍。它监视对象的属性,因此您可以在每次获取或设置属性值时执行一些操作。

【讨论】:

以上是关于java getter和setter作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java里getter和setter的作用(转载)

使用getter和setter的pythonic方法是啥?

IDE 不显示 Lombok 为 Jackson 注释类生成的 getter 和 setter

GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )

不同的作用域属性 - 公共 getter 和内部 setter

java中,实体类是啥意思