目录
前言
当我们谈论Java编程和面向对象编程(OOP)的基本概念时,封装是一个不可避免的话题。而在封装的过程中,getter和setter方法扮演了非常重要的角色。这些方法允许我们安全地访问和修改对象的内部状态,同时隐藏了实现的细节。
为什么需要Getter与Setter方法?
在Java中,类的属性通常被声明为私有的(private),以确保数据的封装和隐藏。这样做的好处是,我们可以控制对类内部数据的访问和修改,从而确保数据的完整性和安全性。但是,如果我们想要从类的外部访问或修改这些私有属性,该怎么办呢?这就是getter和setter方法发挥作用的地方。
getter与setter方法
1、Java不提倡将成员变量的保护级别设为public,而使用户在类外任意操作,对所有有必要在类外可见的成员变量,Java推荐采用“方法”来处理。
2、Java通过方法用于读取和写入成员变量值,而不是直接读取和写入,以此来提供对类中成员变量的保护。
3、使用方法,还可以对输入的数据进行检验。
getter与setter的定义
getter(获取器)和setter(设置器)是一种用于访问和修改对象属性的方法。getter方法用于获取对象的属性值,而setter方法用于设置对象的属性值。可以通过getter和setter方法来实现对属性的封装,隐藏属性的具体实现细节,以及对属性值进行控制和验证。通过getter和setter方法,可以更安全地访问和修改对象的属性
getter方法
Getter方法是一种公开的方法,用于返回私有属性的值。通常,getter方法的命名遵循一定的规范,即“get”+属性名(首字母大写)。例如,对于一个名为“name”的私有属性,其getter方法可能如下所示:
返回对象内部的成员变量的值
格式:
[访问修饰符] 成员变量类型 getXxx(){
return 成员变量;
}
public String getName() {
return name;
}
setter方法
与getter方法类似,setter方法也是一种公开的方法,用于设置私有属性的值。setter方法的命名规范通常是“set”+属性名(首字母大写),并且它接受一个参数,该参数的类型与要设置的属性相同。例如,对于一个名为“name”的私有属性,其setter方法可能如下所示:
public void setName(String name) {
this.name = name;
}
问题的提入︰
1.长方形类中所有成员变量都是公有的,不利于对成员变量的保护。
2.长方形类中的width、height除了可以输入正数外,还可以输入负数。
程序举例一
public class Rectangle{ //定义长方形类,类名Rectangle
private int width; //成员变量,宽
private int height; //成员变量,高
//读width的值
public int getWidth(){
return width;
}
//读height
public int getHeight(){
return height;
}
//对width进行赋值
public void setWidth(int width){
this.width=width;
}
//对height进行赋值
public void setHeight(int height){
this.height=height;
}
}
注意:当方法的参数与成员变量名相同时,使用this来引用成员变量名。
使用getter与setter之前
Rectangle rect1=new Rectangle(); //创建Rectangle类的对象
rect1.width=12; //赋值长方形rect1的宽
rect1.height=5; //赋值长方形rect1的高
System.out.println("长方形的宽为:"rect1.width+",长方形的高为:"+rect1.height);
使用getter与setter之后
Rectangle rect1=new Rectangle(); //创建Rectangle类的对象
rect1.setWidth(12); //赋值长方形rect1的宽
rect1.setHeight(5);
System.out.println("长方形的宽为:"+rect1.getWidth());
System.out.println("长方形的高为:"+rect1.getHeight());
getter与setter中代码处理
getter、setter用于读取和写入成员变量值,可在方法中增加代码进行数据处理。
使用setter可以对输入的数据进行检验
使用getter可以对读出的数据进行处理
对输入数据进行检验的Setter方法
public class Student{
private String name;//姓名
private int age;//年龄,在15-30岁之间
private String sex;//性别
public String getName(){
reutrn name;
}
public int getAge(){
return age;
}
public String getSex(){
return sex;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age) throws Exception {//方法头中声明异常
if(age<15||age>30){
throw new Exception("年龄不符合要求");//抛出异常
}else{
this.age=age;
}
}
public void setSex(String sex) throws Exception {//方法头中声明异常
if("男".equals(sex)||"女".equals(sex)){
this.sex=sex;
}else{
throw new Eception("性别输出错误");//抛出异常
}
}
}
思考︰如果增加成员变量电话号码,如何对输入的电话号码进行检验?(要求长度为11位,且只能是数字)
public class TextStudent{
public static void main(String[] args){
Student s1=new Student();
try{
//可能出现异常的代码
s1.setName("李明");
s1.setAge(30);
s1.setSex("男");
System.out printh("姓名为%s,年龄为%d,性别为%s\n",s1.setName(),s1.setAge(),s1.setSex());
}catch(Exception e){
//异常代码处理
System.out.println(e.getMessage())
}
}
}
注意:
System.out.printf():按指定的格式输出。
%d:格式化为十进制整数
%s:格式化为字符串
对读出数据进行处理的getter方法
public class Person{
private String name;//姓名
private String phone;//电话号码
public String gerName(){
return name;
}
public String getPhone(){
//隐藏电话号码的中间四位
return phone.substring(0,3)+"****"+phone.substring(7);
}
public void setName(String name){
this.name=name;
}
public void setPhone(String phone){
this.phone=phone;
}
}
public class TestPerson {
public static void main(String[] args){
Person p1=new Person();
p1.setName("李明");
p1.setPhone("13711028365");
System.out.println("姓名,"+p1.getName());
System.out.println("电话号码,"+p1.getName());
}
}
说明:
substring方法实现从当前字符串中取子字符串
substring(a,b):取出下标a到下标b-1之间的子字符串
substring(a):取出下标a到结束的子字符串
代码实现:
getter与setter的选择使用
getter与setter可根据需要只有其中一个。
如果只需要读取成员变量的值,可以只编写getter方法;
如果只需要对成员变量赋值,可以只编写setter方法。
// 读height
// public int getHeight(){
return height;
}
// 对height进行赋值,并对传入的数值进行检验
public void setHeight(int height) throws Exception{
if (height<0){
thows new Exception("高度不能小于0");
}else{
this.height=height;
}
}
异常的处理
声明异常
public void setAge(int age) throws Exception
抛出异常
throws new Exception("年龄不符合要求");
捕获异常
try{
//可能出现异常的代码
s1.setAge(30);
s1.setSex("男");
Syetem.out.printf("年龄为%d,性别为%s\n",s1.setAge(),s1.getSex());
} catch(Exception e){
//异常处理代码
System.out.println(e.getMessage())
}
总结
Getter和setter方法是Java编程中封装数据的基本工具。通过使用这些方法,我们可以安全地访问和修改对象的内部状态,同时隐藏实现的细节。在编写Java类时,建议始终为私有属性提供getter和setter方法,以确保数据的完整性和安全性。