1. 程式人生 > >java中將子類物件賦給父類物件

java中將子類物件賦給父類物件

例子一

父類:

public class Supclass 
  {
  public void print()
  {
  System.out.println("this is 父類print()方法"+"——此時物件"+this.toString());
  }
  }
子類:
public class Subclass extends Supclass 
  {
  public static void main(String[] args) 
  {
  Supclass sup=new Subclass();
  sup.print();
  System.out.println("此時物件"+sup.toString());
  }
  }

結果:this is 父類print()方法——此時物件是[email protected]
  此時物件是[email protected]

  說明: 
  Supclass sup=new Subclass();
  雖然宣告的物件是父類物件,但實際的記憶體空間是子類物件的。
  繼承父類的方法public void print()被呼叫,輸出的是子類物件名字解析。

  結論:編譯時宣告的物件是父類物件,但執行時卻是子類物件.子類沒有重寫父類的方法,則此  時的物件呼叫繼承父類的方法。

例子二

父類:

public class Supclass 
  {
  public void print()
  {
  System.out.println("this is 父類print()方法"+"——此時物件"+this.toString());
  }
  }
子類:
public class Subclass extends Supclass 
  {
  public void print()
  {
  System.out.println("this is 子類print()方法"+"——此時物件"+this.toString());
  }
  public static void main(String[] args) 
  {
  Supclass sup=new Subclass();
  sup.print();
  System.out.println("此時物件"+sup.toString());
  }
  }

結果:this is 子類print()方法——此時物件是

[email protected]
  此時物件是[email protected]
  說明:
  我在上個例子的基礎上,重寫了父類的print()方法,此時的呼叫的是子類的print()方法。

  結論:在上個例子結論的基礎上,我得到了一個結論:此時物件執行時確實子類物件,如果子類沒有從寫父類的方法,
  則此時的物件呼叫繼承父類的方法;否則,此時的物件呼叫子類方法.

  問題: 我們是不是可以從上面的測試得到的這樣結論: 將子類物件賦值給父類物件(即Supclass sup=new Subclass()),
  我們得到的就是子類物件,即sup就是子類物件??????


例子三

父類:

public class Supclass 
  {
  protected String className="父類屬性";
  public void print()
  {
  System.out.println("this is 父類print()方法"+"——此時物件"+this.toString());
  }	
}

子類:

public class Subclass extends Supclass 
  {       
  protected String className="子類屬性";
  public void print()
  {
  System.out.println("this is 子類print()方法"+"——此時物件"+this.toString());
	}
  public static void main(String[] args) 
  {
  Supclass sup=new Subclass();
  System.out.println("此時的屬性時:"+sup.className);
  }
  }	

結果:此時的屬性時:父類屬性
  說明:我在第一個測試的基礎上,給父類添了一個屬性className,在子類重寫了這個屬性.
  但我輸出此時物件的屬性時,卻是父類的屬性.
  結論: 將子類物件賦值給父類物件,方法和屬性和我們正統的繼承關係很不一樣.
  問題:
  此時物件究竟是子類物件,還是父類物件?
