Java学习笔记(四)——包及封装

前言

该部分为面向对象编程(中级部分)

基本介绍

本质:创建不同的文件夹来保存类文件

三大作用

  • 1、区分相同名字的类
  • 2、当类很多时,可以很好的管理类
  • 3、控制访问范围

基本语法

1
package com.hspedu;
  • 1、package 关键字,表示打包
  • 2、com.hspedu 表示包名

包的命名

规则:只能包含数字、字母、下划线、小圆点。但不能用数字开头,不能是关键字或保留字

规范:

  • 一般是小写字母+小圆点
  • com.公司名.项目名.业务模块名

常用的包

1
2
3
4
java.lang.*		//lang是基本包,默认引入,不需要再引入
java.util.* //util包,系统提供的工具包,工具类,使用Scanner
java.net.* //网络包,网络开发
java.awt.* //java界面开发,GUI

封装

封装介绍

封装(encapsulation)就是把抽象出的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的操作【方法】,才能对数据进行操作

封装的理解和好处

  • 隐藏实现细节
  • 可以对数据进行验证,保证安全合理

封装的实现步骤

  • 1、将属性进行私有化private(不能直接修改属性)
  • 2、提供一个公共的(public)set方法,用于对属性进行判断并赋值
1
2
3
4
5
public void setXxx(类型 参数名){
//Xxx表示某个属性
//加入数据验证的业务逻辑
属性=参数名;
}
  • 3、提供一个公共的get方法,用于获取属性的值
1
2
3
4
public 数据类型 getXxx(){
//权限判断
return xx;
}

一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.learn.encap;

import java.time.Period;

public class encapsulation01 {
public static void main(String[] args) {
Person person = new Person();

person.setName("张严");
person.setAge(30);
person.setSalary(10000.00);
System.out.println(person.info());
}


}
//封装一个类,要求有以下属性:年龄、工资、名字
//其中年龄要在1-120之间,工资不能直接查看、name的长度要在2-6字符之间

class Person{
public String name;
private int age;
private double salary;

public int getAge() {
return age;
}

public void setAge(int age) {
if(age>=1 && age<= 120){
this.age = age;
}else{
System.out.println("年龄要在1-120岁之间");
this.age = 18;
}
}

public double getSalary() {
//可以加一个密码校验缓解
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}

public void setName(String name){
if(name.length()>=2 && name.length()<=6){
this.name = name;
}else{
System.out.println("名字长度需要为2-6个字符");
this.name = "jack";
}
}
public String getName(){
return name;
}

public String info(){
return "信息为: name = "+ name +" age = " + age + "salary = "+salary;
}

}

封装与构造器

前面对person中的一些属性加了访问修饰符还有一些属性限制,例如name长度、age年龄、薪水无法访问等等。

但如果在Person类里面添加一个默认的构造器,就会发现:通过get、set这些方法进行的限制就会失效。验证代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.learn.encap;

import java.time.Period;

public class encapsulation01 {
public static void main(String[] args) {
//Person person = new Person();

Person smith = new Person("smith",20000,400000.0);
System.out.println("---smith的信息如下:---");
System.out.println(smith.info());
}


}
//封装一个类,要求有以下属性:年龄、工资、名字
//其中年龄要在1-120之间,工资不能直接查看、name的长度要在2-6字符之间

class Person{
public String name;
private int age;
private double salary;

public Person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}

public int getAge() {
return age;
}

public void setAge(int age) {
if(age>=1 && age<= 120){
this.age = age;
}else{
System.out.println("年龄要在1-120岁之间");
this.age = 18;
}
}

public double getSalary() {
//可以加一个密码校验缓解
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}

public void setName(String name){
if(name.length()>=2 && name.length()<=6){
this.name = name;
}else{
System.out.println("名字长度需要为2-6个字符");
this.name = "jack";
}
}
public String getName(){
return name;
}

public String info(){
return "信息为: name = "+ name +" age = " + age + "salary = "+salary;
}

}

终端显示:

1
2
---smith的信息如下:---
信息为: name = smith age = 20000salary = 400000.0

可以看到突破了限制。

这种情况如何在构造器中也能限制呢?——可以将set方法写在构造器中,这样仍然可以验证。构造器里面应该这样写:

1
2
3
4
5
6
7
8
9
    public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//我们可以将set方法写在构造器中,这样仍然可以验证
this.setName(name);
this.setAge(age);
this.setSalary(salary);
}