上次我为大家写出啦“package和import”包的导入和使用,导包是Java学习最基础操作,如没有了解透彻的话请打开下方文章在进行观看一下哦!!今天的话就要做好认真看一下咯,我们来说一下面向对象三大特性之“封装”。
【Java入门姿势【面向对象5】 package和import】
学习教程推荐:
- 1.北京高淇Java300集(Java强烈推荐)
Java300集零基础适合初学者视频教程_Java300集零基础教程_Java初学入门视频基础巩固教程_Java语言入门到精通 - 2.JavaSE基础全套-从零开始进阶之大神(推荐)
系统教学JavaSE基础全套课程-从0开始进阶至大神_线下录制Java系列课程Java从入门到精通_/JAVA基础/数组/OOP/集合/IO流_ - 3.Java常用类基础实战
【基础夯实】Java常用类实战基础教程_Java八大常用类核心基础_Java常用类基础入门/Java包装类/String类 - 4.Java基础入门必备数学知识【数据结构与算法】(推荐)
Java基础入门必学知识数据结构与算法_Java数据结构与算法基础到进阶/Java基础入门进阶/Java数据结构分析/Java数据结构常见问题_哔哩哔哩_bilibili - 5.Java面向对象编程_OOP基础深入讲解
Java面向对象编程重基础深入讲解_OOP面向对象Java基础干货分享/JavaSE/面向对象编程/OOP程序设计 - 6.GOF23种设计模式-23中设计模式详解课程
GOF23种设计模式讲解_Java gof23种设计模式详解课程_从单例到备忘录模式 23种模式详解
封装性
封装(encapsulation)是面向对象三大特征之一。对于程序合理的封装让外部调用更加方便,更加利于写作。同时,对于实现者来说也更加容易修正和改版代码。我们今天就来啃它~
1、引入封装概念
我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?或者有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。同理,汽车暴露离合、油门、制动和方向盘,驾驶员不需要懂原理和维修也可以驾驶。
需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。在说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
我们程序设计要追求“高内聚,低耦合”。 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;|
低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
编程中封装的具体优点:
- 提高代码的安全性。
- 提高代码的复用性。
- “高内聚”:封装细节,便于修改内部代码,提高可维护性。
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
未进行封装的代码演示:
class Person {
String name;
int age;
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Test {
public static void main(String[ ] args) {
Person p = new Person();
p.name = "小红";
p.age = -45;//年龄可以通过这种方式随意赋值,没有任何限制
System.out.println(p);
}
}
通过上方代码我们可以看到,年龄不可能是负数,也不可能超过130岁,但是如果没有使用封装的话,便可以给年龄赋值成任意的整数,这显然不符合我们的正常逻辑思维。那么如何使用正常的逻辑来编写呐?嘿~~嘿 ~~先放一下,来说下一个知识点。
2、权限修饰符
Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为private、默认、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。
下面详细讲述它们的访问权限问题。其访问权限范围如表所示:
1. private: 表示私有,只有自己类能访问
2. default:表示没有修饰符修饰,只有同一个包的类能访问
3. protected:表示可以被同一个包的类以及其他包中的子类访问
4. public:表示可以被该项目的所有包中的所有类访问
类的成员的处理:
- 一般使用private访问权限。
- 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。
- 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。
类的处理:
- 类只能使用public和默认来修饰
- 默认:当前包
- public:当前项目的所有包
- public类要求类名和文件名相同,一个java文件中至多一个public类
接下来让我们看一下,封装后的代码演示:
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
setAge(age);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//在赋值之前先判断年龄是否合法
if (age > 130 || age < 0) {
this.age = 18;//不合法赋默认值18
} else {
this.age = age;//合法才能赋值给属性age
}
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Test2 {
public static void main(String[ ] args) {
Person p1 = new Person();
//p1.name = "小红"; //编译错误
//p1.age = -45; //编译错误
p1.setName("小红");
p1.setAge(-45);
System.out.println(p1);
Person p2 = new Person("小白", 300);
System.out.println(p2);
}
}
从上面我们可以看到,Java未封装的代码显得是多么柔弱无力~大家可以编写一下试试。
3、封装练习
我们以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出版社名,价格;方法包括:信息介绍,来练习一下封装;
要求:
1) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问
2) 限定价格必须大于10,如果无效进行提示
3) 设计构造方法实现对属性赋值
4) 信息介绍方法描述图书所有信息
5) 编写测试类,测试图书类的对象及相关方法(测试数据信息自定)
写好啦没 没有的话,我这已经写好啦:“对Book进行封装”:
代码演示:
public class Book {
private String bookName;//书名
private String author;//作者
private String publisher;//出版社
private double price;//
public Book(){
//super();
}
public Book(String bookName,String author,String publisher,double price){
this.bookName = bookName;
this.author = author;
this.publisher = publisher;
//this.price = price;
this.setPrice(price);
}
public void setBookName(String bookName){
this.bookName = bookName;
}
public String getBookName(){
return this.bookName;
}
public void setAuthor(String author){
this.author = author;
}
public String getAuthor(){
return author;
}
public String getPublisher(){
return publisher;
}
public void setPublisher(String publisher){
this.publisher = publisher;
}
public void setPrice(double price){
if(price < 15){
this.price = 10;
System.out.println("价格必须大于10元,默认10元");
}else{
this.price = price;
}
}
public double getPrice(){
return this.price;
}
public void show(){
System.out.println("bookName="+bookName+",author="
+author+",price="+price+",publisher="+publisher);
}
public static void main(String[] args) {
//购买第一本书
Book book1 = new Book();
//book1.price = 3;
book1.setBookName("鹿鼎记");
book1.setAuthor("金庸");
book1.setPrice(7);
book1.setPublisher("清华大学出版社");
book1.show();
//购买第二本书
Book book2 =
new Book("倚天屠龙记","金庸","清华大学出版社",30);
book2.show();
System.out.println(book1.getBookName());
}
}
嘿~嘿~~感兴趣的同学快去试一下去~~
以上就是本章节所讲述的全部内容啦,稍后我在更新后续哦,喜欢的伙伴支持一下哦~
感谢观看~