面向对象基础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 aa
20
null
不合需求的廉价劳动力 2
gtn2333333
0
*/
包(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