在此論壇第一天 Java 多型 抽象類 介面 final
阿新 • • 發佈:2019-02-02
博主為初學者 只為記錄每天學習的點點滴滴內容有很大的侷限性,希望諒解
所謂多型:
一個引用(型別)指向父類的指標用來呼叫不同子類實現的方法
優點:所有繼承父類的子類都可以由父類的例項化統一訪問。若子類無父類對應方法直接呼叫父類方法。
Java允許父類的引用變數引用它子類的例項(物件)某些情況下子類也可以轉化為父類(有一定的條件)
在上面程式中體現了多型的思想抽象類:在父類設定方法不確定的情況下,不需要做出方法體。在前面加入abstract關鍵詞具有抽象方法的類叫做抽象類,class Demo{}前面也應該加入abstract關鍵詞當一個類繼承的父類是抽象類的話 一定要在子類中去實現父類中所有的抽象方法——方法的重寫抽象類一定不可被例項化,無論抽象類中有多少抽象的方法。抽象類中可以沒有抽象的方法(可以不具有包含abstract的方法)抽象類只能通過子類的繼承(extends)去實現抽象方法不能有主體 abstract void demo(){主體}; error
介面:介面不能例項化,介面中的所有方法都不能有主體(抽象類中可以有實現的方法但是介面中不可以)介面相當於更加抽象的類。一個類可以有多個介面 class Demo1 extends Demo{}只能單一繼承 但是 class Demo implements Demo1,Demo2{};是允許的。介面存在的意義:子類只能單一的去繼承父類(java中單一繼承機制)故引入介面的概念一個介面一定不能被例項化。介面本身不能實現裡面的方法,必須由implements介面名的類去實現接口裡面的方法,介面中可以有變數
final關鍵詞:中文:最後的最終的 可以修飾變數或者方法。“當不允許父類的某個方法(變數)被子類覆蓋(override)的時候,在父類方法加入final修飾詞即可”
所謂多型:
一個引用(型別)指向父類的指標用來呼叫不同子類實現的方法
優點:所有繼承父類的子類都可以由父類的例項化統一訪問。若子類無父類對應方法直接呼叫父類方法。
Java允許父類的引用變數引用它子類的例項(物件)某些情況下子類也可以轉化為父類(有一定的條件)
public static void main(String [] args){ Animal an = new Cat(); /* an.cry(); an.eat(); //這裡體現了多型的思想。 an = new Dog(); an.cry(); an.eat(); Cat cat = new Cat(); cat.cry(); Dog dog = new Dog(); dog.cry();*/ Master master = new Master(); master.feed(new Dog(), new Bone()); master.feed(new Cat(), new Fish()); } } class Animal{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; public void eat(){ } public void cry(){ System.out.println ("不知道"); } } class Cat extends Animal{ public void cry(){ System.out.println("喵喵喵"); } public void eat(){ System.out.println("小貓喜歡吃魚"); } } class Dog extends Animal{ public void cry(){ System.out.println("汪汪汪"); } public void eat(){ System.out.println("小狗喜歡吃骨頭"); } } class Food{ String name; public void showname(){ } } class Fish extends Food{ public void showname(){ System.out.println("fish"); } } class Bone extends Food{ public void showname(){ System.out.println("bone"); } } class Master{ public void feed(Animal an , Food f){ an.eat(); f.showname(); } }
在上面程式中體現了多型的思想抽象類:在父類設定方法不確定的情況下,不需要做出方法體。在前面加入abstract關鍵詞具有抽象方法的類叫做抽象類,class Demo{}前面也應該加入abstract關鍵詞當一個類繼承的父類是抽象類的話 一定要在子類中去實現父類中所有的抽象方法——方法的重寫抽象類一定不可被例項化,無論抽象類中有多少抽象的方法。抽象類中可以沒有抽象的方法(可以不具有包含abstract的方法)抽象類只能通過子類的繼承(extends)去實現抽象方法不能有主體 abstract void demo(){主體}; error
public class Chou {//抽象類的必要性 public static void main(String[] args) { // TODO Auto-generated method stub } } abstract class Anima{//抽象類 String name; int age; abstract public void cry(); //抽象方法 抽象方法絕對不可以實現。 } class Cat5 extends Anima{ //繼承的抽象類 public void cry(){ //必須實現的抽象方法 } }
介面:介面不能例項化,介面中的所有方法都不能有主體(抽象類中可以有實現的方法但是介面中不可以)介面相當於更加抽象的類。一個類可以有多個介面 class Demo1 extends Demo{}只能單一繼承 但是 class Demo implements Demo1,Demo2{};是允許的。介面存在的意義:子類只能單一的去繼承父類(java中單一繼承機制)故引入介面的概念一個介面一定不能被例項化。介面本身不能實現裡面的方法,必須由implements介面名的類去實現接口裡面的方法,介面中可以有變數
public class jiekou{ public static void main(String []args){ Computer computer = new Computer(); //例項化物件 Camera camera = new Camera(); //例項化物件 Phone phone = new Phone(); //例項化物件 computer.usbUsb(camera); //電腦中的介面(方法與相機中相對接) computer.usbUsb(phone);//電腦中的介面(方法與手機中的對接) } } interface Aaa{ public void bbb(); } interface Usb extends Aaa{ //設定介面 介面不能繼承類 但是介面可以繼承另一個介面 //被繼承的介面中的方法也必須被實現 int a=0; //介面中可以有變數 不過變數必須被初始化 //但是變數能被private 和protected修飾 //介面中的變數本身是靜態的 是final的(static) //用 Usb.a 去訪問 public void start (); //介面中兩個方法 介面中不能有實現的方法 public void stop(); } class Camera implements Usb{ //定義具有介面的類 public void bbb(){ //實現被繼承aaa中的bbb方法 } public void start() { //實現介面中的方法 System.out.println("我是相機 我開始工作了"); } public void stop() { //實現介面中的方法 System.out.println("我是相機我停止工作了"); } } class Phone implements Usb{ //定義具有介面的類 public void bbb(){ //實現被繼承的Aaa中的bbb方法 } public void start(){ System.out.println("我是手機 我開始工作了");//實現介面中的方法 } public void stop(){ System.out.println("我是手機我停止工作了");//實現介面中的方法 介面中的方法必須都實現 } } class Computer{ //建立一個類 public void usbUsb(Usb usb){ //建立一個和介面對接的方法 usb.start(); //執行介面中的方法 usb.stop(); } } //介面中可以有變數
final關鍵詞:中文:最後的最終的 可以修飾變數或者方法。“當不允許父類的某個方法(變數)被子類覆蓋(override)的時候,在父類方法加入final修飾詞即可”
class Demo{
final public void sendMes(){
//此方法不可被修改或覆蓋
}
}
final class Demo{
int a; //若不賦初始值 a為o 盡不要不賦予初始值
final float rate_1=3.1415926f; //final 定義後必須賦初始值
final public void sendMes(){
}
}
class Demo1 extends Demo{ //因為父類型別為final 故不能被繼承
public Demo1(){
a++;
rate_1++; //因為父類變數為final 故不能被修改
}
public void sendMes(){ //因為父類方法為final故不能被覆蓋 編譯器報錯
}
}