多型:
同乙個物件,在不同時刻表現出現的不同狀態。
舉例:水(水,冰,水蒸氣)
狗(動物,狗)
從**的角度來看:
編譯期狀態和執行期狀態不一致的現象。
fu fu = new fu();
zi zi = new zi();
fu fu = new zi();
前提:1:類或者是介面的引用,指向自己的子類物件
2:呼叫子類重寫後的方法
3:有繼承或者實現關係。
**分析:
class fu {
public int num = 10;
public void show() {
system.out.println("fu"+num);
class zi extends fu {
public int num = 10;
public int num2 = 20;
public void show() {
system.out.println("zi"+num);
system.out.println("zi"+num2);
public void method() {
system.out.println("method");
測試類:
class test {
public static void main(string args) {
fu f = new fu();
system.out.println(f.num);
f.show();
zi zi = new zi();
system.out.println(zi.num);
zi.show();
//多型
fu f = new zi();
system.out.println(f.num);
f.show();
多型中成員的特點:
成員變數:編譯和執行都看左邊。
成員方法:編譯看左邊,執行看右邊。
為什麼?
因為方法有重寫,而變數沒有。
經典案例:
設計電腦主機板和介面
主機板類介面usb
外接裝置
//定義主機板類,開機功能,使用usb介面裝置的功能
class mainboard{
public void open(){
system.out.println("主機板開機");
//重點關注使用的usb介面裝置
public void useusb(usb u){// usb u = new upan();
u.read();
u.write();
//定義usb的介面,規定介面規範,2個方法,讀和寫
inte***ce usb{
public abstract void read();
public abstract void write();
//定義u盤類,必須符合usb介面規則
class upan implements usb{
public void read(){
system.out.println("讀取u盤資料");
public void write(){
system.out.println("向u盤寫資料");
//定義網絡卡類,必須符合usb介面規則
class netcard implements usb{
public void read(){
system.out.println("讀取網絡卡資料");
public void write(){
system.out.println("向網絡卡寫資料");
class personcomputer{
public static void main(string args) {
//建立主機板物件
mainboard mb = new mainboard();
mb.open();
//將u盤,連線到usb介面,呼叫主機板的使用usb這個方法,傳遞u盤物件
mb.useusb(new upan());
//將u盤,連線到usb介面,呼叫主機板的使用usb這個方法,傳遞網絡卡物件
mb.useusb(new netcard());
外接裝置,並沒有直接和主機板連線
外接裝置,直接到了usb介面上,介面和主機板連線
usb介面出現後,不但提供了規則,降低了外接裝置和主機板的耦合性
耦合性降低,程式的擴充套件性提高
object類:
所有類爹地,所有類繼承object
重寫tostring()方法,建立物件自己的字串表現形式
格式: return "類名" + 所有的成員變數的... + ... + ;
equals()方法:用來進行物件之間的比較,任何物件都具備比較性
a: 不覆蓋的時候,預設比較物件的真實位址引用
b: 覆蓋equals方法,建立自定義的比較形式,用來比較類中成員變數的值
**解析:
object
public string tostring()
在輸出語句中sop()
列印的是乙個引用型別。預設呼叫物件中的tostring()方法
system.out.println(p)==system.out.println(p.tostring())
public boolean equals(object obj)
class person{
string name;
int age;
person(string name,int age){
this.age = age;
this.name = name;
// 覆蓋物件中的tostring方法
public string tostring(){
// 依據:返回 類名 和 類中成員變數的值
return "person " + name + "..." + age ;
//覆蓋物件中的equals()方法
public boolean equals(object obj){
//return this == obj;
//對obj進行健壯性判斷
//如果this,和引數obj,指向的是同乙個物件,乙個物件沒有可比性
if(this == obj);
return true;
if( obj == null);
return false;
p2物件提公升為了object型別,型別轉換
if(obj instanceof person){
person p = (person)obj;
return this.age == p.age;
//傳遞的引數,不是人型別,沒有可比性
return false;
class objectdemo {
public static void main(string args) {
person p1 = new person("haha",18);
person p2 = new person("xixi",19);
system.out.println(p1);//person@67f6dc61--雜湊值,理解為記憶體位址
system.out.println(p2);//person@67f6dc61--雜湊值,理解為記憶體位址
boolean b = p1.equals(p2);
system.out.println(b);
內部類:
將乙個類定義在另乙個類的裡面,對裡面那個類就稱為內部類(內建類,巢狀 類)。
訪問特點:
1:內部類可以直接訪問外部類中的成員,包括私有成員。
2:而外部類要訪問內部類中的成員必須要建立內部類的物件。
定義時的特點:
內部類定義在成員位置上:
可以被private static成員修飾符修飾。
被static修飾的內部類只能訪問外部類中的靜態成員。
內部類定義在區域性位置上:
可以直接訪問外部類中的成員。
同時可以訪問所在區域性中的區域性變數,但必須是被final修飾的。
物件導向 初識物件導向
面向過程思想 步驟清晰簡單,第一步做什麼,第二步做什麼.面向過程適合處理一些較為簡單的問題 物件導向思想 物以類聚,分類的思維模式,思考問題首先會解決問題需要分哪些類,然後對這些類進行單獨思考,最後才是對某個分類下的細節進行面向過程的思索 物件導向適合處理複雜的問題,適合處理需要多人協作的問題 對於...
物件導向程式設計01 面向過程 物件導向
前面12講我已經寫完了從零開始學j ase 慶祝完結撒花!那麼從今天開始正式步入物件導向程式設計。建議開啟本章之前先回顧 j ase010方法詳解和 j a變數與方法的呼叫 同類操作中與跨類操作中的對比 物件導向程式設計 oop object oriented programming 物件導向程式設...
物件導向過程與物件導向
物件導向過程與物件導向 1 程式的發展經歷了兩個階段 面向過程 物件導向。2 對於物件導向與面向過程可以用乙個例子解釋,如乙個木匠要做乙個盒子,那麼這個盒子的出發點會有兩種方式 物件導向 先想好要做的盒子,之後在去找相應的工具去做。面向過程 不去想要做什麼樣的盒子,隨需取工具。物件導向三大特徵 封裝...