1、封装定义:封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作。(类似于操作电视机)
2、优点:
(1)隐藏实现细节(方法调用)
(2)可以对数据进行验证,保证安全合理
3、封装的实现步骤(三步曲):
//1、将属性进行私有化[不能直接修改属性]
//2、提供一个公共的set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){
//加入数据验证的业务逻辑
属性=参数名;
}
//3、提供一个公共的get方法,用于获取属性的值
public XX getXxx(){//权限判断
return xx;
}
4、入门
/*题目:
不能随便查看人的年龄、工资等隐私,并对设置的年龄进行合理的验证(1-120),
否则给默认年龄。name的长度在2-6字符之间*/
package package20221105;
public class Encapsulation {
public static void main(String[] args) {
Person person=new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
System.out.println(person.info());
//自己使用构造器指定属性
Person smith=new Person("smith",20,50000);
System.out.println("smith:");
System.out.println(smith.info());
}
}
class Person{
public String name;
private int age;
private double salary;
public Person() {
}
//使用快捷键Alt+insert,选择“构造函数”,选择三个成员变量,快速生成构造器
public Person(String name, int age, double salary) {
//this.name = name;
//this.age = age;
//this.salary = salary;
//可以将set方法写在构造器中,下面三行相当于上面三行代码的作用,这样仍然可以验证
setName(name);
setAge(age);
setSalary(salary);
}
//自动生成get和set方法的快捷键Alt+insert,选择“Getter和Setter”,
// 选中三个成员变量,即可自动生成
public String getName() {
return name;
}
public void setName(String name) {
//加入对数据的校验,增加了业务逻辑
if(name.length()>=2&&name.length()<=6){
this.name=name;
}else{
System.out.println("名字的长度不对,需要(2-6)字符,默认名字:无名氏");
this.name="无名氏";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>=1&&age<=120){
this.age=age;
}else {
System.out.println("年龄不对,需要在(1-120),给默认年龄18");
this.age = 18;
}
}
public double getSalary() {
//在此增加对当前对象的权限判断
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return "name="+name+" age="+age+" salary="+salary;
}
}
/*输出:
name=jack age=30 salary=30000.0
smith:
name=smith age=20 salary=50000.0*/
5、练习题
/*题目:定义两个类:Account和AccountTest类体会java的封装性
1、Account类要求具有属性:姓名(长度为2、3、4位)、余额(必须>20)、
密码(必须是六位),如果不满足,则给出提示信息,并给默认值
2、通过setXxx的方法给Account的属性赋值
3、在AccountTest中测试*/
//我的答案:
package package20221105;
public class AccountTest {
public static void main(String[] args) {
Account person2=new Account("smith",30,123456);
person2.info();
}
}
class Account{
String name;
double ban;
int pin;
public Account(String name, double ban, int pin) {
setName(name);
setBan(ban);
setPin(pin);
}
public String getName() {
return name;
}
public void setName(String name) {
if(4>=name.length()&&name.length()>=2){
this.name=name;
}else{
System.out.println( "名字输入错误,默认名字为无名氏");
this.name = "无名氏";
}
}
public double getBan() {
return ban;
}
public void setBan(double ban) {
if(ban<=20) {
System.out.println( "余额必须>20,默认值为29");
this.ban = 29;
}else{
this.ban=ban;
}
}
public int getPin() {
return pin;
}
public void setPin(int pin) {
if(pin.length()!=6) {//密码应该设置为String型
System.out.println( "密码错误,必须为6位,默认密码为123456");
this.pin = 123456;
}else{
this.pin=pin;
}
}
//打印信息
public void info(){
System.out.println("name="+name+" ban="+ban+" pin="+pin);
}
}
//老师的答案:
package package20221105;
public class AccountTest {
public static void main(String[] args) {
Account person2=new Account();
person2.setName("smith");
person2.setBalance(30);
person2.setPwd("123456");
person2.info();
}
}
class Account{
private String name;
private double balance;
private String pwd;
//提供两个构造器
//一个无参构造器
public Account(){
}
//一个有参构造器
public Account(String name, double balance, String pwd) {
this.setName(name);
this.setBalance(balance);
this.setPwd(pwd);
}
public String getName() {
return name;
}
public void setName(String name) {
if(4>=name.length()&&name.length()>=2){
this.name=name;
}else{
System.out.println( "名字要求(长度为2位、3位或4位),默认名字为无名氏");
this.name = "无名氏";
}
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
if(balance>20) {
this.balance = balance;
}else{
System.out.println( "余额(必须>20),默认值为0");
this.balance = 0;
}
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
if(pwd.length()!=6) {
System.out.println( "密码(必须为6位),默认密码为000000");
this.pwd = "000000";
}else{
this.pwd = pwd;
}
}
//打印信息
public void info(){
System.out.println("name="+name+" balance="+ balance +" pwd="+ pwd);
}
}
/*输出:
名字要求(长度为2位、3位或4位),默认名字为无名氏
name=无名氏 balance=30.0 pwd=123456
*/