1. 程式人生 > 其它 >Java學習第三十四天<Final><抽象類><介面入門><介面與繼承對比><介面陣列><介面多型>

Java學習第三十四天<Final><抽象類><介面入門><介面與繼承對比><介面陣列><介面多型>

 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");
    }
}