Java學習第三十四天<Final><抽象類><介面入門><介面與繼承對比><介面陣列><介面多型>
阿新 • • 發佈:2022-03-26
Final
package chapter10.D4關鍵字Final; //final最後的,用在類則不能被繼承(但可例項化),用在方法則不能被重寫(可在子類繼承),用在屬性上則不能修改 //用作常量,必須賦值(定義時,構造器賦值,程式碼塊賦值) 若是靜態常量,不能用構造器賦值,因為載入順序有先後 //final用在類上(希望不被繼承),則沒必要將方法也final(希望不被重寫,繼承不了當然重寫不了) //final與static常一起用,不會導致類載入 //String 和包裝類(Double,Float,Integer,Boolean)都是final類,不能繼承 public class Final { public static void main(String[] args) { System.out.println(B02.num); } } class B02{ public final static int num=1000; static { System.out.println("BBB程式碼塊執行"); } }
package chapter10.D4關鍵字Final; public class Fnialexercise { public static void main(String[] args) { Circle circle = new Circle(5.0); System.out.println(circle.calArea()); } } class Circle{ private double radius; private final double PI;//可直接賦值 public Circle(double radius) { this.radius = radius; //PI=3.14;構造器裡賦值 } { PI=3.14;//程式碼塊裡賦值 } public double calArea(){ return PI*radius*radius; } }
抽象類
package chapter10.D5抽象類; //沒有方法體,方法和類都要戴abstract,抽象類不能例項化,由子類繼承實現 //abstract不能修飾屬性和其他 //抽象方法不能使用private、final和static修飾 這些關鍵字和重寫相違背(private不能重寫,final不能被繼承重寫,static與重寫無關) public class Abstract01 { public static void main(String[] args) { new CommonEmployee("xx",1,200).work(); new Manager("yy",2,300,1000).work(); } } abstract class Employee{ private String name; private int ID; private double salary; public Employee(String name, int ID, double salary) { this.name = name; this.ID = ID; this.salary = salary; } public String getName() { return name; } public int getID() { return ID; } public double getSalary() { return salary; } abstract public void work(); } class CommonEmployee extends Employee{ public CommonEmployee(String name, int ID, double salary) { super(name, ID, salary); } @Override public void work() { System.out.println("普通員工\t"+getName()+"\t工作中"); } } class Manager extends Employee{ private double bonus; public Manager(String name, int ID, double salary, double bonus) { super(name, ID, salary); this.bonus = bonus; } @Override public void work() { System.out.println("經理\t"+getName()+"\t工作中"); } }
package chapter10.D5抽象類; //抽象類,模板設計模式 abstract public class Template { public abstract void job(); public void calc(){//可做成模板 long start=System.currentTimeMillis(); job(); long end=System.currentTimeMillis(); System.out.println("執行時間"+(end-start)); } } class A02 extends Template{ @Override public void job() { long num=1; for (int i = 0; i <=800 ; i++) { num*=i; } } } class B02 extends Template{ @Override public void job() { long num=0; for (int i = 0; i <=800000 ; i++) { num+=i; } } }
package chapter10.D5抽象類; public class TestTemplate { public static void main(String[] args) { new B01().calc(); new A01().calc(); new A02().calc(); new A01().calc(); } } class A01{ public void calc(){//可做成模板 long start=System.currentTimeMillis(); job(); long end=System.currentTimeMillis(); System.out.println("執行時間"+(end-start)); } public void job(){ long num=1; for (int i = 0; i <=800 ; i++) { num*=i; } } } class B01{ public void calc(){ long start=System.currentTimeMillis(); job(); long end=System.currentTimeMillis(); System.out.println("執行時間"+(end-start)); } public void job(){ long num=0; for (int i = 0; i <=800000 ; i++) { num+=i; } } }
介面入門
介面1
package chapter10.D6介面.Interface01; //介面中所有方法都是public,故不用寫修飾符,且預設抽象,不用abstract public interface Usbinterface { public void start();//規定介面相關方法 public void stop(); }
package chapter10.D6介面.Interface01; public class Camera implements Usbinterface{ @Override public void start() { System.out.println("相機開始工作"); } @Override public void stop() { System.out.println("相機停止工作"); } }
package chapter10.D6介面.Interface01; //Phone類實現USB介面(實現Usbinterface規定/宣告的方法,重寫) public class Phone implements Usbinterface{ @Override public void start() { System.out.println("手機開始工作"); } @Override public void stop() { System.out.println("手機停止工作"); } }
package chapter10.D6介面.Interface01; //帶介面的主機工作,驅動其他裝置 public class Computer { public void work(Usbinterface u){//可傳遞實現介面的物件 u.start();//通過介面呼叫方法 u.stop(); } }
package chapter10.D6介面.Interface01; public class Interface01 { public static void main(String[] args) { Usbinterface camera = new Camera();//可向上轉型 Phone phone = new Phone(); Computer computer = new Computer(); computer.work(phone);//手機接入到電腦 computer.work(camera); } }
介面2
package chapter10.D6介面.Interface02; public interface In02 { //寫屬性和方法 public int n1=10; public void hi();//預設抽象 default public void ok(){//在jdk8後可以有預設實現方法,需default關鍵字修飾,或靜態方法 System.out.println("ok..."); } public static void cry(){ System.out.println("cry..."); } }
package chapter10.D6介面.Interface02; public class Interface02 { public static void main(String[] args) { new A().hi(); } } class A implements In02{ //要把該介面所有抽象方法實現,除非是抽象類 @Override public void hi() { System.out.println("hi...."); } }
介面3
package chapter10.D6介面.Interface03; public interface In03 {//專案經理 public void connect(); public void close(); }
package chapter10.D6介面.Interface03; //A程式設計師,連線MysqlDB public class MysqlDB implements In03{ @Override public void connect() { System.out.println("連線mysql"); } @Override public void close() { System.out.println("關閉musql"); } }
package chapter10.D6介面.Interface03; //B程式設計師,連線OracleDB public class OracleDB implements In03{ @Override public void connect() { System.out.println("連線OracleDB"); } @Override public void close() { System.out.println("關閉OracleDB"); } }
package chapter10.D6介面.Interface03; public class Interface03 { public static void main(String[] args) { MysqlDB mysqlDB = new MysqlDB(); t(mysqlDB);//靜態物件不用再建立物件 OracleDB oracleDB = new OracleDB(); t(oracleDB); } public static void t(In03 i){ i.connect(); i.close(); } }
介面4
package chapter10.D6介面.Interface04; public class Interface04 { public static void main(String[] args) { System.out.println(IB.n1);//證明靜態屬性 //B.n1=20 報錯證明是final屬性 } } interface IB{ void hi(); public static final int n1=100; //預設public static final修飾符 } interface IC{ void say(); } interface ID extends IB,IC{//介面不能再接其他介面,但可繼承多個其他介面 } class P implements IB,IC{//一個類可同時實現多介面 @Override public void hi() { } @Override public void say() { } }
介面與繼承對比
package chapter10.D6介面.ExtendsVsInterface; //繼承擁有父類的功能,介面擴充套件其他類功能,介面是對單繼承的補充 public class ExtendsVsInterface { public static void main(String[] args) { LittleMonkey xx = new LittleMonkey("悟空"); xx.climbing(); xx.swimming(); xx.flying(); } } class Monkry{ private String name; public Monkry(String name) { this.name = name; } public String getName() { return name; } public void climbing(){ System.out.println(getName()+"會爬樹...."); } } class LittleMonkey extends Monkry implements Fishable,Birdable{//單繼承,多介面 public LittleMonkey(String name) { super(name); } @Override public void swimming() { System.out.println(getName()+"通過學習,可以像魚兒一樣游泳了"); } @Override public void flying() { System.out.println(getName()+"通過學習,可以像鳥兒一樣飛翔了"); } } interface Fishable{ void swimming(); } interface Birdable{ void flying(); }
介面陣列
package chapter10.D6介面.InterfaceArray; public class InterfaceArray { public static void main(String[] args) { Usb[] usbs=new Usb[2]; usbs[0]=new P(); usbs[1]=new C(); for (int i = 0; i < usbs.length ; i++) { usbs[i].work(); if (usbs[i] instanceof P){//判斷執行型別 ((P) usbs[i]).call(); } } } } interface Usb{ void work(); } class P implements Usb{ public void call(){ System.out.println("手機可打電話"); } @Override public void work() { System.out.println("手機工作中"); } } class C implements Usb{ @Override public void work() { System.out.println("相機工作中"); } }
介面多型
package chapter10.D6介面.InterfacePolyPass; //演示多型傳遞 public class InterfacePolyPass { public static void main(String[] args) { IG ig=new Teacher();//向上轉型 IH ih=new Teacher(); ih.hi(); } } interface IH{ void hi(); } interface IG extends IH{ } class Teacher implements IG{ @Override public void hi() { System.out.println("hi"); } }