1. 程式人生 > >面向物件中的多型,物件的向上轉型和向下轉型

面向物件中的多型,物件的向上轉型和向下轉型

多型

首先什麼是多型?
多型就是一種事物的多種形態.
建立多型的前提需要滿足三個條件:
1.首先類與類之間要建立聯絡,即需要有繼承關係
2.子類中一定要有方法的重寫
3.最重要的是一定要有父類的指標指向子類的物件或者說父類的引用指向子類的空間
下面我們舉個例子,動物是父類,貓是子類

class Animal
{
    String name = "動物";
    String color = "白色";
    public void sayHi() 
    {
        System.out.println("我是動物類");
    }
}
class Cat extends
Animal //繼承關係 {
String name = "我是貓"; @Override //方法的重寫 public void sayHi() { System.out.println("我是貓類"); } }
pulic static void main(String[] args)
{
  Animal animal = new Cat();//父類的指標指向子類的物件
  animal.sayHi;
  System.out.println(animal.name);//訪問動態變數
}

可以看出符合了多型的三個條件
然後輸出,可以看出輸出結果是:

我是貓類
動物

在多型時訪問動態變數和訪問動態方法的時候要注意到的事項:

我們在main方法中列印animal的動態變數,輸出的結果是動物,不是貓,下面我們從記憶體中講述一下
這裡寫圖片描述
首先是將類載入到方法區.然後main方法入棧,入棧後,new Cat()在堆區開闢了一片空間,因為Cat是Animal的子類,所以在區域中是有一塊區域是包含著animal()的,因為animal的資料型別是Animal,所以會訪問到Animal的那片區域,所以呼叫了父類中的name,輸出的結果是”動物”.

所以我們可以總結一下,多型時,訪問成員變數時,編譯的時候要看父類中是否有該變數,列印的時候列印的也是父類中的變數.

下面我再看上面的程式碼中,animal呼叫的方法sayHi的輸出結果:我是貓類;因為animal只能訪問到父類,因此會訪問父類的sayHi方法,但是在子類中子類把sayHi方法重寫了,覆蓋掉了原來的sayHi方法,因此執行時實際上執行的是子類中的sayH方法,所以輸出的結果是子類sayHi的輸出結果.

下面我們再總結一下,多型時,訪問成員方法的時候,編譯的時候要看父類中有沒有成員方法,執行的時候再看父類的方法有沒有被重寫覆蓋.

多型的好處以及向上轉型和向下轉型
多型的好處是
1.增強了程式碼的可維護性
2. 增強了程式碼的可擴充套件性

下面我們再寫個學生類和人類

class People
{
    String name = "人民群眾";
}
class Student extends People
{
    String name = "三好學生";
}

我們怎麼通過呼叫物件讓子類的name輸出?

public static void main(String[] args) 
    {
        People people = new Student();//這叫做向上轉型
        Student student =(Student)people;//這叫做向下轉型,轉換成原來本該有的型別
        System.out.println(student);//這樣輸出的結果就是子類中name的值了
    }

相關推薦

面向物件,物件向上轉型轉型

多型 首先什麼是多型? 多型就是一種事物的多種形態. 建立多型的前提需要滿足三個條件: 1.首先類與類之間要建立聯絡,即需要有繼承關係 2.子類中一定要有方法的重寫 3.最重要的是一定要有父類的指標指向子類的物件或者說父類的引用指向子類的空間 下面

java語言機制理解以及向上轉型轉型問題

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

Java向上轉型轉型

向上轉型:將一個父類的引用指向一個子類物件,稱為向上轉型,自動進行型別轉換     用法: Father f = new Son(); 向下轉型:子類引用指向父類引用的子類物件  通俗的說就是子類例項物件賦值給父類引用,然後父類引用又要賦值給子類引用,這個過程就是向下轉型

向上轉型轉型

向上轉型:         將子類物件轉換為父類物件 : Father f = new Son(); 這樣產生的物件f,將會擁有父類的屬性和子類的方法。當然,子類的方法複寫了父類的方法,輸出的結果自然是父類的。而f的屬性卻依舊是父類時候的屬性值。舉個栗子

