1、Java中的多態(tài)
對象的多種形態(tài)
- 引用多態(tài)
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象
package exp;
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
animal obj1=new animal();
animal obj2=new dog(); // 父類的的引用是可以指向子類對象的
// dog obj3=new animal(); 這種方式是錯誤的
}
}
- 方法多態(tài)
創(chuàng)建本類對象時,調(diào)用的方法為本類方法
創(chuàng)建子類對象是,調(diào)用的方法為子類重寫的方法或者繼承的方法
package exp;
public class animal {
public void eat(){
System.out.println("動物具有吃的能力");
}
}
package exp;
public class dog extends animal {
public void eat(){
System.out.println("狗要吃屎");
}
public void watchDoor(){
System.out.println("狗會看門");
}
}
package exp;
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
animal obj1=new animal();
animal obj2=new dog(); // 父類的的引用是可以指向子類對象的
animal obj3=new cat();
// dog obj3=new animal(); 這種方式是錯誤的
obj1.eat();
obj2.eat();
obj3.eat(); //方法的多態(tài)
//obj2.watchDoor(); 錯!不能通過父類的引用調(diào)用子類的方法
}
}
package exp;
public class cat extends animal {
}
package traffic;
public class Initail
public static void main(String[] args){
Traffic obj1=new Traffic();
Traffic obj2=new Bus();
Traffic obj3=new Plane();
Traffic obj4=new Ship();
obj1.function();
obj2.function();
obj3.function();
obj4.function();
}
}
package traffic;
public class Bus extends Traffic {
public void function(){
System.out.println("公交車可以運輸32人");
}
}
package traffic;
public class Plane extends Traffic {
public void function(){
System.out.println("飛機(jī)可以運輸108人");
}
}
省略......
2、多態(tài)中的引用類型轉(zhuǎn)換
1、向上類型轉(zhuǎn)換(隱式/自動類型轉(zhuǎn)換),是小類型到大類型的轉(zhuǎn)換
2、向下類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換),是大類型到小類型
3、instance of運算符,來解決引用對象的類型,避免類型轉(zhuǎn)換的安全問題
(判斷一個引用是否是某個類型或者某個類型的子類型,會返回一個bool值)
public class Initail {
public static void main(String[] args) {
dog d=new dog();
animal ani=d; //自動類型提升,向上類型轉(zhuǎn)換
//dog d2=animal; 這樣是錯誤的
dog d2=(dog)ani; //向下類型轉(zhuǎn)換,強(qiáng)制類型轉(zhuǎn)換,存在風(fēng)險
//cat ca=(cat)ani; //1、編譯時cat類型2、運行時dog類型
if(ani instanceof cat){
cat ca=(cat)ani;
}else{
System.out.println("無法進(jìn)行類型轉(zhuǎn)換");
}
}
}
3、Java中的抽象類
1、語法定義
抽象類前使用abstract關(guān)鍵字修飾,則該類為抽象類
2、應(yīng)用場景
a、在某些情況下,某個父類只是知道其子類應(yīng)該包含怎樣的方法,但無法準(zhǔn)確知道這些子類如何實現(xiàn)這些方法
b、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設(shè)計的隨意性
3、作用
限制規(guī)定子類必須實現(xiàn)某些方法,但不關(guān)注實現(xiàn)細(xì)節(jié)
4、使用規(guī)則
a、abstract定義抽象類
b、abstract定義抽象類方法,只有聲明,不需要實現(xiàn)
c、包含抽象方法的類是抽象類
public abstract class Telphone {
public abstract void call();
public abstract void message();
}
public class cellphone extends Telphone {
public void call() {
// TODO Auto-generated method stub
System.out.println("通過鍵盤來打電話");
}
public void message() {
// TODO Auto-generated method stub
System.out.println("通過鍵盤來發(fā)短信");
}
}
public class iphone extends Telphone {
public void call() {
// TODO Auto-generated method stub
System.out.println("通過語音來打電話");
}
public void message() {
// TODO Auto-generated method stub
System.out.println("通過語音來發(fā)短信");
}
}
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new cellphone();
tel1.call();
tel1.message();
Telphone tel2=new iphone();
tel2.call();
tel2.message();
}
}
4、Java中的接口
1、接口的概念
接口可以理解為一種特殊的類,有全局常量和公共的抽象方法組成
類是一種具體實現(xiàn)體,而接口定義了某一批類所需要遵守的規(guī)范,接口不關(guān)心這些類的內(nèi)部數(shù)據(jù),也不關(guān)心這些類里方法的細(xì)節(jié),它只關(guān)心這些類里必須提供某些方法
和類定義不同,定義接口不再使用class關(guān)鍵字,而是使用interface關(guān)鍵字
2、接口定義的基本語法:
[修飾符]interface 接口名 [extends 父接口1,父接口2...]//中括號表示可以不進(jìn)行繼承父接口
{
零個到多個常量定義...
零個到多個抽象方法的定義...
}
接口就是用來被繼承、被實現(xiàn)的、修飾符一般建議用public
注意:不能使用private和protected修飾接口
接口里面的內(nèi)容都是常量或者抽象方法,所以接口在定義是一定有abstract
3、接口定義
- 常量:
接口中的屬性是常量,即使定義時不添加public static final修飾符,系統(tǒng)也會自動添加 - 方法
接口中的方法只能是抽象方法,總是使用,即使定義時不添加public abstract修飾符,系統(tǒng)也會自動添加
4、使用接口
一個類可以實現(xiàn)一個或者多個接口,實現(xiàn)接口使用implements關(guān)鍵字,Java中一個類只能繼承一個父類,是不夠靈活的,通過實現(xiàn)多個接口可以做補(bǔ)充
繼承父類實現(xiàn)接口的語法為:
[修飾符]class 類名 extends 父類 implements接口1,接口2....{
類體部分//如果繼承了抽象類,需要實現(xiàn)繼承的抽象方法;要實現(xiàn)接口中的抽象方法。
}
如果要繼承父類,繼承父類必須在實現(xiàn)接口之前
public interface IPlaygame {
public void playGame();
}
public class iphone extends Telphone implements IPlaygame{
public void call() {
// TODO Auto-generated method stub
System.out.println("通過語音來打電話");
}
public void message() {
// TODO Auto-generated method stub
System.out.println("通過語音來發(fā)短信");
}
public void playGame() {
// TODO Auto-generated method stub
System.out.println("具有了玩游戲的功能");
}
}
public class Psp implements IPlaygame {
public void playGame() {
// TODO Auto-generated method stub
System.out.println("具有了玩游戲的功能");
}
}
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
IPlaygame ip1=new iphone();
ip1.playGame();
IPlaygame ip2=new Psp();
ip2.playGame();
}
}
使用接口
接口還經(jīng)常與匿名內(nèi)部類配合使用
匿名內(nèi)部類就是沒有名字的內(nèi)部類
多用于關(guān)注實現(xiàn)而不關(guān)注實現(xiàn)類的名稱
語法格式:
Interface i=new Interface(){
public void method(){
System.out.println("匿名內(nèi)部類實現(xiàn)接口的方式");
}
};
5、UML簡介
1、UML概念
Unified Modeling Language(UML)又稱統(tǒng)一建模語言或標(biāo)準(zhǔn)建模語言
是一個支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言,為軟件開發(fā)的所有階段提供模型化和可視化支持
2、UML圖示
UML2.2中一共定義了14種圖示(diagram)
3、常用UML圖
- 用例圖(The Use Case Diagram)
用例圖能夠以可視化的方式,表達(dá)系統(tǒng)如何滿足所收集的業(yè)務(wù)規(guī)則,以及特定的用戶需求等信息 - 序列圖(The Sequence Diagram)
序列圖用于按照交互發(fā)生的一系列順序,顯示對象之間的這些交互 -
類圖(The Class Diagram)
UML類圖、業(yè)務(wù)邏輯和所有支持結(jié)構(gòu)一同被用于定義全部的代碼結(jié)構(gòu)
4、UML建模工具
Visio、Rational Rose、PowerDesign三種建模工具應(yīng)用最廣
Paste_Image.png