java封装
面向对象三大特性之一 封装
为什么有封装?
先看这样的一段代码,定义了一个宠物狗狗类和企鹅类,在main中输出相关信息
/*
宠物狗狗类
*/
package cn.zhz.Kind.dh;
public class Dog {
public String name = "无名氏";
public int health = 100;
public int love = 0;
public String strain = "聪明的拉布拉多犬";
/*
输出狗狗的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是一只" + this.strain + ".");
}
}
package cn.zhz.Kind.dh;
public class Penguin {
public String name = "无名氏";
public int health = 100;
public int love = 0;
public String sex = "Q仔";
/*
输出企鹅的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是的性别是" + this.sex + ".");
}
}
package cn.zhz.Case.dh;
import cn.zhz.Kind.dh.Dog;
import cn.zhz.Kind.dh.Penguin;
public class PetTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.health = -1000;
dog.love = 3;
dog.name = "多多";
dog.strain = "吉娃娃";
dog.print();
Penguin penguin = new Penguin();
penguin.health = -1000;
penguin.love = 3;
penguin.name = "Q仔";
penguin.sex = "女";
penguin.print();
}
}
在这段代码中运行是没有错误的,但是还有不足的地方,dog和penguin的属性用户可以通过.
的方法来访问到,如果用户随意赋值就会造成错误,所以需要将这些属性隐藏起来,那么将这些属性和方法隐藏起的就叫封装。这个过程就像家庭中复杂的电路和网线,对于施工者关注的是将电路和网线隐藏起来在外面只留一个接口即可,这样做既安全又便捷,当用户想要插电时只需要调用这个接口即可根本不需要关注电路和网线是如何实现的。
- 封装的理解:
通过上面的举例,所谓的封装就是将类的某些信息隐藏在类的内部,不允许外部的程序直接访问到,而是通过该类提供的方法来实现对隐藏信息的操作和访问 - 封装的原则
将所有的属性都隐藏起来
把尽可能多的东西藏起来,对外提供便捷的接口
如何实现封装?
- 封装的大致步骤
1.程序类中去修改属性的可见性,将属性的可见性设置为private,防止错误赋值和修改
2.创建公有的getter和setter方法,这两个方法是用来属性的读写操作
3.在getter和setter方法中加入属性控制语句,对属性值的合法进行判断
/*
宠物狗狗类
*/
package cn.zhz.Kind.dh;
public class Dog {
private String name = "无名氏";
//1.隐藏属性
private int health = 100;
private int love = 0;
private String strain = "聪明的拉布拉多犬";
//2.添加属性的读取方法 setter和getter方法
//setter方法就实现了属性的赋值和属性的正确判断
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("宠物狗狗的健康值只能在0-100之间");
this.health = 60;
return;
} else {
this.health = health;
}
}
//getter方法是用来属性取值的
public int getHealth() {
return this.health;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setLove(int love) {
if (love < 0 || love > 100) {
System.out.println("宠物狗狗的亲密度只能在0-100之间");
this.love = 60;
return;
} else {
this.love = love;
}
}
//getter方法是用来属性取值的
public int getLove() {
return this.love;
}
public void setStrain(String strain) {
this.strain = strain;
}
public String getStrain() {
return this.strain;
}
/*
输出狗狗的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.gethealth + "\n和主人的亲密度是" + this.love + "\n我是一只" + this.strain + ".");
}
}
package cn.zhz.Case.dh;
import cn.zhz.Kind.dh.Dog;
//import cn.zhz.Kind.dh.Penguin;
public class PetTest {
public static void main(String[] args) {
Dog dog = new Dog();
// dog.health = -1000;
dog.setHealth(78);
dog.setName("多多");
dog.setLove(89);
dog.setStrain("拉布拉多");
// dog.love = 3;
// dog.name = "多多";
// dog.strain = "吉娃娃";
dog.print();
// Penguin penguin = new Penguin();
// penguin.health = -1000;
// penguin.love = 3;
// penguin.name = "Q仔";
// penguin.sex = "女";
// penguin.print();
}
}
封装有哪些好处?
封装有便于使用者正确使用系统,防止错误修改和赋值,有助于系统之间的松耦合,提高系统的独立性,提高了软件的可重用性,便于功能的扩展和复用。
封装练习
package cn.zhz.Kind.dh;
/*
宠物企鹅类
*/
public class Penguin {
private String name = "无名氏";
private int health = 100;
private int love = 0;
private String sex = "Q仔";
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("宠物企鹅的健康值只能在0-100之间");
this.health = 60;
return;
} else {
this.health = health;
}
}
public int getHealth() {
return this.health;
}
public void setLove(int love) {
if (love < 0 || love > 100) {
System.out.println("宠物企鹅的亲密度只能在0-100之间");
this.love = 60;
return;
} else {
this.love = love;
}
}
public int getLove() {
return this.love;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return this.sex;
}
/*
输出企鹅的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是一只" + this.sex + ".");
}
}
package cn.zhz.Case.dh;
import cn.zhz.Kind.dh.Dog;
import cn.zhz.Kind.dh.Penguin;
public class PetTest {
public static void main(String[] args) {
// Dog dog = new Dog();
dog.health = -1000;
// dog.setHealth(78);
// dog.setName("多多");
// dog.setLove(89);
// dog.setStrain("拉布拉多");
// dog.love = 3;
// dog.name = "多多";
// dog.strain = "吉娃娃";
// dog.print();
Penguin penguin = new Penguin();
penguin.setName("张三");
penguin.setHealth(89);
penguin.setLove(67);
penguin.setSex("企鹅");
penguin.print();
}
}