java封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
对象的概念
要想使用面向对象(OOP),一定要搞清楚对象的三个主要特性:
- 对象的行为——可以对对象施加哪些操作,或者对对象施加哪些方法?
- 对象的状态——当施加那些方法时,对象如何相应?
- 对象标识——如何辨别具有相同行为与状态的不同对象?
对象的行为是指在类中我们定义的一些方法,而对象的状态则是类中定义的一些属性,每一个对象都是独立的个体,他们即使行为和状态完全一致,也是拥有不同的对象标识来代表他们本身,就像我们人一样,每个人都是独立的个体,都有自己的身份证来表明身份。
初识封装
封装是将一些代码块(如方法和属性)封装成“对象”,这些“对象”可以类比为我们现实中的各个东西,比如一个人,就可以看成一个对象,那么这个人会有他的属性,比如说性别,年龄,名字等等,当然也会有他的一些行为,比如吃饭,睡觉,打游戏等等。而在java面向对象中,我们把class(类)比作人,代表类别,而对象比作具体的是哪个人,代表实例。
下面配合代码来理解一下:
public class Person {
private String name;
private String sex;
private int age;
void eat(){
System.out.println("我去吃饭拉");
}
void sleep(){
System.out.println("我去睡觉拉");
}
void playGame(){
System.out.println("我去打游戏拉");
}
public static void main(String[] args) {
Person p = new Person();
p.name = "楷楷";
p.sex = "男";
p.age = 23;
System.out.println(String.format("我叫%s,今年%d岁,性别%s",p.name,p.age,p.sex));
p.eat();
p.sleep();
p.playGame();
}
}
输出结果:
我叫楷楷,今年23岁,性别男
我去吃饭拉
我去睡觉拉
我去打游戏拉
在上面的代码,我们总共干了几件事:
- 创建了一个类叫做Person
- 在类中我们定义了三个属性和三个方法,分别是姓名、年龄、性别和吃饭、睡觉、打游戏
- 写上一个main方法,给程序执行开个入口
- 在main方法中,我们创建一个Person的实例对象,并且给这个对象的姓名、年龄、性别分别赋值,接着再进行输出
- 分别调用对象的三个方法,观察输出结果
怎么样,还好理解吧?我们可以控制每个实例去做什么事,或者获取这个实例的属性。
构造器
假如我们不希望每次都通过对象的属性一个一个的赋值,那么我们可以借助一个东西叫做构造器。
首先来了解一下构造器是什么?
构造器其实可以理解为一个特殊的方法,这个方法没有返回值,方法名称和类名完全一致,并且会在类被实例化的时候被自动调用,通常用来作为初始化一些属性使用。
构造器的分类
- 无参构造器
- 有参构造器
其实就是一个没参数,一个有参数拉
下面我们把刚才的代码改造一下,用构造器来给我们的对象进行初始化属性
public class Person {
private String name;
private String sex;
private int age;
public Person(){ // 无参构造器
this.name = "楷楷";
this.sex = "男";
this.age = 23;
}
void eat(){
System.out.println("我去吃饭拉");
}
void sleep(){
System.out.println("我去睡觉拉");
}
void playGame(){
System.out.println("我去打游戏拉");
}
public static void main(String[] args) {
Person p = new Person();
System.out.println(String.format("我叫%s,今年%d岁,性别%s",p.name,p.age,p.sex));
p.eat();
p.sleep();
p.playGame();
}
}
输出结果:
我叫楷楷,今年23岁,性别男
我去吃饭拉
我去睡觉拉
我去打游戏拉
很方便吧?这种是无参构造器的写法,我们会发现,每次创建的对象默认都给这个对象赋了属性,万一我这个对象不想叫楷楷怎么办呢?那么下面就是该有参数构造器登场;
public class Person {
private String name;
private String sex;
private int age;
public Person(String name,String sex,int age){ // 有参构造器
this.name = name;
this.sex = sex;
this.age = age;
}
void eat(){
System.out.println("我去吃饭拉");
}
void sleep(){
System.out.println("我去睡觉拉");
}
void playGame(){
System.out.println("我去打游戏拉");
}
public static void main(String[] args) {
Person p = new Person("楷楷","男",23);
System.out.println(String.format("我叫%s,今年%d岁,性别%s",p.name,p.age,p.sex));
p.eat();
p.sleep();
p.playGame();
}
}
输出结果:
我叫楷楷,今年23岁,性别男
我去吃饭拉
我去睡觉拉
我去打游戏拉
Getter和Setter方法
假如我现在,我不想用构造器赋值,也不想手动赋值,那么我们也可以定义一些属性的Getter和Setter方法来实现对属性的获取和设置。这种方法更符合我们OOP的原则,也是经常会被使用的一种方式。
这边教大家一个快捷生成Getter和Setter的方法,首先你要是编辑器IDEA,当然别的像eclipse的应该也可以,我们这边拿IDEA来举例:
1.在类中右键找到,Generate
2.点击选择Getter and Setter
3.选中所有的属性,点击OK
4.getter和setter方法已自动生成代码如下
然后我们利用生成的方法就可以对应的给我们的属性设置值拉:
public class Person {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(){
}
public Person(String name, String sex, int age){ // 有参构造器
this.name = name;
this.sex = sex;
this.age = age;
}
void eat(){
System.out.println("我去吃饭拉");
}
void sleep(){
System.out.println("我去睡觉拉");
}
void playGame(){
System.out.println("我去打游戏拉");
}
public static void main(String[] args) {
Person p = new Person();
p.setName("楷楷");
p.setSex("男");
p.setAge(23);
System.out.println(String.format("我叫%s,今年%d岁,性别%s",p.getName(),p.getAge(),p.getSex()));
p.eat();
p.sleep();
p.playGame();
}
}
输出结果:
我叫楷楷,今年23岁,性别男
我去吃饭拉
我去睡觉拉
我去打游戏拉
那么以上是我们如何使用封装来创建一个类和对象,下篇开始介绍类和类之间的一些关系。