Java面試題詳解一:面向對象三大特性


一,多態:
1.面向對象四大基本特性:抽象,封裝,繼承,多態
抽象,封裝,繼承是多態的基礎。多態是抽象,封裝,繼承的表現。
2.什么是多態
不同類的對象對同一消息作出不同的響應叫做多態
3.多態的作用
簡單來說:解藕。詳細點就是,多態是設計模式的基礎(既然是基礎,那么一些設計模式中肯定有多態的下面三個條件)
4.多態存在的三個條件
有繼承關系
子類重寫了父類方法
父類引用指向子類對象
5.注意:
因為多態存在必須要有“子類重寫父類方法”這個條件,那么下面三種類型的方法沒辦法表現出多態的特性(因為不能被重寫)
static方法:static修飾的方法是屬於類的,而不屬於實例
final方法:因為被final修飾的方法無法被子類重寫
private方法:被private修飾的發那個法對子類不可見,
protected方法:被protected修飾的方法可以被子類見到,也可以被重寫,但無法被外部所引用,無法引用,就沒有多態
6.多態的分類:
編譯時多態,方法的重載
運行時多態,方法的重寫
7.分析多態問題的幾條原則
比如有一個父類Father,有一個子類Children
(1)向上轉型是自動的。Father f=new Children()是自動的,不需要強轉
(2)向下轉型要強轉。即Children c=new Father()是無法編譯通過的,必須要Children c=(Children)new Father(),讓父類知道它要轉成具體哪個子類
(3)父類引用指向子類對象,子類重寫了父類的方法,調用父類的方法,實際調用的是子類重寫了父類的該方法。
即 Father f=new Children(),f.toString()實際上調用的是Children中的toString()方法
例如:

父類:
public class Father {
    private double money=100;

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public void usePhone(){
        System.out.println("使用老年機");
    }
}
子類:有繼承關系,並且重寫父類的方法userPhone()
public class Children extends Father {
    public void usePhone(){
        System.out.println("繼承money:"+getMoney()+"使用智能機");
    }
}
public class Test {
    public static void main(String[] args) {
        Father f=new Children(); //父類的引用指向子類對象。
        f.usePhone();//其實是調用子類的方法,輸出:“繼承money:100.0使用智能機”
    }
}

二,封裝
一個對象他所封裝的是自己的屬性和方法,所以它是不需要依賴其他對象就可以完成自己的操作
封裝就是把一個對象的屬性私有化,同時提供一些可以被外界訪問屬性的方法
1.封裝的三大好處:
良好的封裝能減少耦合
類內部的結構可以自由修改
可以對成員變量更精確的控制
隱藏信息,實現等細節
2.實際應用
(1)好處1:封裝確實可以使我們容易地修改類的內部實現,而無需修改使用了該類的客戶代碼。

public class User {
    private Long id;
    private String name;
    private int age;
    
    public Long getId() {return id;}

    public void setId(Long id) {this.id = id;}

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

如果我們需要修改User這個類,把 age改為String 。你只有一處使用了這個類還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,我們完全可以不需要做任何修改,只需要稍微改變下Husband類的setAge()方法即可。

public class User {
    private Long id;
    private String name;
    private String age; //改為String類型

    public Long getId() {return id;}

    public void setId(Long id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public String getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = String.valueOf(age);
    }
}

(2)好處2:可以對成員變量進行更精確的控制。

public class User {
    private Long id;
    private String name;
    private int age;
    
    public Long getId() {return id;}

    public void setId(Long id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age>150){
            System.out.println("年齡不符合要求");//輸出提示信息
        }else {
            this.age = age;
        }
        
    }
}
好處3:例如性別我們在數據庫中一般都是已1、0方式來存儲的,但是在前台我們又不能展示1、0,這里我們只需要在getter()方法里面做一些轉換即可。
public class User {
    private Long id;
    private String name;
    private Integer sex;
    private String sexString;

    public Long getId() {return id;}

    public void setId(Long id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}
    
    public String getSexString() {
        if(sex==1){
            setSexString("男");
        }else if(sex==0){
            setSexString("女");
        }else {
            setSexString("未知");
        }
        return sexString;
    }

    public void setSexString(String sexString) {
        this.sexString = sexString;
    }
}

三,繼承
1.使用繼承可以用來復用代碼。可以將所有子類的共同屬性放入父類中
使用繼承記住三句話:
子類擁有父類非private的屬性和方法
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展
子類可以用自己的方式實現父類的方法
2.構造方法:
首先是通過構造方法來完成對象的初始化,子類的構造方法默認調用父類的構造方法,通過super()方式
(1).父類有默認的構造方法,子類的構造方法默認執行super();調用父類構造方法進行實例化
(2).父類沒有默認構造方法(肯定是手寫了構造方法),子類構造方法中顯示使用super()調用父類構造方法
3.缺點:
父類變,子類必須變
繼承是一種強耦合關系


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM