1、封装
封装是面向对象三大特征之一(继承、封装、多态)。
封装指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问内部信息,而是通过该类提供的方法来实现对内部信息的访问和操作。
封装的具体实现:
- 将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。
- 将方法暴露出来,让方法控制对这些成员变量进行安全的访问和操作。
通俗的说就是该隐藏的隐藏起来(成员变量),该暴露的暴露出来(操作被隐藏的成员变量的方法)
2、封装的作用
- 隐藏类的实现细节。
- 使用者只能通过事先定义好的方法来访问数据,从而可以在方法里加入控制逻辑,限制对成员变量的不合理访问和修改。
- 可进行数据检查,从而有利于保证对象信息的完整性
- 便于修改,提高代码的可维护性。
举一个栗子:
(1)创建一个Person.class,添加私有成员变量和公有getter、setter方法。
public class Person {
//使用private修饰成员变量,将他们隐藏起来
private String name;
private int age;
private boolean man;
//自动生成的公有方法来操作成员变量
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMan() {
return man;
}
public void setMan(boolean man) {
this.man = man;
}
}
(2)对name、age添加合理性校验
public class Person {
//使用private修饰成员变量,将他们隐藏起来
private String name;
private int age;
private boolean man;
public String getName() {
return name;
}
public void setName(String name) {
//要求用户输入的姓名为2~4位,如果不符合要求打印提示
if(name.length()>4||name.length()<2) {
System.out.println("您输入的姓名不符合要求!");
return; //结束方法
}else {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//要求用户输入的年龄在0~120之间
if(age>120||age<0) {
System.out.println("您输入的年龄不符合要求!");
return; //结束方法
}else {
this.age = age;
}
}
//boolean类型的get方法叫 is变量名
public boolean isMan() {
return man;
}
public void setMan(boolean man) {
this.man = man;
}
}
(3)创建一个TestPerson.class,并通过公有方法来调用私有成员变量,并打印出来。
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
// p.name ="老徐"; 由于成员变量都隐藏了,所以不能进行赋值和操作
// 编译不会出错但是,但是会打印"您输入的姓名不符合要求!"
p.setName("尼古拉斯赵四");
// 编译不会出错但是,但是会打印"您输入的年龄不符合要求!"
p.setAge(1000);
//这次就可以通过公有的方法,将name和age分别赋值为老徐和18。
p.setAge(18);
p.setName("老徐");
//通过公有方法获得姓名、年龄的值,并通过+连接后打印出来。
System.out.println(p.getName()+"永远"+p.getAge()+"岁!");
}
}
image.png
3、访问控制符
- private(当前类访问权限,私有):私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。- default(包访问权限,默认):使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。
- protected(子类访问权限,受保护):如果通过protected修饰方法通常是希望其子类来重写该方法。
(1)、子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;(同一包里其他类都可访问)
(2)、子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。(可以被其它包的子类访问)- public(公有访问权限,公有):这是一个最宽松的访问控制级别。
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
image.png
考:package com.one; public class People { protected String name ="老八"; } // package com.homework; import com.one.People; public class Student extends People{ public void tet() { System.out.println(name); //通过继承的方式调用 } public static void main(String[] args) { Student s = new Student(); // s.name; //报错了,通过实例对象不可以调用 } }
4、封装的使用细节
(1)类属性一般使用private访问权限。
(2)提供相应公有类型(public修饰)get/set的方法,以提供对属性的赋值与读取操作。
boolean变量的get方法是is开头!例如:
boolean sex=true; public boolean isSex(){ return this.sex; }(3)一些只用于本类的辅助方法可以用private修饰,希望其他类调用的用public修饰。
5、控制访问和继承
- 父类中声明为 public 的方法在子类中也必须为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
6、包:类文件的管理
- package: 打包
- import: 引包

image.png











网友评论