问题:
1.为什么要进行封装?
2.解决方式?
3.对属性封装的步骤?
答:
1.通过对象名直接访问成员变量的方式来对属性赋值,会存在数据安全隐患
2.解决方式: 不让外界直接访问成员变量(也就是要对属性进行封装)
3.封装的步骤:
1.使用private关键字修饰成员变量
2.提供公共的访问方式: 设置属性值的方法(set方法),获取属性值的方法(get方法)
创建学生对象以及测试类
public class Student {
// 成员变量
String name;
int age;
}
public class Test {
public static void main(String[] args) {
// 创建Student对象
Student stu = new Student();
// 访问成员变量
stu.name = "冰冰";
stu.age = -18;
System.out.println(stu.name + "," + stu.age);// 冰冰,-18
}
}
set、get方法书写
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
- get方法: 用于获取成员变量的值,方法用public修饰,有返回值,无参数,方法名getXXXX(),一定会返回属性的值
- set方法: 用于设置成员变量的值,方法用public修饰,无返回值,有参数,方法名setXXXX(),一定会为属性赋值
this关键字的使用
我们发现setXxx
方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public void setAge(int age){// 批量修改名称: shift+f6
// 判断
if (age < 0 || age > 100){
this.age = -1; // -1表示数据不合法
}else {
this.age = age;
}
}
}
public class Test {
public static void main(String[] args) {
/*
问题1: set方法的形参名没有起到知名达意
解决1: 修改形参名为属性名
问题2: 如果set方法的形参名和属性名一致了,就会造成给属性变量赋值不成功
解决2: 使用this关键字解决
*/
// 创建Student对象
Student stu = new Student();
// 为属性设置值
stu.setName("冰冰");
stu.setAge(18);
// 取出属性的值
System.out.println(stu.getName());// null
System.out.println(stu.getAge());// 0
}
}
经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了setXxx()
的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。
-
this含义: this代表当前调用方法的引用,哪个对象调用this所在的方法,this就代表哪一个对象
-
this关键字其主要作用是区分同名的局部变量和成员变量
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
- this的使用格式:
- this**.**成员变量名
使用this
修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
// 成员变量
private int age;
private String name;
// name属性的set方法(为name属性赋值用的)
public void setName(String name){
this.name = name;
}
// age属性的set方法(为age属性赋值用的)
public void setAge(int age){// 批量修改名称: shift+f6
// 判断
if (age < 0 || age > 120){
this.age = -1; // -1表示数据不合法
}else {
this.age = age;
}
}
// name属性的get方法(获取name属性的值)
public String getName(){
return name;
}
// age属性的get方法(获取age属性的值)
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
/*
问题1: set方法的形参名没有起到知名达意
解决1: 修改形参名为属性名
问题2: 如果set方法的形参名和属性名一致了,就会造成给属性变量赋值不成功
解决2: 使用this关键字解决
原因: this关键字可以用来区分同名的成员变量和局部变量
格式: this.成员变量名
this表示谁: 哪个对象调用this所在的方法,this就代表哪个对象
*/
// 创建Student对象
Student stu = new Student();
// 为属性设置值
stu.setName("冰冰");
stu.setAge(18);
// 取出属性的值
System.out.println(stu.getName());// 冰冰
System.out.println(stu.getAge());// 18
}
}
总结:谁通过调用this所在的方法,this就是谁!!!