物件型別的轉換(向上轉型轉型

1 //父類 2 class Parent 3 { 4 public static String kind="javastudy.extendsstudy.parent"; 5 public static int age=50; 6 pu

c++向上轉型轉型,動態轉換,靜態轉換詳解

子類轉換為父類:向上轉型,使用dynamic_cast<type_id>(expression),這種轉換相對來說比較安全不會有資料的丟失; 父類轉換為子類:向下轉型,可以使用強制轉換,這

JavaSE(五)JAVA對象向上轉型轉型

open 其他 解釋 編譯 -- 運行出錯 instance xtend args 今天做了一個測試的題目,發現自己還是很多問題沒有靜下心來做。很多問題是可以自己解決的但是自己一是沒有讀清題意,二是自己心裏太急躁了。所以這個要自己應以為鑒! 對象的轉型問題其實並不復雜,我

JAVA向上轉型轉型

子類 font new ont java向上轉型 clas 之間 string output   最近在看JAVA編程思想,之前學的JAVA只能算是皮毛,大概看到第七章繼承時出現了個名詞-向上轉型。所以就來討論下向上和向下轉型的內容和意義,內容會隨著我看書的進度一直更新的

JAVA的向上轉型 轉型

向上轉型 是面向物件繼承的一種形式,是指子類物件轉換為父類物件。 看下面的example class Instrument { public void play() { System.out.println("Instrument play"); }

java——向上轉型轉型

Father f1 = new Son(); // 這就叫 upcasting (向上轉型) // 現在 f1 引用指向一個Son物件 Son s1 = (Son)f1; // 這就叫 downcasting (向下轉型) // 現在f1 還是指向 Son物件 Father f2 =

向上轉型轉型

向上轉型:把子類物件轉成父類型別,即父類的引用指向子類物件。 A為父類,B為子類。 A b = new B(); 向上轉型時會執行子類重寫父類的方法,以及父類特有的方法。但是會丟失子類中特有的方法和資料。 向下轉型:把父類物件轉成子類型別,即將子類的引用指向父類

java學習-向上轉型轉型

一,多型 在設計一個方法的時候,通常希望該方法具備一定的通用性。比如實現一個動物叫的方法,每個動物的叫聲是不一樣的,可以在方法中接收一個動物型別的引數,當傳入貓類物件的時候就發出喵的聲音,相對傳入狗的物件就發出汪的聲音。同一個方法這種應為引數不同而導致執行效果不同的現象叫做

父子類的向上轉型轉型

首先從一個例子看:class A {     double f(double x, double y) {         return x + y;     }     static in

關於Java繼承的 向上轉型轉型

在Java中, 向上轉型(upcasting)和向下轉型(downcasting)的前提,必須是有“繼承關係”,向上轉型是自動的,向下轉型需要進行強轉。 例如: /**定義了一個“父”類*/ public class Father { /**姓名

C#向上轉型轉型

子類物件賦給父類型別的變數,稱為向上轉型。父類型別的物件賦給子類型別的變數,稱為向下轉型。上個例子,Vegetable是父類,Potato是子類。namespace ConsoleApplication1{ class Vegetable { public

java繼承向上轉型轉型動態繫結

1 概念: 把引用變數轉化為子類型別,則成為向下轉型。如果把引用變數轉化為父類型別,則成為向上轉型。  Java程式碼 publicclass Base {   /**       * 父類例項變數       */    String var = "baseVar";   /**      

JAVA向上轉型轉型(一)

   在我們工作的時候通常會看到這樣的程式碼: Map<String,Object> m = new HashMap<String,Object>(); List<Object> l = new ArrayList<Object&

理解“向上轉型轉型”的簡單例子

import static net.mindview.util.Print.*; class Useful{ public void f(){print("Useful:f()");} public void g(){print("Useful

Java面向物件向上轉型轉型

多型,大概每個人都知道。但是,又有幾個人真的理解什麼是多型、多型有哪些細節呢?如果你看到這篇文章的名字,腦海中對多型沒有一個清晰的概念,不妨點進來看看,也許會有收穫。 什麼是多型 簡單的理解多型 多型,簡而言之就是同一個行為具有多個不同表現形式或形態的能力。比如說,有一杯水,我不知道

Java——向上轉型轉型

Java的轉型之前一直處於似是而非的狀態。 其中尤其是向上轉型,大概意思誰不懂啊,A  a  =  new  B()  嘛,然而往細了摳就有點矇蔽,尤其是面對考卷裡出現的那種賊JB噁心的多型題,簡直要哭了。 翻閱了幾篇大佬們寫的部落格,整理一下思路總結如下。 首先先從