1. 程式人生 > >JAVA對多型的理解

JAVA對多型的理解

多型一般理解為編譯與執行時的不同狀態。

例如 LIst list = new ArrayList();

目前,我的理解為編譯程式的時候,類中的成員變數,成員方法看左邊      ||     而在執行時,成員方法則看右邊。

class A{
    public String run(D obj){
        return ("A & D");
    }
    public String run(A obj){
        return ("A & A");
    }
}

class B extends A{
    public String run(B obj){
        return ("B & B");
    }
    public String run(A obj){
        return ("B & A");
    }
}

class C extends B{}
class D extends B{}
        A aa = new A();
        A ab = new B();
        B b  = new B();
        C c  = new C();
        D d  = new D();
        System.out.println(aa.run(b));//A & A
        System.out.println(aa.run(c));//A & A
        System.out.println(aa.run(d));//A & D

        System.out.println(ab.run(b));//B & A
        System.out.println(ab.run(c));//B & A
        System.out.println(ab.run(d));//A & D

        System.out.println(b.run(b));//B & B
        System.out.println(b.run(c));//B & B
        System.out.println(b.run(d));//A & D

可以看這個例子,比如:

/**
* ab.run(d); 在這個方法中,ab這個物件,編譯時看左邊,所以ab這個物件擁有run(D obg)和run(A obj)兩個方法,
* 所以ab.run(d)輸出為A & D.同理可以的出其他結果。
* 需要注意的是,雖然ab這個物件new的是B,但是因為編譯時看的是左邊的方法,所以ab不可以呼叫B中的專有方法run(B obj)

*即使呼叫了run(b),也會將b看作A的子類,從而呼叫run(A obj)
* */

相關推薦

JAVA理解

多型一般理解為編譯與執行時的不同狀態。例如 LIst list = new ArrayList();目前,我的理解為編譯程式的時候,類中的成員變數,成員方法看左邊      ||     而在執行時,成員方法則看右邊。class A{ public String ru

java面試(4):理解

面向物件程式設計有三大特性:封裝、繼承、多型。        封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了資料。對外界來說它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。  &nb

java理解

子類Cat重寫了父類Animal的非靜態成員方法am.eat();的輸出結果為:貓吃飯。 子類重寫了父類(Animal)的靜態成員方法am.sleep();的輸出結果為:動物在睡覺 未被子類(Cat)重寫的父類(Animal)方法am.run()輸出結果為:動物在奔跑 System.out.println(a

談談我理解

什麼是多型 多型是面向物件的特性之一,從字面上理解,多型就是指一個物件在執行是會有多種形態,就比如可以說student是一個person,也可以說student是一個object。 我們來看一個經典的例子: Service service=new ServiceImpl(); 我們經

java語言機制中的理解以及的向上轉型和向下轉型問題

多型中轉型問題往往不容易理解,特別是向上和向下轉型。 下面先說說多型的概念和前提: 1.要有繼承關係; 2.要有方法重寫; 3.要有父類引用指向子類物件; 如果是成員變數的話,編譯看左邊(父類),執行看左邊(子類); 如果是成員方法的話,編譯看左邊(父類),執行看右邊(子類)

C++學習之理解

最近學習C++多型及子類記憶體結構,有一些理解與看法,記錄下來 1.多型產生,虛擬函式,虛擬函式指標,虛擬函式表 這一部分不詳細描述,個人參考的書籍是Siddhartha Rao的<21天學通C++>的第11章:多型 瞭解了編譯器利用虛擬函式表與物件的虛擬函式指標來實現多型的

.Net高階技術:的深入理解

一、C#多型的特性使得設計模式成為可能   二十多種設計模式的都是基於多型 二、多型的表現形式   1.普通類    子類能夠繼承父類的所有成員(父類的私有成員子類物件不能直接訪問到),包括父類實現的介面已經父類繼承的其他類的成員。    將方法標記為virtual,表示子類可以重寫這個方法(當然也

java理解

多型的定義:指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。 實現多型的技術稱為:動態繫結(dynamic binding),是指在執行期間判斷所引用

JAVA理解(包含他人經典例子)

引言:理解JAVA多型應先理解JAVA繼承、封裝。 一、什麼是多型 面向物件程式設計有三個特徵,即封裝、繼承和多型。 1. 封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。        2. 繼承是為了重用父類程式碼,同時為實現

深入理解Java

       這幾天我在重新複習Java語言基礎,雖然和團隊一起,自己個人都進行了實際專案的開發,但越往上面走越覺得自己應該花點時間看看Java的基礎知識,鞏固一下基礎。今天覆習的是多型,同時寫下自己的學習心得。       資料抽象、繼承和多型是面向物件程式設計語言的三大

java理解,instanceof關鍵字,向上向下轉型的理解

一、多型的定義 比如:人可以是學生,也可以是老師,也可以是軍人。這就表現了人的多種形態性。多型就是多種形態。 多型的最終體現為:父類的引用變數可以指向子類物件。 多型的前提是必須有子父類關係,或者類實現介面關係,否則無法完成多型。 在使用多型後,父類的引用變數呼叫方法時,會呼叫子

通俗理解JAVA機制

多型是Java面向物件的一個非常重要的機制,多型也被稱為動態繫結,該機制是用於增強可擴充套件性而提出的。 多型的必要條件: 1.存在繼承關係 2.對父類中的方法進行了重寫 3.呼叫方法時,形參為父類引用 在實際執行時,父類引用指向子類物件,呼叫的是實際

Java轉型的問題理解概述

一、虛擬碼 class 孔子爹 { public int age = 40; public void teach() { System.out.println("講解Java"); }

java 的基本操作小結

() sage PE nor .get eight getname valueof XML 1.json 字符串轉換成對象 SyncCarriageStatusDTO dto= JSON.parseObject(value,SyncCarriageStatusDTO.cla

JAVA----父類與子類轉換問題

JAVA語言中, 物件變數是多型的 每個子類物件都算是父類物件(子類物件可以當作父類變數所引用) 那反過來可不可以呢? 答案是取決於父類變數引用的是誰 如果父類變數引用的是子類物件的例項, 可以通過強轉被子類變數引用 如果父類變數引用的是父類物件的例項,則不能被為子類變數引用

java學習-

1、類的繼承關係 1.1 PDemo2.java public class PDemo2 { public void say(){ System.out.println("PDemo2 say()....."); } } 1.2 CDem

thinking in java (二) -----

面向物件的三大特性:封裝,繼承,多型。 封裝 封裝將類的內部資訊隱藏,不允許外部直接訪問(private),通過該類提供的方法(get(),set())來訪問操作類隱藏的資訊。隱藏了類的資訊,留出了訪問操作的介面。 繼承 為了複用父類的程式碼,兩個類如果有is-a關係,子類就可以繼承

JAVA(強制轉換)

1 abstract class Animal { 2 String name; 3 String color; 4 5 public Animal(String name, String color) { 6 this.name = name;

Java特性-

多型: 封裝和繼承都是為多型服務的。 一個介面,多種實現。 能使用介面就不用抽象類,能使用抽象類就不用類,能用父類就不用子類。 目的: 把不同的子類物件都當作父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的程式碼,做出通用的程式設計,以適應需

java-day10-

10.1 練習 畢姥爺: 講課 釣魚 畢老師 extends 畢姥爺 講課 釣魚 要求看到向上轉型,向下轉型 package day09; class BiLaoYe{ public void lecture(){