1. 程式人生 > >在此論壇第一天 Java 多型 抽象類 介面 final

在此論壇第一天 Java 多型 抽象類 介面 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故不能被覆蓋 編譯器報錯
        
    }
}