面向对象基础7(包和封装)

面向对象三大特征——封装、集成、多态

封装

  1. 隐藏对象的内部实现细节

  2. 将一些公共操作的细节暴露
    如果通过暴露的界面操作对象,该对象的内部状态不会被破坏

简而言之,封装要求合理的隐藏,合理的暴露。

实现方式——访问控制符

private(类访问权限)——该修饰符修饰的成员,只能在该类中被访问

public(公共)——该修饰符修饰的成员可以在任意地方被访问

protected(子类访问权限)——该修饰符修饰的成员,能在该类,该类所在的包以及子类中被访问

默认——(包访问权限)——该修饰符所修饰的成员,只能在该类以及该类所在的包中被访问

private 默认 protected public
当前类
当前包
子类
任意

规范

  1. 一般的,成员变量(实例变量)一般用private修饰,为了隐藏实现细节
  2. 为每个成员变量提供gettersetter方法
  3. 需要暴露的公共方法需要用public修饰
  4. 如果希望一个方法主要用于被子类重写,用protected修饰

举例:

  1. package users;
  2. public class User {
  3. private String name;
  4. private int age;//此时成员变量name和age已经被封装,用户无法调用或是更改
  5. //用户名长度要求在6到10个字符之间
  6. public void setName(String name) {
  7. if (name.length() > 10 || name.length() < 6) {
  8. System.out.println("Error" + " " + name);
  9. return;
  10. }
  11. this.name = name;
  12. }
  13. public String getName() {
  14. return this.name;
  15. }
  16. //用户年龄要求在18到35岁之间
  17. public void setAge(int age) {
  18. if (age > 35 || age < 18) {
  19. System.out.println("不合需求的廉价劳动力" + " " + age);
  20. return;
  21. }
  22. this.age = age;
  23. }
  24. public int getAge() {
  25. return this.age;
  26. }
  27. }
  1. import users.User;
  2. public class UserTest {
  3. public static void main(String[] args) {
  4. User me = new User();
  5. me.setName("aa");
  6. me.setAge(20);
  7. System.out.println(me.getAge());
  8. User u = new User();
  9. System.out.println(me.getName());
  10. u.setName("gtn2333333");
  11. u.setAge(2);
  12. System.out.println(u.getName());
  13. System.out.println(u.getAge());
  14. }
  15. }
  16. /*
  17. Error aa
  18. 20
  19. null
  20. 不合需求的廉价劳动力 2
  21. gtn2333333
  22. 0
  23. */

包(package)

目的——解决同名类冲突问题

包包含所需的类

语法——推荐用公司域名倒写加项目名

定义包之后,其下类完整的类名变为包名.类名

导入包

import用于省略在某一类中调用别的包中的类所需要写的包名(省略写包名)

基本语法:import 包名.类名;——导入该包下的该类,例如import java.util.Scanner;

import 包名.类名.*——导入该包下的所有类,此处的*只能代表类名,包名不能用*

静态导入

import static用于导入指定类下面的所有静态成员(省略写类名)

基本语法:import static 包名.类名.静态成员名导入某包某类的某静态成员

  1. `import static 包名.类名.静态成员名`导入某包某类的所有静态成员
  1. import static java.lang.System.out;
  2. public class package {
  3. public static void main(String[] args) {
  4. out.println("2333");
  5. }
  6. }

此处导入的就是包(也可以形象的理解为公司)java.lang(language语言的缩写)的System类中的静态成员out,此时调用输出语句时可以省略类名System

Java源程序的结构

package语句要放在第一条

N条import语句

一个public class和若干个class