前言
该部分为面向对象编程(中级部分)
包
基本介绍
本质:创建不同的文件夹来保存类文件
三大作用
- 1、区分相同名字的类
- 2、当类很多时,可以很好的管理类
- 3、控制访问范围
基本语法
- 1、package 关键字,表示打包
- 2、com.hspedu 表示包名
包的命名
规则:只能包含数字、字母、下划线、小圆点。但不能用数字开头,不能是关键字或保留字
规范:
- 一般是小写字母+小圆点
- com.公司名.项目名.业务模块名
常用的包
1 2 3 4
| java.lang.* java.util.* java.net.* java.awt.*
|
封装
封装介绍
封装(encapsulation)就是把抽象出的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的操作【方法】,才能对数据进行操作
封装的理解和好处
封装的实现步骤
- 1、将属性进行私有化private(不能直接修改属性)
- 2、提供一个公共的(public)set方法,用于对属性进行判断并赋值
1 2 3 4 5
| public void setXxx(类型 参数名){ //Xxx表示某个属性 //加入数据验证的业务逻辑 属性=参数名; }
|
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()); }
}
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 smith = new Person("smith",20000,400000.0); System.out.println("---smith的信息如下:---"); System.out.println(smith.info()); }
}
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.setName(name); this.setAge(age); this.setSalary(salary); }
|