目录
三大特征:封装、继承、多态
================================================================
一、封装
——合理隐藏
——合理暴露
隐藏不想被外界操作的field,方法和构造器
暴露一般就是希望给别人调用的方法
public class Person {
//使用private修饰成员变量,将这些变量隐藏起来
private String name;
private int age;
//提供方法来操作name成员变量
public void setName(String name) {
if (name.length() > 6 || name.length() < 2) {
System.out.println("您设置的人名不符合要求");
return;
} else {
this.name = name;
}
}
public String getName() {
return this.name;
}
//提供方法来操作age成员变量
public void setAge(int age) {
//执行合理性校验,要求用户年龄必须在0~100之间
if (age > 100 || age < 0) {
System.out.println("您设置的年龄不符合要求");
return;
} else {
this.age = age;
}
}
public int getAge() {
return this.age;
}
}
public class PersonTest2 {
public static void main(String[] args) {
Person p = new Person();
//因为age成员变量已经被隐藏了,所以下面语句将出现编译错误
//p.age=1000;
//下面语句编译不会出现错误,但运行时会出现提示“您设置的年龄不符合要求”
//程序不会修改p的age成员变量
p.setAge(1000);
//访问p的age成员变量也必须通过其对应的getter方法
//因为上面从未成功设置p的age成员变量,顾此处输出为0
System.out.println("未能设置age成员变量时:"+p.getAge());
//成功修改p的age成员变量
p.setAge(30);
//以为上面成功设置了p的age成员变量,故此处输出30
System.out.println("成员变量age成员变量后:"+p.getAge());
//不能直接操作p的那么成员变量,只能通过其对应的setter方法
//因为“东方工程师eeeeeeeeee”大于6个字符,所以显示“您设置的人名不符合要求”
p.setName("东方工程师eeeeeeeeee");
System.out.println("成员设置name成员变量后:"+p.getName());
//因为“东方工程师”正位于2~6个字符,所以显示“东方工程师”
p.setName("东方工程师");
System.out.println("成员设置name成员变量后:"+p.getName());
}
}
测试结果:
二、封装的目的
- 简化编程,隐藏类的细节
- 能更好地保证对象的完整性
- 让使用者只能通过事先预设的方法来访问数据,从而可以在该方法内添加控制逻辑,限制不合理的访问
- 便于修改,提高代码的可维护性
为了实现隐藏,我们有4个修饰符
private —— 当前类访问权限
没有访问权限修饰符 —— 包访问权限
protected —— 子类访问权限
public ——公共访问权限
private → 默认访问权限 → protected → public
private ——专门用于隐藏field
public —— 专门用于暴露方法
protected —— protected修饰的方法,通常是希望被它子类访问
默认 —— 希望在同一个包中被访问的成分
三、控制符的使用原则
- 类里面的绝大多数都应该是private修饰的,只有一些static修饰的、类似全局变量的成员变量,才考虑使用public修饰
- 有些方法只用于辅助实现该类的其他方法,这些方法被称为工具方法,工具方法也必须用private修饰
- 如果某个类主要用作其他类的父类,该类里包含的大部分方法可能仅希望被子类重写,而不想被外界直接调用,则应该使用protected修饰
- 类的构造器等一般希望给其他类调用的方法应该使用public修饰
四、局部变量
—— 它仅在方法内有效,甚至仅在代码块内有效
它的作用域本身就小的可怜,他连方法都出不了
所以它用访问权限修饰符都是多余的。
五、Java源程序的定义规则
package 包名:全部字母都是小写 0~1次
一旦在Java源程序中定义了该语句,该源文件中所有Java类都位于该包下
import 包.* 型号只能代表类 0~N次
用于导入指定包下的类。这样就允许在该源代码中使用这些类时,省略包名
import static 包……类.** 星号只能代表静态的field和静态方法 0~N次
用于导入指定类下所有静态成员 —— 包括静态filed和静态方法
六、Java的常用包
- java.lang:这个包下包含了Java语言的核心类,如String、Math、System和Thread类等,使用这个包下的类无需使用
- import语句导入,系统会自动导入这个包下的所有类。
- java.util:这个包下包含了Java的大量工具类/接口和集合框架类/接口,例如Arrays和List、Set等。
- java.net:这个包下包含了一些Java网络编程相关的类/接口。
- java.io:这个包下包含了一些Java输入、输出编程相关的类、接口。
- java.text:这个包下包含了一些Java格式化相关的类。
- java.sql:这个包下包含了Java进行JDBC数据库编程的相关类、接口。
- java.awt:这个包下包含了抽象窗口工具集(Abstract Window ToolKits)的相关类、接口,这些类主要用于构建图形用户界面(GUI)程序。
- java.swing:这个包下包含了Swing图形用户界面编程的相关类、接口,这些类可用于构建平台无关的GUI程序。