【Java】5.4 隐藏和封装

目录

一、封装

二、封装的目的

三、控制符的使用原则

四、局部变量

五、Java源程序的定义规则

六、Java的常用包


三大特征:封装、继承、多态

================================================================

一、封装

——合理隐藏

——合理暴露

 

隐藏不想被外界操作的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());
	}
}

测试结果:

二、封装的目的

  1. 简化编程,隐藏类的细节
  2. 能更好地保证对象的完整性
  3. 让使用者只能通过事先预设的方法来访问数据,从而可以在该方法内添加控制逻辑,限制不合理的访问
  4. 便于修改,提高代码的可维护性

 

为了实现隐藏,我们有4个修饰符

private —— 当前类访问权限

没有访问权限修饰符 —— 包访问权限

protected —— 子类访问权限

public ——公共访问权限

private → 默认访问权限 → protected → public

 

private ——专门用于隐藏field

public —— 专门用于暴露方法

protected —— protected修饰的方法,通常是希望被它子类访问

默认 —— 希望在同一个包中被访问的成分

 

三、控制符的使用原则

  1. 类里面的绝大多数都应该是private修饰的,只有一些static修饰的、类似全局变量的成员变量,才考虑使用public修饰
  2. 有些方法只用于辅助实现该类的其他方法,这些方法被称为工具方法,工具方法也必须用private修饰
  3. 如果某个类主要用作其他类的父类,该类里包含的大部分方法可能仅希望被子类重写,而不想被外界直接调用,则应该使用protected修饰
  4. 类的构造器等一般希望给其他类调用的方法应该使用public修饰

四、局部变量

—— 它仅在方法内有效,甚至仅在代码块内有效

它的作用域本身就小的可怜,他连方法都出不了

所以它用访问权限修饰符都是多余的。

 

五、Java源程序的定义规则

package 包名:全部字母都是小写 0~1次

一旦在Java源程序中定义了该语句,该源文件中所有Java类都位于该包下

import 包.* 型号只能代表类 0~N次

用于导入指定包下的类。这样就允许在该源代码中使用这些类时,省略包名

import static 包……类.** 星号只能代表静态的field和静态方法 0~N次

用于导入指定类下所有静态成员 —— 包括静态filed和静态方法

 

六、Java的常用包

  1. java.lang:这个包下包含了Java语言的核心类,如String、Math、System和Thread类等,使用这个包下的类无需使用
  2. import语句导入,系统会自动导入这个包下的所有类。
  3. java.util:这个包下包含了Java的大量工具类/接口和集合框架类/接口,例如Arrays和List、Set等。
  4. java.net:这个包下包含了一些Java网络编程相关的类/接口。
  5. java.io:这个包下包含了一些Java输入、输出编程相关的类、接口。
  6. java.text:这个包下包含了一些Java格式化相关的类。
  7. java.sql:这个包下包含了Java进行JDBC数据库编程的相关类、接口。
  8. java.awt:这个包下包含了抽象窗口工具集(Abstract Window ToolKits)的相关类、接口,这些类主要用于构建图形用户界面(GUI)程序。
  9. java.swing:这个包下包含了Swing图形用户界面编程的相关类、接口,这些类可用于构建平台无关的GUI程序。
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_之桐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值