一.封裝性
1.面向?qū)ο筮@個(gè)編程思想,有三個(gè)基本特征:
① 封裝
② 繼承
③ 多態(tài)
2.什么是封裝性?
生活中,快遞包裹,通常需要用袋子或箱子裝起來(lái)。
目的:① 包含的內(nèi)部商品,不會(huì)被損壞
? ? ? ? ? ?② 可以包含隱私
? ? ? ? ? ?③ 運(yùn)輸更方便
所以,代碼也要考慮這些因素:
① 隱私 -> 安全,當(dāng)某個(gè)類的代碼,內(nèi)部某些成員不希望外部知曉,或者隨意的更改,那么就可以進(jìn)行適當(dāng)?shù)姆庋b
② 外部使用更方便
比如:生活中,洗衣機(jī),只會(huì)留出幾個(gè)簡(jiǎn)單的按鈕和進(jìn)水口,出水口,放衣服的入口這幾個(gè),它隱藏了內(nèi)部復(fù)雜的結(jié)構(gòu)。
代碼中,String類,它內(nèi)部的結(jié)構(gòu)和實(shí)現(xiàn)是很復(fù)雜的,但是我們就算不是特別清除每一個(gè)內(nèi)部實(shí)現(xiàn),也不影響我們簡(jiǎn)單的使用
把代碼控制在它的合理的可見性范圍內(nèi),就是封裝。
3.如何實(shí)現(xiàn)封裝?
必須依賴于權(quán)限修飾符,或者又稱為訪問(wèn)控制修飾符。
4.權(quán)限修飾符有哪些?
public,protected,缺省,private
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??本類? ? ? ? ? ? ? ? 本包的其他類? ? ? ? ? ? ? ? 其他包的子類中? ? ? ? ? ? 其他包的非子類
private? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ?×? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?×? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ×
缺省? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?×? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??×
protected? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?×
public? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?√?
5.權(quán)限修飾符的使用要注意
① 如果權(quán)限修飾符是在class前面(這里暫不討論內(nèi)部類),只能是public或缺省
② 如果權(quán)限修飾符是在類的成員前面(成員變量,成員方法等),四種都可以
二.成員變量選擇那種權(quán)限修飾符?
1.實(shí)際應(yīng)用中,習(xí)慣上,先聲明為private。稱為屬性私有化。
但是如果確實(shí)這個(gè)成員變量需要擴(kuò)大它的可見性范圍,那么可以把private修改為其他合適的修飾符。
例如:擴(kuò)大到本包,那么就是缺省的。
例如:擴(kuò)大到其他包的子類中,那么就是protected
例如:擴(kuò)大到其他包的非子類中,那么就是public
2.為什么要使用權(quán)限修飾符?
因?yàn)閷傩云鋵?shí)就是代表對(duì)象的“數(shù)據(jù)”,那么對(duì)象的數(shù)據(jù)是非常重要的,不應(yīng)該完全暴露,至少要可控。
3.如何使用私有化的屬性?
如果這個(gè)屬性確實(shí)要被外部使用,需要提供get或set方法。
get方法:供調(diào)用者獲取屬性值的方法
set方法:供調(diào)用者修改屬性值的方法
4.get/set方法要注意的地方:
① 如果方法中有局部變量(也就是形參)與對(duì)象的實(shí)例變量“重名”,那么需要在實(shí)例變量的前面加“this.”。如果沒有重名問(wèn)題,在實(shí)例變量前面可以加“this.”,也可以不加“this.”。
② get/set的方法名,通常都是
get + 屬性名,并且屬性名的首字母大寫
set + 屬性名,并且屬性名的首字母大寫
③ 如果屬性是boolean類型,那么它對(duì)應(yīng)的方法,就會(huì)把get單詞換成? is
Student類代碼:
package com.atguigu.encapsulability;
public class Student {
private String name;
private int score;
private int age;
private boolean marry;
//快捷鍵,自動(dòng)生成get/set
//在要寫get/set方法的位置,鼠標(biāo)的光標(biāo)不要定位錯(cuò)位置了
//按快捷鍵 Alt + Insert,部分同學(xué)需要同時(shí)按Fn
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
//加條件判斷,加邏輯的控制
if(age<=20 || age>=35){
return;
// throw new IllegalArgumentException(age +"非法");
}
this.age = age;
}
public boolean isMarry() {
return marry;
}
public void setMarry(boolean marry) {
this.marry = marry;
}
}
對(duì)屬性加上權(quán)限修飾符的話,也就是屬性私有化,可以保證屬性(數(shù)據(jù))的安全,比如說(shuō)設(shè)置屬性值的時(shí)候,屬性私有化就可以在set方法上加條件判斷,看上述代碼。
TestField類代碼:
package com.atguigu.encapsulability;
public class TestField {
public static void main(String[] args) {
Student s1 = new Student();
/* s1.name = "張三";
s1.score = 89;
s1.age = 23;
//以上代碼正常使用沒問(wèn)題,但是如果出現(xiàn)以下代碼
s1.score = -89;
s1.age = -23;//沒有設(shè)置權(quán)限修飾符,可以隨便更改屬性值(數(shù)據(jù))
//這樣寫,邏輯上有問(wèn)題,語(yǔ)法上沒法控制*/
//這里是調(diào)用者的角色,調(diào)用s1學(xué)生對(duì)象的姓名name的get和set
System.out.println("修改之前,姓名:" + s1.getName());
s1.setName("張三");
System.out.println("修改之后,姓名:" + s1.getName());
System.out.println("修改之前,年齡:" + s1.getAge()) ;
s1.setAge(-23);
System.out.println("修改之后,年齡:" + s1.getAge()) ;
}
}
練習(xí)1:
(1)定義矩形類Rectangle,
- 聲明實(shí)例變量長(zhǎng)和寬,全部私有化private,
- 提供相應(yīng)的get/set方法,如果set方法的參數(shù)值<=0,則提示矩形的長(zhǎng)和寬必須是正數(shù)
- 聲明public double area(),返回矩形面積
- 聲明public double perimeter():返回矩形的周長(zhǎng)
- 聲明public String getInfo():返回矩形的長(zhǎng)、寬、面積、周長(zhǎng)信息
(2)測(cè)試類的main中創(chuàng)建一個(gè)可以裝3個(gè)矩形對(duì)象的數(shù)組,并調(diào)用set方法為對(duì)象的屬性賦值,依次長(zhǎng)是8,7,6,寬是2,3,4
- 遍歷輸出矩形對(duì)象數(shù)組
- 按照矩形對(duì)象的length屬性值從小到大排序后,遍歷輸出矩形對(duì)象數(shù)組
- 按照矩形對(duì)象的面積從小到大排序后,遍歷輸出矩形對(duì)象數(shù)組
編寫代碼的習(xí)慣:先寫所有的成員變量的聲明,再寫方法
Rectangle類代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-451554.html
public class Rectangle {
private double length;
private double width;
public double getLength() {
return length;
}
public void setLength(double length) {
if(length<=0){
System.out.println("長(zhǎng)方形的長(zhǎng)必須是正數(shù)");
return;//結(jié)束當(dāng)前方法的執(zhí)行,那么 this.length = length;就不執(zhí)行了
}
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
if(width<=0){
System.out.println("長(zhǎng)方形的寬必須是正數(shù)");
return;//結(jié)束當(dāng)前方法的執(zhí)行,那么 this.width = width;就不執(zhí)行了
}
this.width = width;
}
public double area(){
return length * width;
}
public double perimeter(){
return 2 * (length + width);
}
public String getInfo(){
return "長(zhǎng):" + length +",寬:" + width +",面積:" + area() +",周長(zhǎng):" + perimeter();
}
}
TestRectangle類代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-451554.html
public class TestRectangle {
public static void main(String[] args) {
Rectangle[] arr = new Rectangle[3];
System.out.println("排序之前:");
for (int i = 0; i < arr.length; i++) {
arr[i] = new Rectangle();
arr[i].setLength(8-i);
arr[i].setWidth(2+i);
System.out.println(arr[i].getInfo());
}
System.out.println("按照l(shuí)ength從小到大排序:");
for(int i = 1; i < arr.length; i++) {
for(int j = 0; j < arr.length-i; j++) {
if(arr[j].getLength() > arr[j+1].getLength()){
Rectangle temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getInfo());
}
System.out.println("按照面積從小到大排序:");
for(int i = 1; i < arr.length; i++) {
for(int j = 0; j < arr.length-i; j++) {
if(arr[j].area() > arr[j+1].area()){
Rectangle temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getInfo());
}
}
}
到了這里,關(guān)于面向?qū)ο蟮奶卣髦唬悍庋b的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!