Java面向对象基础03-封装
为何封装
测试代码:
public class Phone { //定义手机类
//成员变量
String brand; //定义手机品牌
int price; //定义手机价格
String memory; //定义手机内存
//成员方法
public void call(){ //定义手机打电话方法
System.out.println("我在用"+brand+"打电话。");
}
public void sendMessage(){ //定义手机发短信方法
System.out.println("我在用"+brand+"发短信。");
}
public void salfIntroduction(){ //定义手机发短信方法
System.out.println("我的价格是"+price);
}
}
public class MiPhone {
public static void main(String[] args) {
Phone Mi = new Phone();
Mi.brand = "老米";
Mi.price = -2999;
Mi.memory = "128G";
Mi.call();
Mi.sendMessage();
Mi.salfIntroduction();
}
}
程序虽然没有报错,但是直接调用成员变量可能会带来隐患,比如价格不应该为负数。
private关键字
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 作用是保护乘员不被别的类使用,被private修饰的成员只有在本类中才能访问
针对被private修饰的成员变量,如果需要被其他类使用,提供相应的操作
- 提供"get变量名()"方法,用于获取成员变量的值,方法用public修饰
- 提供"set变量名(参数)"方法,用于设置成员变量的值,方法用public修饰
Idea中Code菜单下Generate可以自动生成setter和getter。
代码测试:
public class Phone { //定义手机类
//成员变量
private String brand; //定义手机品牌
private int price; //定义手机价格
private String memory; //定义手机内存
//成员方法
public void call(){ //定义手机打电话方法
System.out.println("我在用"+brand+"打电话。");
}
public void sendMessage(){ //定义手机发短信方法
System.out.println("我在用"+brand+"发短信。");
}
public void salfIntroduction(){ //定义手机发短信方法
System.out.println("我的价格是"+price);
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
}
public class MiPhone {
public static void main(String[] args) {
Phone Mi = new Phone();
//Mi.brand = "老米";
//Mi.price = -2999;
//Mi.memory = "128G";
Mi.setBrand("小米");
Mi.setMemory("128G");
Mi.setPrice(2999);
System.out.println(Mi.getBrand()+"!"+Mi.getMemory()+"!"+Mi.getPrice());
Mi.call();
Mi.sendMessage();
Mi.salfIntroduction();
}
}
运行结果:
this关键字
代码测试:
public void setName(String name) {
name = name;
}
当其他方法调用这个对象的setName时,会赋值失败。因为在有形参的情况下,方法内部会优先调用自己的局部参数,而不会主动使用方法的成员变量。
加上this关键字。
public void setName(String name) {
this.name = name;
}
用this指定的变量就是对象的成员变量。
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
什么时候使用this呢?
解决局部变量隐藏成员变量
this:代表所在类的对象引用
- 记住:方法被哪个对象调用,this就代表那个对象
封装
封装概述
是面向对象的三大特征之一(封装、继承、多态)
是面向对象编程语言对客观世界的模拟,客观世界成员变量都是隐藏在对象内部的,外界是无法直接操作的
封装原则
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现堆隐藏信息的操作和访问private成员变量,提供对象的getter和setter
封装的好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性