目錄
一.封裝
1.封裝的作用和含義
2.編程中封裝的具體優點:
3.封裝的實作一使用訪問控制符
4.關于protected的兩個細節:
5.開發中封裝的簡單規則
6.javaBean
二.多型(polymorphism)
1.多型概念和實作
2.多型的要點
3.示例代碼
一.封裝
1.封裝的作用和含義
我要看電視,只需要按一下開關和換臺就可以了,有必要了解電視機內部的結構嗎?有必要碰碰顯像管嗎?制造廠家為了方便我們使用電視,把復雜的內部細節全部封裝起來,只給我們暴露簡單的介面,比如:電源開關,具體內部是怎么實作的,我們不需要操心,需要讓用戶知道的才暴露出來,不需要讓用戶知道的全部隱藏起來, 這就是封裝,說的專業一點,封裝就是把物件的屬性和操作結合為一個獨立的整體, 并盡可能隱藏物件的內部實作細節,我們程式設計要追求“高內聚,低耦合",高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合是僅暴露少量的方法給外部使用,盡量方便外部呼叫,
2.編程中封裝的具體優點:
提高代碼的安全性,
提高代碼的復用性,
“高內聚” :封裝細節,便于修改內部代碼,提高可維護性,
"低耦合”: 簡化外部呼叫,便于呼叫者使用,便于擴展和協作,
3.封裝的實作一使用訪問控制符
Java是使用“訪問控制符”來控制哪些細節需要封裝,哪些細節需要暴露的,Java中4種“訪問控制符”分別為private、default、 protected、 public ,它們說明了面向物件的封裝性,所以我們要利用它們盡可能的讓訪問權限降到最低,從而提高安全性,下面詳細講述它們的訪問權限問題,其訪問權限范圍如下圖所示,

(1)private表示私有,只有自己類能訪問
(2)default表示沒有修飾符修飾,只有同一個包的類能訪問
(3)protected表示可以被同一個包的類以及其他包中的子類訪問
注:public static 和 static的區別:
其實就是訪問權限的區別,一個是public,一個是default,
4.關于protected的兩個細節:
1.若父類和子類在同一個包中,子類可訪問父類的 protected成員,也可訪問父類物件的protected成員,
2.若子類和父類不在同一個包中,子類可訪問父類的protected成員,不能訪問父類物件的protected成員,
eg:
首先兩個類在不同的包里,
代碼:
Test1.java
public class Test1 {
private int testPrivate=100;
int testDefault=200;
protected int testProtected=300;
public void test(){
System.out.println(this.testPrivate);//只有本類可以用私有成員
System.out.println(this.testDefault);//同一個包的類就能用默認成員
}
}
Test2.java
import com.company.Test.a.Test1;
public class Test2 extends Test1{
public void fun(){
System.out.println(super.testProtected);//子類可訪問父類的protected成員
}
public static void main(String[] args) {
Test1 test1=new Test1();
test1.test();
Test2 test2=new Test2();
test2.fun();
//System.out.println(test.testProtected); 報錯,即不能訪問父類物件的protected成員
}
}
輸出:
100
200
300
5.開發中封裝的簡單規則
一般使用private訪問權限,
提供相應的 get/set方法來訪問相關屬性,,這些方法通常是public修飾的, 以提供對屬性的賦值與讀取操作(注意: boolean變數的get方法是is開頭! ),
一些只用于本類的輔助性方法可以用private修飾,希望其他類呼叫的方法用public修飾,
6.javaBean
一個簡單的javaBean例子:
函式直接右鍵--》Generate生成即可,也可快捷鍵Alt+Insert來快速打開Generate,idea很智能,如果沒有用右鍵生成的話,直接打一個set或者get也會出來相應的快捷生成函式提示,不得不說idea是真的智能,
public class Person {
private String age;
private String name;
private boolean flag;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
二.多型(polymorphism)
1.多型概念和實作
多型指的是同一個方法呼叫,由于物件不同可能會有不同的行為,現實生活中,同一個方法,具體實作會完全不同,比如: 同樣是呼叫人的“休息”方法,張三是睡覺,李四是旅游,高淇老師是敲代碼,數學教授是做數學題;同樣是呼叫人 “吃飯”的方法,中國人用筷子吃飯,英國人用刀叉吃飯,印度人用手吃飯,
2.多型的要點
(1)多型是方法的多型,不是屬性的多型(多型與屬性無關)
(2)多型的存在要有3個必要條件:繼承,方法重寫,父類參考指向子類物件,
(3)父類參考指向子類物件后,用該父類參考呼叫子類重寫的方法,此時多型就出現了,
3.示例代碼
通過代碼來體會多型的好處:如果沒有多型,有些地方就需要大量的重寫!
里面還有型別轉化的一些知識,順便看了,
public class Animals {
public void shout(){
System.out.println("叫了一聲!");
}
//用static宣告,animalShout()就是類方法,所以可以直接用函式名呼叫!!!!
public static void animalShout(Animals a){ //到了這里相當于將傳入的具體的動物類轉化為Animals類
a.shout();//這里會呼叫傳入的具體的動物類的shout()函式
}
public static void main(String[] args) {
Cat cat=new Cat();
cat.catchMouse();
animalShout(cat);
//Dog dog=(Dog)cat;轉換不了
Animals a=new Dog();//向上型別轉換,自動的
Dog dog=(Dog)a;//強制型別轉換,向下型別轉換
dog.guard();
//報錯,因為此時a已經轉為Dog型別了,所以不能轉換為Cat
//Cat cat1=(Cat)a;
//cat1.catchMouse();
}
}
//多型的存在要有3個必要條件:繼承,方法重寫,父類參考指向子類物件,
class Dog extends Animals{
@Override
public void shout() {
System.out.println("汪汪汪!");
}
public void guard(){
System.out.println("狗看門!");
}
}
class Cat extends Animals{
@Override
public void shout() {
System.out.println("喵喵喵");
}
public void catchMouse(){
System.out.println("貓抓老鼠!");
}
}
class Mouse extends Animals{
@Override
public void shout() {
System.out.println("吱吱吱");
}
}
輸出:
貓抓老鼠!
喵喵喵
狗看門!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271322.html
標籤:java