開始推測:  
  我在推測之前有幾點須宣告:
  1.當我們new一個子類物件時,父類物件的建構函式同時也被執行,即父類的一些必要資訊和子類物件共佔一個記憶體空間,
  當我們方法重寫時,於是我們就能使用super這個指代父類的物件.
  2.java中物件並不是完全的面向物件思想做的,即不是把一個物件的屬性和方法同時封裝到物件中.
  而是物件有自己的屬性,方法卻是引用類中的方法,可以說它是把屬性和類中方法的引用封裝到物件中.
  於是物件呼叫的方法不是自己的方法,而是類中方法.至於java為什麼要這樣做,我就不知道了.
  3.當物件被載入到記憶體時,類先被載入到記憶體中,此後類應是一隻留在記憶體中.至於類什麼時候從記憶體中消失,我也不知道.
  我想java一定有自己的回收機制,就像回收物件一樣.
  4.編譯和與執行是完全不同的事.編譯時主要做的是宣告物件的型別,分配屬性,檢查語法錯誤等
  執行時做的是,將物件載入記憶體(一般用new,反射也常用), 執行程式碼執行功能等.
  
  5.若是讀者您和我在這幾點沒有產生共鳴的話,或者說我們在這幾點沒用相同的認識的話,你會覺得我在胡說.
  也許你會覺得我的專家分太低,就覺得我的可信程度就低.但我想說的是學不分先後,達者為先.
  呵呵,我已準備好將我的專家分變為負值了,不胡扯了,我們繼續.
  推測:
  1.當我們編譯Supclass sup=new Subclass()時,sup物件被宣告為Supclass類,於是sup物件的屬性便是父類物件的屬性的值,它是編譯時被確定好的.(宣告4,可以對這段進行解釋).這段話可以對測試三進行解釋,即為什麼此時物件的屬性是父類物件的屬性.
  
  2.當我們執行Supclass sup=new Subclass()時,此時sup物件的記憶體空間是子類物件的記憶體空間(宣告4,可以對這段進行解釋),
  注意此時sup物件的記憶體空間由兩部分組成父類的一些必要資訊和子類物件資訊(宣告1,可以對這段進行解釋).
  當我們不重寫父類的方法時,由於此時記憶體空間已有父類的一些必要資訊,所以繼承父類的方法public void print()當然能被呼叫。
  這段話可以對測試一進行解釋.
  3.接著2繼續,若我們重寫父類的方法時,由於sup物件的記憶體空間是子類物件的記憶體空間,子類的方法public void print()已被載入到記憶體中.
  所以我們呼叫的是子類的方法public void print();如果你需要呼叫父類的被重寫方法,需要用super.
  這段話可以對測試二進行解釋.
  總結:
  以下純是個人觀點: 
  將子類物件賦值給父類物件,所得到物件是這樣的一個物件:
  它是一個編譯是為父類物件,但執行卻是一個子類物件,具體特徵如下.
  1.被宣告為父類物件
  2.擁有父類屬性
  3.佔用子類的記憶體空間
  4.子類方法覆蓋父類的方法時,此時物件呼叫的是子類的方法;否則,自動呼叫繼承父類的方法.
  5.我人認為這個物件既不是父類物件,也不是子類物件.當我們用到它的方法時,
  我便把它看成子類物件;若用到它的屬性時,我把它看成父類物件.
  它是一個佔用父類屬性,而使用子類方法的物件.至於到底是什麼物件,我認為還是得根據宣告來,它應算是父類物件,但擁有子類方法.
  
  想一想:
  在測試三的基礎上,我們如何取出子類的屬性?????

相關推薦

java中將物件物件

