封装
1.封装概述
概述
- 是面向对象三大特征之一(封装,继承,多态)
- 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
封装原则
- 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
- 例如:成员变量使用private修饰,提供对应的getXxx()/setXxx()方法
封装好处
- 通过方法来控制成员变量的操作,提高了代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
2.private关键字
private的含义
- 概念:private是一个修饰符,表示私有,权限最小。
- 特点:
①.可与修饰成员方法和成员变量
②.被private修饰后的成员方法和成员变量,只能在本类中才能访问。
private的使用格式
// private修饰成员变量
private 数据类型 变量名;
// private修饰成员方法
private 返回值类型 方法名(形参){
方法体;
}
案例代码
public class Student {
// 成员变量
String name;// 姓名
private int age;// 年龄
public void show(){
System.out.println(name);
System.out.println(age);// 可以访问
study();// 可以访问
}
private void study(){
System.out.println("正在努力学Java");
}
}
public class Test {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.name);
//System.out.println(stu.age);// 编译报错,没有访问权限
//stu.study();// 编译报错,没有访问权限
// 间接访问
stu.show();
}
}
3.对属性封装的步骤
封装的目的
案例代码
public class Student {
// 类的属性 ---> 成员变量
// 姓名(name)
String name;
// 年龄(age)
int age;
// 类的行为 ---> 成员方法
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class Demo1Student {
public static void main(String[] args) {
// 创建Student对象
Student stu = new Student();
// 给stu对象的属性赋值
stu.name = "张三";
// stu.age = 18;
stu.age = -18;
// 调用show()方法
stu.show();// 姓名:张三,年龄:-18
}
}
- 以通过对象名直接访问成员变量的方式来对属性赋值,会存在安全隐患。
- 解决隐患方法: 不让外界直接访问成员变量(即对成员属性进行封装)。
封装步骤
- 使用private修饰成员变量.
public class Student {
// 类的属性 ---> 成员变量
// 姓名(name)
private String name;
// 年龄(age)
private int age;
// 类的行为 ---> 成员方法
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
- 对需要访问的成员变量,提供对应的get方法(获取属性的值),set方法(给属性赋值).
get方法和set方法
概述
- get()方法:提供get变量名 ()方法,用于获取成员变量的值,方法名用public修饰。
- set()方法:提供set变量名()方法,用于设置成员变量的值,方法名用public修饰。
书写格式
set方法书写格式
- set方法一个要被public修饰。
- set方法一定没有返回值(void)。
- set方法的方法名一定是set变量名,并且变量名首字母大写。
- set方法一定有参数。
- set方法一定给属性赋值。
标题get方法的书写格式
1.get方法一定是一个公共的方法(public)。
2.get方法一定有返回值,并且返回值类型与获取的属性类型一致。
3.get方法的方法名一定是get属性名,并且属性名首字母大写。
4.get方法一定没有参数。
5.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;
}
}
4.this关键字
在上面案例代码中,我们发现 setXxx
方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:
public class Student {
// 属性
private String name;
private int age;
// setXXX方法:用来给属性赋值
public void setName(String name){
name = name;
}
public void setAge(int age){
if (age < 0 || age > 150){
System.out.println("数据不合法");
age = -1;
}else{
age = age;
}
}
// getXXX方法:用来获取属性值
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
// 创建学生对象
Student stu = new Student();
// 调用set方法给stu对象的属性赋值
stu.setName("张三");
stu.setAge(18);
// 调用get方法获取stu对象的属性值
System.out.println(stu.getName()+","+stu.getAge());// null,0
}
}
经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了setXxx()
的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。
this的含义和使用
-
this含义: this代表当前调用方法的引用,哪个对象调用this所在的方法,this就代表哪一个对象
-
this关键字其主要作用是区分同名的局部变量和成员变量
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
-
this的使用格式:
this.成员变量名
- 使用
this
修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
// 属性
private String name;
private int age;
// setXXX方法:用来给属性赋值
public void setName(String name){
this.name = name;
}
public void setAge(int age){
if (age < 0 || age > 150){
System.out.println("数据不合法");
this.age = -1;
}else{
this.age = age;
}
}
// getXXX方法:用来获取属性值
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
public class Test {
public static void main(String[] args) {
// 创建学生对象
Student stu = new Student();
// 调用set方法给stu对象的属性赋值
stu.setName("张三");
stu.setAge(18);
// 调用get方法获取stu对象的属性值
System.out.println(stu.getName()+","+stu.getAge());// 张三,18
}
}
6.this关键子的内存原理
案例代码
public class Student {
// 属性
private String name;// 姓名
private int age;// 年龄
// 提供set方法,为了能够让外界给属性赋值
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
// 提供get方法,为了能够让外界可以获取属性的值
public String getName(){
return name;
}
public int getAge(){
return age;
}
// 成员方法
public void show(){
System.out.println("姓名:"+name+",age:"+age);
}
}
public class Demo1Student {
public static void main(String[] args) {
// 创建Student对象
Student stu = new Student();
// 给Student对象属性赋值
stu.setName("张三");
stu.setAge(18);
// 调用show方法
stu.show();
}
}