Day12:封装

任务:在控制台输出人员信息

关键步骤如下:
(1)将Person类的属性私有化。
(2)为私有属性添加setter/getter()方法。
(3)设置必要的读取限制。

封装概述

Java中封装的实质就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

封装反映了 事物的相对独立性,有效避免了外部错误对此对象的影响,并且能对对象使用者由于大意产生的错误操作起到预防作用。同样面向对象编程提倡对象之间实现松耦合关系。

封装的好处在于隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据可以方便地加入存取控制修饰符,来限制不合理操作。

提示:
松耦合就是指尽量减少对象之间的关联性,以降低它们之间的复杂性和依赖性。

封装的步骤

1. 修改属性的可见性

将Person类中的属性由public修改为private即可。

示例:将Person类的属性私有化。

public class Person {
	private String name;
	private String gender;
	private int age;
}

分析:将public 修改为private后,其他类就无法访问了,如果访问则需要进行封装的第二步。

2.设置setter/getter方法

可以手动添加setter/gettet()方法,也可以使用组合键Ctrl+Shift+S由系统添加。

示例:为Person类中的私有属性添加setter/getter()方法。

publie class PivatePerson{
	private String name;
	private String gender,
	private int age;

	public String getName() {
		return name;
	}
	pubic void setName(String name) {
	this.name= name;
	}
	public String getGender() {
	return gender;
	}
	public void setGender(String gender) {
	this.gender = gender;
	}
	public int getAge() {
	return age;
	}
	public void setAge(int age) {
	this.age = age;
	}
}

3.设置属性的存取限制

此时,还没有对属性值设置合法性检查,需要在setter方法中进一步利用条件判断语句进行赋值限制。

示例: 为setter方法设置限制。

public class Person {
	private String name;
	private String gender;
	private int age;
	public String getName() {
	return name;
	}
	public void setName(String name) {
	this.name=name;
	}
	public String getGender() {
	return gender;
	}
	public void setGender(String gender) {
	if(gender.equals(“男")||gender. equals.("女")){
	this.gender = gender;
	}else{
	System.out.println("**性别不合法!**);
	}
}
public int getAge( ){
	return age;
}
public void setAge(int age) {
	if(age<0 || age> 150){
	System.out.printn("*** 输入的年龄为: "+age+", 该年龄不合法, 将重置***");
	return;
	}
	this.age = age;
//构造方法

public Person() {
	this.name="无名氏";
	this.gender=" 男";
	this.age= 18;
Pubic Person(String name, String gender, int age) {
	this.name= name;
	this. gender =gender;
	this.age = age;
}
//方法:自我介绍

public void say() {
System.out.println("自我介绍一 下\r\n姓名:” + this.name+"\r\n性别:"+this.gender+"\r\n年龄:"+this.age+"岁");
	}
}
//以上为Person类定义代码,以下为调用代码
public static void main(String[] args()) {
	Person hanbing new Person();
	hanbing. setName("韩冰");
	hanbing.setAge(221);
	hanbing,setGender("中性");
	hanbing.say();
}

通过在setter方法中设置限制,避免了性别和年龄的误操作输入问题,这就是一个封装的典型实例。

任务:使用包改进信息输出

关键步骤如下。
➢新建包。
➢将定义好的类分别放入不同的包中。
➢导入包。

包的概述

Java中的包机制也是封装的一种形式。
包主要有以下3个方面的作用。
➢包允许将类组合成较小的单元(类似文件夹),易于找到和使用相应的类文件。
➢防止命名冲突: Java中只有在不同包中的类才能重名。不同的程序员命名同名的类在所难免。有了包,类名就容易管理了。A定义了一个类Sort,封装在包A中,B定了一个类Sort,封装在包B中。在使用时,为了区别A和B分别定义的Sort类,可以通过包名区分开,如A.Sort和B.Sort分别对应于A和B定义的sort类。
➢包允许在更广的范围内保护类、数据和方法。根据访问规则,包外的代码有可能不能访问该类。

包的定义

定义包的语法格式如下。
package包名;
1.package是关键字。
2.包的声明必须是Java源文件中的第一 条非注释性语句,而且一个源文件只能有个包声明语句, 设计的包需要与文件系统结构相对应。因此,在命名包时,要遵守以下编码规范。
(1)一个唯一的包名前缀通常是全部小写的ASCII字母,并且是一个顶级域名com、edu、 gov、 net 及org,通常使用组织的网络域名的逆序。例如,如果域名为javagroup.net,可以声明包为“package net.javagroup.mypackae;"。(2)包名的 后续部分依不同机构各自内部的规范不同而不同。这类命名规范可能以特定目录名的组成来区分部门、项目、机器或注册名,如“packagenet.javagroup.research. powerproject;” 。
其中:
research为项目名, powerproject为部门名
例如,下面的代码中,为Person类定义了包cn.kgc.pack1。

package cn.kgc.pack1;

public class Person {
	//..省略类的内部代码
}

包的使用

示例:使用包将Person类和PersonTest类进行分类。

//将Person类放入pack1包中
package cn.kgc.pack1;

public class Person {
	private String name;
	private String gender;
	private int age;
	//方法:自我介绍
public void say() {
	System.out.printn("自我介绍下\r\n 姓名:”+this.name + "\r\n性别:"+ this. gender + "\r\n年龄:+ this.age"岁");
	}
	//......省略类中其他代码
}
//将PersonTest类放入pack2包中
//使用Person类时,需要 使用import语句将其导入
package cn.kgc.pack2;
import cn.kgc.pack1.Person;
public class PersonTest {
	public static void main(String[] args){
		Person hanbing =new Person();
		hanbing.setName("韩冰");
		hanbing.setAge(22);
		hanbing.setGender("女");
		hanbing.say();

提示:
(1)声明包的含义是声明当前类所在的包。

(2)导入包的合义是声明在当前类中要使用到的其他类所在的包,

任务:使用访问修饰符

关键步骤如下。

1.使用访问修饰符修饰类。
2.使用访问修饰符修饰类成员。

类和类成员的访问控制

包实际上是一种访问控制机制,通过包来限制和制约类之间的访问关系。访问修饰符也同样可以限制和制约类之间的访问关系。
1.类的访问修饰符
在这里插入图片描述
public:同一包中可以使用,非同一包中也可以使用。
默认修饰符:只能在同一包中使用。
2.类成员的访问修饰符
在这里插入图片描述

static 关键字

一个类可以创建n 个对象。如果n个对象中的某些数据需要共用,就需要使用satic关键字修饰这些数据。

Java中,一般情况 下调用类的成员都需要先创建类的对象,然后通过对象进行调用。使用static关键字可以实现通过类名加“.”直接调用类的成员,不需要创建类的对象。使用static修饰的属性和方法属于类,不属于具体的某个对象。

1.用static关键字修饰属性
用satitc修饰的属性称为静态变量或者类变量,没有使用static修饰的属性称为实例变量。

例:将Person类的name、gender 和age属性保留,新建一个static修饰的属性,并调用。

分析如下。

使用satic 修饰的属性不依赖于任何对象,用类名直接加“.”调用即可。

猜你喜欢

转载自blog.csdn.net/sanjiang521/article/details/107501291