面向对象基础7(包和封装)
面向对象三大特征——封装、集成、多态
封装
隐藏对象的内部实现细节
将一些公共操作的细节暴露
如果通过暴露的界面操作对象,该对象的内部状态不会被破坏
简而言之,封装要求合理的隐藏,合理的暴露。
实现方式——访问控制符
private(类访问权限)——该修饰符修饰的成员,只能在该类中被访问
public(公共)——该修饰符修饰的成员可以在任意地方被访问
protected(子类访问权限)——该修饰符修饰的成员,能在该类,该类所在的包以及子类中被访问
默认——(包访问权限)——该修饰符所修饰的成员,只能在该类以及该类所在的包中被访问
private |
默认 | protected |
public |
|
|---|---|---|---|---|
| 当前类 | ✅ | ✅ | ✅ | ✅ |
| 当前包 | ❌ | ✅ | ✅ | ✅ |
| 子类 | ❌ | ❌ | ✅ | ✅ |
| 任意 | ❌ | ❌ | ❌ | ✅ |
规范
- 一般的,成员变量(实例变量)一般用
private修饰,为了隐藏实现细节 - 为每个成员变量提供
getter和setter方法 - 需要暴露的公共方法需要用
public修饰 - 如果希望一个方法主要用于被子类重写,用
protected修饰
举例:
package users;public class User {private String name;private int age;//此时成员变量name和age已经被封装,用户无法调用或是更改//用户名长度要求在6到10个字符之间public void setName(String name) {if (name.length() > 10 || name.length() < 6) {System.out.println("Error" + " " + name);return;}this.name = name;}public String getName() {return this.name;}//用户年龄要求在18到35岁之间public void setAge(int age) {if (age > 35 || age < 18) {System.out.println("不合需求的廉价劳动力" + " " + age);return;}this.age = age;}public int getAge() {return this.age;}}
import users.User;public class UserTest {public static void main(String[] args) {User me = new User();me.setName("aa");me.setAge(20);System.out.println(me.getAge());User u = new User();System.out.println(me.getName());u.setName("gtn2333333");u.setAge(2);System.out.println(u.getName());System.out.println(u.getAge());}}/*Error aa20null不合需求的廉价劳动力 2gtn23333330*/
包(package)
目的——解决同名类冲突问题
包包含所需的类
语法——推荐用公司域名倒写加项目名
定义包之后,其下类完整的类名变为包名.类名
导入包
import用于省略在某一类中调用别的包中的类所需要写的包名(省略写包名)
基本语法:import 包名.类名;——导入该包下的该类,例如import java.util.Scanner;
import 包名.类名.*——导入该包下的所有类,此处的*只能代表类名,包名不能用*
静态导入
import static用于导入指定类下面的所有静态成员(省略写类名)
基本语法:import static 包名.类名.静态成员名导入某包某类的某静态成员
`import static 包名.类名.静态成员名`导入某包某类的所有静态成员
import static java.lang.System.out;public class package {public static void main(String[] args) {out.println("2333");}}
此处导入的就是包(也可以形象的理解为公司)java.lang(language语言的缩写)的System类中的静态成员out,此时调用输出语句时可以省略类名System
Java源程序的结构
package语句要放在第一条
N条import语句
一个public class和若干个class
