1. 程式人生 > >Java中(向上,向下)造型造型和介面回撥中的問題

Java中(向上,向下)造型造型和介面回撥中的問題

最近回顧了一下java繼承中的問題,下面貼程式碼:

package com.cc;
/**
 * 目的:問題驗證,關於向上和向下造型過程中,檢測存在繼承關係的物件訪問關係。
 * 
 * 
 * @author Character_Painter
 *
 */
public class Base {
	protected String temp = "base";
	public void fun(){
		System.out.print("BASE fun()");
	}
public static void main(String[] args) {
		
		Base b =new Base();//例項化Base物件
		b.fun();		   //呼叫父類中fun()的方法
		System.out.println(b.temp);//訪問父類中的成員變數temp
		
		
               /*****************************************************/	
		System.out.println("/***************/");
		Son son = new Son();//例項化Son物件
		son.fun();			//呼叫son的fun方法
		System.out.println(son.temp);//訪問son的成員變數temp
		
		Son S_son=new Son();       //例項化Son物件
		Base B_s =(Base)S_son;     //向上造型-----------相當於Base s =new Son();
		B_s.fun();	           //呼叫子類的fun()方法
		System.out.println(B_s.temp);//訪問父類的成員變數temp
		
	
                /******************************************************/
		System.out.println("/***************/");
		Base s =new Son();//向上造型
		s.fun();          //呼叫子類的方法
		System.out.println(s.temp);//呼叫父類的成員變數temp
		
		Base ba =new Son();
		Son so = (Son)ba;           //向下造型
		so.fun();	            //呼叫子類的fun()方法
		System.out.println(so.temp);//訪問子類的成員變數temp
		
	}
	
	
}

class Son extends Base{
	protected String temp = "Son";
	public void fun(){
		System.out.print("SON fun()");
	}
	

	
}</span>
執行結果

BASE fun()  base
/***************/
SON fun()  Son
SON fun()  base
/***************/
SON fun()  base
SON fun()  Son

結論總結:

1、父類的引用變數可以指向子類物件,子類的引用變數不能指向父類物件。

2、向上造型(upcasting):把子類物件直接賦給父類引用,向上轉型不用強制轉型。如:

   Base base = new Son();  向上造型--隱式

3、向下造型(downcasting):把指向子類物件的父類引用賦給子類引用,要強制轉型。

  Base b= new Son();

Son s = (Son)base;----------向下造型--必須強制轉換,且必須有繼承關係

4、upcasting 會丟失子類特有的方法,但是子類overriding 父類的方法,子類物件去  呼叫方法有效

5、呼叫方法或成員變數的規律:

前提:子類存在重寫方法,父類和子類中同時有相同名稱的成員變數。

(1)當進行了向上造型的引用型變數---父類引用變數只能呼叫子類的重寫方法,但父類的引用變數只能訪問父類中的成員變數

(2)當進行了向下造型的引用型變數---子類引用變數只調用子類重寫方法,子類的引用變數只能訪問子類的成員變數。

(3)自己想了個通俗的說法,呼叫方法,得當前的引用變數指向的物件;呼叫變數,得看當前引用變數的型別。

即,調方法,藍物件,調變數,看型別。(可以試驗一下)

介面回撥與向上造型
package com.cc;
/**
 * 介面回撥,和向上造型的對比
 * @author Character_Painter
 *
 */
public class Inter extends Father implements Person,Teacher{
	public void study(){
		System.out.println("學習");
	}
	public void sleep(){
		System.out.println("子類sleep()方法");
	}
	
	public static void main(String[] args) {
		Father f = new Inter();
		f.sleep();//向上轉型---呼叫
		
		Person p=new Inter();
		p.eat();  //介面回撥方法
		
		Teacher t = new Inter();
		t.teach(); //介面回撥方法

	}

	@Override
	public void eat() {
		System.out.println("重寫eat()方法");	
	}

	@Override
	public void teach() {
		System.out.println("重寫teache()方法");	
		
	}

}

interface Person{
	public void eat();
}
interface Teacher{
	public void teach();
}
class Father{
	public void sleep(){
		System.out.println("父類sleep()方法");
	}
}

其實:

使用介面方式,其目的應該是實現多個父型別的方法實現,強調一個多種實現,而向上造型,針對的是一對一的繼承關係,向上造型後,可以呼叫子類的重寫的方法。這就是我認為他們的區別。