例子一 父類: public class Supclass   {   public void print()   {   System.out.println("this is 父類print()方法"+"——此時物件"+this.toString());   }   

Java向上轉型與向下轉型(物件的)

一.定義:    通俗理解向上轉型:    就是子類轉型成父類。   classA   {   }   classBextendsA   {   }   A b=new B();   這個就是向上轉型。   向上轉型可以像下面這條語句這麼簡單:   Shape s =new Circle();   這裡,建

淺談將物件物件

最近對將子類物件賦值給父類物件有點心得,想和大家分享一下,但本人水平有限,請各位指正和批評。言歸正傳,下面是幾個小例子,請大家看一看。 測試一 父類: public class Supclass { public void print() {

java基礎 靜態 static 問在多態中,靜態方法覆蓋靜態方法時,引用調用的是哪個方法?

xtend java pos main 靜態方法 show extends ava pri 多態 package com.swift.jiekou; public class Jicheng_Tuotai_jingtai_diaoyong { publ

java 建構函式】為什麼一定要訪問中的建構函式

子類的所有建構函式中的第一行,其實都有一條隱身的語句super(); 解釋: super()表示父類的建構函式並會調用於引數相對應的父類中的建構函式。子類中,它在呼叫父類中空引數的建構函式。因為子類繼承父類,會繼承到父類中的資料,所以必須要看父類是如何對自己的資料進行初始化的。所以子類在進行物件初始化時,先呼

java 型別轉換【不能轉為

java 父類不能轉為子類  package tao.test; class Base { public String str = "hello Base..."; public void hello(){ System.out.println(str); }

【反射機制】兩個名不同但其屬性相同的物件,如何將一個物件的值另外一個物件

最近公司需要用執行緒遷移一張表(業務表)的資料至另外一張表(備份表)中,兩張表的欄位一樣,如何在程式中將查到的業務表資料集合轉換到另外一個備份表資料集合中。 最初的想法,是新建一個一個的去賦值,但是這種方法後期如果表增加了欄位將需要修改賦值的方法,捨棄了該方法。後來想到可以

C++物件隱藏了的同名成員函式(隱藏篇)

#include <iostream>#include <stdlib.h>#include <string>using namespace std;/** * 定義人類: Person * 資料成員: m_strName * 成員函式:

Java 能否重寫(覆蓋)的靜態方法?

答案是不能重寫,也就是不能被覆蓋!但是,與例項方法一樣,子類能把父類的靜態方法繼承過來。父類程式碼:public class StaticParent { public static int a = 0; public static void printA() {

Java構造器 繼承問題(是否必須實現的有參建構函式)

首先,答案是否定的,但是 如果你在父類中寫了一個有參建構函式,但是沒有宣告無參建構函式,就有問題。 (這裡補充一下,我們都知道,當我們不寫有參建構函式的時候,系統會自動生成一個無參建構函式,而且每個類的建立都依賴建構函式,子類的建構函式依賴父類的建構函式,這牽扯到一個隱式傳

Java是否可以繼承的私有的方法和屬性

舉例:public class Employee {private String name;private double salary = 15000.00;private Date birthDate;public Employee(String n, Date Dob)

面向物件 中 < 過載 重寫 >的方法

<?php header("Content-Type: text/html; charset=utf-8"); class person{ public $name; public $age; public $sex; public function __

Java中建立例項時會建立例項嗎

不會 構建一個物件時,jvm會在堆中給物件分配空間。這些空間用來儲存當前物件例項屬性以及其父類的例項屬性(這些屬性都是從方法區中

JavaSE8基礎 多態 沒有重寫 引用調用中的方法

win tca 訪問 子類 pub ava alt lease highlight os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0)

42)繼承 有參 和無參

.com 調用父類 () 類繼承 cout include src 分享圖片 重載 1) 子類繼承有參的父類,那麽 必須在子類的 構造函數的初始化列表那裏,給父類賦值,比如說     父類 Student 的構造函數 是 Student(int age ,s

重定義父方法調用方法

ring 同名 子類 pub mes sun 自己 clas 必須 子類重定義父類方法只能調用自己的方法 。父類的同名函數被覆蓋。(只要函數名相同就構成重定義)。要調用父類的。必須用作用域。 #include<iostream> #include<stri

關於CSS中的定位使用相(絕對位置和相對位置)

需求 style 主頁 計算機 美化 情況下 mar head div 關於CSS中的定位使用子絕父相(子類絕對位置和父類相對位置) 前言:最近在學習JavaWeb前端的CSS,關於CSS中的定位有時候可能會使用到子絕父相,由於本人的水平有限如果有什麽地方說錯了,請指出

Winform利用委託實現窗體傳值窗體

首先,新建兩個窗體,父窗體Form1和子窗體Form2,新增控制元件如下。實現在子窗體的textBox中輸入字元,實時顯示在父窗體的textBox中的功能。 子窗體中程式碼: using System; using System.Windows.Forms; namespac

mysql遞迴查詢,mysql中從ID查詢所有(做無限分類經常用到)

由於mysql 不支援類似 oracle with ...connect的 遞迴查詢語法之前一直以為類似的查詢要麼用儲存過程要麼只能用程式寫遞迴查詢.現在發現原來一條sql語句也是可以搞定的先來看資料表的結構如下:id  name    parent_id&n

第036講:物件大家介紹物件

目錄 0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式! 測試題 0. 物件中的屬性和方法,在程式設計中實際是什麼? 1. 類和物件是什麼關係呢? 2. 如果我們定義了一個貓類,那你能想象出由“貓”類例項化的物件有哪些? 3. 類的定義有些時候或