Java封装
1. java封装概述
1.1.封装定义
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。(隐藏对象的属性和实现细节,仅对外提供公共访问方式。)
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
1.2.封装的优点
-
良好的封装能够减少耦合。
-
类内部的结构可以自由修改。
-
可以对成员变量进行更精确的控制。
-
隐藏信息,实现细节。
1.3.封装原则
- 将不需要对外提供的内容都隐藏起来。
- 把属性隐藏,提供公共方法对其访问。
2.封装使用关键词
2.1.private关键字
- private关键字特点
-
是一个权限修饰符
-
可以修饰成员变量和成员方法
-
被其修饰的成员只能在本类中被访问
- 封装和private的应用:
-
把成员变量用private修饰
-
提供对应的getXxx()和setXxx()方法
-
private仅仅是封装的一种体现形式,不能说封装就是私有
- 案例演示
class Demo1_Person {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三"; //调用姓名属性并赋值
//p1.age = -17; //调用年龄属性并赋值
//p1.speak(); //调用行为
p1.setAge(-17);
System.out.println(p1.getAge());
}
}
class Person {
String name; //姓名
private int age; //年龄
public void setAge(int a) { //设置年龄
if (a > 0 && a < 200) {
age = a;
}else {
System.out.println("请回火星吧,地球不适合你");
}
}
public int getAge() { //获取年龄
return age;
}
public void speak() {
System.out.println(name + "..." + age);
}
}
2.2.this关键字
- this关键字特点
-
代表当前对象的引用
-
用来区分成员变量和局部变量重名
- :案例演示
-
this的应用场景
-
用来区分成员变量和局部变量重名
class Demo1_This {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("张三");
p1.setAge(23);
System.out.println(p1.getName() + "..." + p1.getAge());
Person p2 = new Person();
p2.setName("李四");
p2.setAge(24);
System.out.println(p2.getName() + "..." + p2.getAge());
}
}
class Person {
private String name; //姓名
private int age; //年龄
public void setAge(int age) { //设置年龄
if (age > 0 && age < 200) {
this.age = age;
System.out.println(age);
}else {
System.out.println("请回火星吧,地球不适合你");
}
}
public int getAge() { //获取年龄
return age;
}
public void setName(String name) { //设置姓名
this.name = name;
System.out.println(name);
}
public String getName() {
return name;
}
}
3.实现Java封装的步骤
3.1. 修改属性的可见性来限制对属性的访问(一般限制为private)
例:
public class Person {
private String name;
private int age;
}
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
3.2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
例:
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
3.3.实例
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
以上实例中public方法是外部类访问该类成员变量的入口。通常情况下,这些方法被称为getter和setter方法。因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。