欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: Java自學(xué)心得摘要(Java4Android版1-22集)終止這套視頻 [打印本頁(yè)]

作者: liuyuxi    時(shí)間: 2015-1-10 22:43
標(biāo)題: Java自學(xué)心得摘要(Java4Android版1-22集)終止這套視頻
======================================= 華麗的分割線 ====================================2013-12-28 日 更新

我之前有看過(guò)孫鑫的JAVA視頻,雖然只看了前三集,但是孫鑫老師的視頻是壓縮講的,一個(gè)視頻兩個(gè)半鐘,設(shè)計(jì)到的知識(shí)點(diǎn)很多,
前三個(gè)視頻已經(jīng)包含了《Java4Android》這套視頻前二十三集的內(nèi)容,而且講的都是原理性的知識(shí)。只是孫鑫老師講的比較死板,
舉的例子不夠生動(dòng)。而 《Java4Android》mars老師講的很生動(dòng),可惜都是表面性的東西,例如他的第十七集,對(duì)于靜態(tài)變量、
靜態(tài)函數(shù)的為什么不創(chuàng)建對(duì)象就能調(diào)用的解釋。而孫鑫老師在第二集中講的很明確。關(guān)于第十七集的心得就是看了孫鑫老師才知道的。

雖然說(shuō)Java不是我日后的方向,但是既然日后會(huì)用上,現(xiàn)在又恰好在學(xué),即使不精通JAVA也要達(dá)到熟練的程度吧?不然日后還怎么學(xué)
安卓編程。 所以我決定放棄《Java4Android》重學(xué)孫鑫老師的JAVA視頻。日后發(fā)布的也發(fā)布的也將是學(xué)孫鑫老師JAVA視頻的學(xué)習(xí)筆記。

唉,悲劇,這兩套視頻的教學(xué)思路不同,知識(shí)點(diǎn)的解析而理解也不同,只能重新學(xué)孫鑫老師的了。

翻到下面就能看到第21-22集的筆記。

======================================= 華麗的分割線 ====================================


這學(xué)期工作太忙,學(xué)單片機(jī)的時(shí)候總是被中斷,讓我很不爽。后來(lái)越來(lái)越忙就沒(méi)有再學(xué)了,這段時(shí)間還算緩下來(lái)了,不過(guò)我不想再在我非常認(rèn)真學(xué)單片機(jī)的過(guò)程中被頻繁中斷,想著日后會(huì)用到安卓手機(jī)控制單片機(jī),由于學(xué)安卓編程需要有JAVA基礎(chǔ),就先接觸一下JAVA基礎(chǔ)知識(shí),就當(dāng)充實(shí)充實(shí)自己的業(yè)余生活。
本文記載一些心得中的重點(diǎn)部分,僅用于增強(qiáng)記憶和日后復(fù)習(xí)使用。
       視頻教程來(lái)源:Java4Android系列視頻教程 網(wǎng)址:http://www.marschen.com/forum.php
       這視頻不錯(cuò),講的很生動(dòng)。搞的我看的就像是看電影一樣總想一直看下去,缺點(diǎn)就算說(shuō)的太詳細(xì)了。。。
第1集至第3集 講的是Java的一些歷史和一些基本的概念,如JDK、JRE、JVM這些。
       這里有必要說(shuō)一下,Java之所以能實(shí)現(xiàn)跨平臺(tái)是因?yàn)镴VM虛擬機(jī)的存在。我們寫(xiě)的源代碼(.java)不需要關(guān)心它會(huì)在什么平臺(tái)下執(zhí)行,它會(huì)被編譯成中間文件(.calss),而這個(gè)中間文件是和平臺(tái)無(wú)關(guān)的,主要是給JVM解釋執(zhí)行的。只要該平臺(tái)支持JVM,那么也就支持Java了,每一個(gè)平臺(tái)下的JVM都不一樣,但是它們都可以解釋并執(zhí)行中間文件。Windows平臺(tái)有Windows平臺(tái)的JVM,Linux有Liunx下的JVM,說(shuō)白了,只要能在某一平臺(tái)下設(shè)計(jì)出支持該平臺(tái)的JVM,那么該平臺(tái)就可以全面支持Java了,而JVM的設(shè)計(jì)是由Java公司自己完成,我們不需要關(guān)心。這就是Java跨平臺(tái)的秘密。
第4集:
有意思的變量解釋?zhuān)海ㄖ蕴岢鰜?lái)是因?yàn)樵撘曨l講的很有意思)
1、計(jì)算機(jī)是一種極度精確的機(jī)器,容不得半點(diǎn)馬虎。
2、它很笨,要計(jì)算數(shù)據(jù)時(shí),首先要指定數(shù)據(jù)存儲(chǔ)在內(nèi)存的位置以及空間大小。
基于上述兩點(diǎn),將一些常用的數(shù)據(jù)類(lèi)型都固定大小,如整型(int)占用4個(gè)字節(jié),字符型(int)占用2個(gè)字節(jié),byte型占用1個(gè)字節(jié)等等,之所以整出這些基本數(shù)據(jù)類(lèi)型都是為了方便寫(xiě)程序,例如你要存放一個(gè) 1025 數(shù)值或者你要存放一個(gè)字符“夢(mèng)”,就不需要自己指定要申請(qǐng)多大的內(nèi)存空間了。
       變量的聲明含義:
              int       age;
       int:變量類(lèi)型,也就是指明空間大小
       age:變量名,存放在內(nèi)存中的位置標(biāo)識(shí),這里具體放在哪個(gè)位置由系統(tǒng)負(fù)責(zé),系統(tǒng)分配好空間后會(huì)將該位置與我們的變量關(guān)聯(lián)起來(lái),相當(dāng)于給這個(gè)位置起一個(gè)名字,我們要把數(shù)據(jù)存放到age,就表明把這個(gè)數(shù)據(jù)放到age所在的內(nèi)存空間位置.
       后面的分號(hào)是標(biāo)識(shí)這條語(yǔ)句已經(jīng)結(jié)束。
第5集到第11集 主要是一些基本的程序流向控制 如判斷語(yǔ)句 分支語(yǔ)句 循環(huán)語(yǔ)句等。
第12集至第15集 主要面向?qū)ο蟮囊恍└拍睿?/div>
       這集主要解釋什么是面向?qū)ο蟆?/div>
       這集給我的沖擊很大,以前我是用C語(yǔ)言寫(xiě)代碼,使用的面向過(guò)程的思維去設(shè)計(jì)程序。面向?qū)ο髮?duì)于我來(lái)說(shuō)是一個(gè)全新編程思維。
       剛接觸這種思維,可能是因?yàn)橐郧傲?xí)慣性用面向過(guò)程的思維去設(shè)計(jì)程序,現(xiàn)在有些轉(zhuǎn)不過(guò)彎來(lái)。
1、首先確定誰(shuí)來(lái)做,其次確定怎么去做。
2、首先考慮全局,再考慮局部。
3、首先考慮抽象,再考慮具體。
如:
我們用面向?qū)ο蟮乃季S去給一棟建筑設(shè)計(jì)一座電梯。首先我們先抽象有這個(gè)電梯,然后這個(gè)電梯有高度、寬度、有門(mén)、有按鍵的屬性,它還會(huì)有開(kāi)門(mén)、關(guān)門(mén)、上升、下降等行為。確定好這些后,那么再考慮開(kāi)門(mén)的方法(行為),這門(mén)要在什么時(shí)候開(kāi),怎么開(kāi)才安全,門(mén)在什么時(shí)候后關(guān),怎么關(guān)才安全,電梯什么時(shí)候上升、什么時(shí)候下降,怎么上升、怎么下降,要上升或下降到第幾層等這些行為(這時(shí)候相當(dāng)于定義好這個(gè)類(lèi))。定義好這些后,再根據(jù)這棟建筑去具體化這個(gè)電梯,例如這建筑有幾層樓,每層樓高度是多少等,這關(guān)乎電梯的上升、下降的高度等。(這個(gè)時(shí)候相當(dāng)于引用電梯這個(gè)類(lèi)創(chuàng)建出這個(gè)對(duì)象,并初始化這個(gè)對(duì)象的一些參數(shù))。不同的建筑需要具體化合適這棟建筑的電梯。
第13集 類(lèi)和對(duì)象
       類(lèi)是抽象的,對(duì)象是具體的。
類(lèi)里面有狀態(tài)、行為。
類(lèi)里面的變量就是記錄狀態(tài),而里面的函數(shù)則是行為(方法)。
舉個(gè)例子:
類(lèi)相當(dāng)于是指明狗這種種類(lèi)的一系列特征:身高、體重、毛色等一些屬性,還有怎么吠叫、怎么吃飯等一些行為。它是一個(gè)抽象的東西,就好像我們說(shuō)到狗,腦子里面就會(huì)想起狗的這些特征,滿(mǎn)足這些特征才會(huì)被我們認(rèn)為是狗,但并不具體到是哪一種狗,哈巴狗?藏獒?還是流浪狗?它們都是狗。
而對(duì)象則是具體到哪一種狗,藏獒和哈巴狗叫的聲音不太一樣,跑的也不一樣,喜歡吃的食物也不同。
類(lèi)和對(duì)象就好像我們需要一條狗(狗這種種類(lèi)),這就選擇了狗這個(gè)類(lèi)。至于是什么狗,要看自己的需求,假設(shè)我們要一條藏獒,那么它應(yīng)該是很彪悍的,發(fā)出的叫聲應(yīng)該是讓人很害怕的。那么這時(shí)候我們創(chuàng)建這個(gè)類(lèi)的對(duì)象,設(shè)置這只狗的身高、體重、毛的顏色等一些屬性,然后我們要這只狗吠叫,就使用里面吠叫的方法。
定義類(lèi)的方法:
Class 類(lèi)名
   屬性;—> 屬性也叫成員變量,用來(lái)描述類(lèi)的狀態(tài),如上面狗的身高、體重、毛色等。
   方法;—> 方法也叫成員方法,用來(lái)描述類(lèi)的行為,如上面狗的吠叫,吃飯等。。。
生成對(duì)象的方法和流程。
例:Dog       dog = new Dog();
Dog       dog:系統(tǒng)會(huì)在棧內(nèi)存空間創(chuàng)建Dog的一個(gè)引用名,為dog。
new Dog():系統(tǒng)會(huì)在堆內(nèi)存空間創(chuàng)建Dog的一個(gè)對(duì)象。
=:賦值號(hào)就是把在堆內(nèi)存空間創(chuàng)建的Dog對(duì)象關(guān)聯(lián)到dog 這個(gè)引用名。
當(dāng)我們使用的時(shí)候就是需要用引用名去操作這個(gè)對(duì)象。


第14集:

下面這個(gè)例子很形象的表現(xiàn)出類(lèi)與對(duì)象的關(guān)系。

class Dog                            // 定義狗這一類(lèi)
{
String       Zhonglei;              // 狗的品種
String       name;              // 狗的名字
int              age;                     // 狗的年齡
String       color;              // 狗的毛色
String       Xingbie;              // 性別
void jump()
System.out.Println(“跳啊跳啊。。。我拼命跳。。。”);
}
class Test
{
Public static void main(String args[])
{
Dog              Mydog = new Dog();              // 創(chuàng)建一只狗
Mydog.Zhonglei        =  “牧羊犬”;              // 我喜歡這品種
Mydog.name        =  “小黑”;                     // 這狗就叫小黑吧。
Mydog.colcr  =  “黑色”;                     // 它的毛色是黑色的
            Mydog.age       =  1;                            // 它1歲了
Mydog.Xingbie       =  “雄性”;              // 公的
Mydog.jump();                                   // 這只1歲的黑色小黑跳起來(lái)了。
Dog              Mydog1= new Dog();       // 小黑太孤單了,給它創(chuàng)建個(gè)伴侶吧。
Mydog.Zhonglei        =  “牧羊犬”;
Mydog.name        =  “小白”;                     // 這狗就叫小白吧。
Mydog.colcr  =  “白色”;                     // 它的毛色是白色的
            Mydog.age       =  1;                            // 它也是1歲。
Mydog.Xingbie       =  “雌性”;              // 母的
Mydog.jump();                                   // 這只1歲的白色小狗也開(kāi)心跳起來(lái)了。
}
}
用著這種設(shè)計(jì)思想,感覺(jué)自己就像是上帝,哈哈。
Mydog 和 Mydog1 都是狗,但它們不是同一只狗,而是兩只不太一樣的狗。像上面的例子,還可以再創(chuàng)建一只藏獒(創(chuàng)建對(duì)象),藏獒和牧羊犬都是同一個(gè)物種,但卻不是同一個(gè)品種。很靈活。 Dog就是抽象的,而創(chuàng)建的對(duì)象則是具體的。就上面的例子來(lái)說(shuō),棧空間內(nèi)會(huì)存放兩個(gè)對(duì)象名,堆空間內(nèi)存放著兩個(gè)對(duì)象。
匿名對(duì)象:
如:new Dog().jump();              
因?yàn)闆](méi)有給引用名,所以它是一次性的,不知道匿名對(duì)象算不算是創(chuàng)建了一只狗又扔了它。。。真狠心。。。。。

第15集:
函數(shù)重載:一個(gè)類(lèi)中的有多個(gè)函數(shù)名一樣,但參數(shù)數(shù)量、類(lèi)型不同的函數(shù)。系統(tǒng)會(huì)根據(jù)我們所傳遞的參數(shù)去判斷我們要調(diào)用的是哪一個(gè)函數(shù)。
構(gòu)造函數(shù):必須和類(lèi)名相同,利用函數(shù)重載,可以有多個(gè)構(gòu)造函數(shù)。構(gòu)造函數(shù)會(huì)在new創(chuàng)建一個(gè)對(duì)象時(shí)自動(dòng)被調(diào)用,調(diào)用哪個(gè)構(gòu)造函數(shù)取決自己new 類(lèi)名(參數(shù))所傳遞的參數(shù),一般用于給成員變量賦初始值。如果沒(méi)有寫(xiě)構(gòu)造函數(shù),編譯器會(huì)自動(dòng)添加一個(gè)無(wú)參數(shù)、無(wú)函數(shù)體的空構(gòu)造函數(shù)。構(gòu)造函數(shù)是木有返回值滴。
第16集 (this的作用和使用方法)
this(參數(shù)):調(diào)用本類(lèi)中構(gòu)造函數(shù),只能寫(xiě)在函數(shù)中的第一句。
this.變量:在函數(shù)中訪問(wèn)本類(lèi)中的變量,一般區(qū)分函數(shù)中有和類(lèi)中同名的變量。
this.函數(shù):調(diào)用本類(lèi)中的函數(shù)。
第17集(關(guān)于靜態(tài) static)
靜態(tài)變量和靜態(tài)函數(shù)可以在不new(創(chuàng)建)對(duì)象的情況下直接調(diào)用。
例:
class Test
{
static int i ;
static void fun()
{
System.out.println(“static fun Run....”);
}
}
class main
{      
public static void main(String args[])
{
Test.i = 10;
Test.fun();
}
}
被聲明為static的變量或函數(shù)都會(huì)在該類(lèi)被裝載時(shí)會(huì)被創(chuàng)建在堆棧里。也就是說(shuō)不需要我們new,內(nèi)存中已經(jīng)有它們的存在。而且它們都是被所有這類(lèi)的對(duì)象所共享。
靜態(tài)變量或靜態(tài)函數(shù),之所以可以在未用new在堆空間里創(chuàng)建新的對(duì)象時(shí),卻仍可以通過(guò)類(lèi)名使用,是因?yàn)樗诔绦蜻\(yùn)行時(shí)已經(jīng)在堆內(nèi)存分配好空間,也就是說(shuō)無(wú)論有沒(méi)有new,那空間都已經(jīng)分配好并且不會(huì)變動(dòng)。
  如視頻中的例子:在Person類(lèi)里面的static int i; 在類(lèi)第一次被裝載時(shí) i 這個(gè)變量已經(jīng)在堆空間分配好并且不會(huì)變動(dòng),所以當(dāng)我們使用這個(gè)靜態(tài)變量時(shí)不需要重新new對(duì)象,即使new了對(duì)象,也不會(huì)再為它在堆空間重新分配內(nèi)存,無(wú)論我們new了多少個(gè)Person對(duì)象,它們都是共享同一個(gè) i 空間。所以當(dāng)改動(dòng) i 的值時(shí),自然而然的看起來(lái)是像影響到其他對(duì)象里面 的 i 值。
而 int i;這種非靜態(tài)變量則必須是在調(diào)用new時(shí)才會(huì)在堆空間分配好內(nèi)存。而且每次new的空間位置都不一樣,都是一份拷貝,每一份拷貝都關(guān)聯(lián)不同的Person對(duì)象,這樣就變成即使修改了第一個(gè)Person對(duì)象里的i,也不會(huì)影響第二個(gè)Person對(duì)象里面的i。

關(guān)于匿名靜態(tài)函數(shù):
匿名靜態(tài)函數(shù)沒(méi)有名字的函數(shù)。
static
{
System.out.println(“我是匿名靜態(tài)函數(shù)”);
}
匿名靜態(tài)函數(shù)在使用類(lèi)的時(shí)候會(huì)被調(diào)用,而構(gòu)造函數(shù)則是在new時(shí)被調(diào)用。
1、Test.i = 10 或 Test.fun()    匿名靜態(tài)函數(shù)會(huì)被調(diào)用
2、Test t = new Test()                 匿名靜態(tài)函數(shù)會(huì)被調(diào)用后,構(gòu)造函數(shù)才會(huì)被調(diào)用。

第18集 繼承
通過(guò)關(guān)鍵字 extends 來(lái)繼承某一類(lèi),被繼承的類(lèi)為父類(lèi),繼承的類(lèi)為子類(lèi)。
子類(lèi)擁有父類(lèi)所有的成員變量和成員函數(shù),但不擁有構(gòu)造函數(shù)。
子類(lèi)可以有自己的成員變量和函數(shù),感覺(jué)是在父類(lèi)的基礎(chǔ)上是增加狀態(tài)和行為。是父類(lèi)的一種擴(kuò)展。
例子:
class myzl extends Gog              // myzi 是子類(lèi)的名字,Gog是父類(lèi),是已經(jīng)存在的類(lèi)
{
}
第19集super關(guān)鍵字
由于子類(lèi)是不能繼承父類(lèi)的構(gòu)造函數(shù),所以可以使用super這個(gè)關(guān)鍵字去調(diào)用父類(lèi)的構(gòu)造函數(shù),當(dāng)然這個(gè)super不但可以調(diào)用父類(lèi)的構(gòu)造函數(shù)還可以在父子類(lèi)之間函數(shù)名、變量相同的情況下,在子類(lèi)調(diào)用父類(lèi)的函數(shù)或訪問(wèn)父類(lèi)的變量。super和this差不多,都是用于區(qū)分同名函數(shù)或變量。
super() :調(diào)用父類(lèi)的無(wú)參構(gòu)造函數(shù)
super (參數(shù)):調(diào)用父類(lèi)的有參構(gòu)造函數(shù)
super和this的異同:(網(wǎng)上資料)
  1)super(參數(shù)):調(diào)用基類(lèi)中的某一個(gè)構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語(yǔ)句)
  2)this(參數(shù)): 調(diào)用本類(lèi)中另一種形成的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語(yǔ)句)
  3)super:它引用當(dāng)前對(duì)象的直接父類(lèi)中的成員(用來(lái)訪問(wèn)直接父類(lèi)中被隱藏的父類(lèi)中成員                數(shù)據(jù)或函數(shù),基類(lèi)與派生類(lèi)中有相同成員定義時(shí)如:super.變量名,super.成員                函數(shù)據(jù)名(實(shí)參)
  4)this:它代表當(dāng)前對(duì)象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用this來(lái)指明當(dāng)前對(duì)象;   
          如果函數(shù)的形參與類(lèi)中的成員數(shù)據(jù)同名,這時(shí)需用this來(lái)指明成員變量名)
  5)調(diào)用super()必須寫(xiě)在子類(lèi)構(gòu)造方法的第一行,否則編譯不通過(guò)。每個(gè)子類(lèi)構(gòu)造方法
      的第一條語(yǔ)句,都是隱含地調(diào)用super(),如果父類(lèi)沒(méi)有這種形式的構(gòu)造函數(shù),那么
      在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。
  6)super()和this()類(lèi)似,區(qū)別是,super()從子類(lèi)中調(diào)用父類(lèi)的構(gòu)造方法,this()在同一類(lèi)內(nèi)
      調(diào)用其它方法。
 7)super()和this()均需放在構(gòu)造方法內(nèi)第一行。
 8)盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。
 9)this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會(huì)調(diào)用其它的構(gòu)造函數(shù),
       其它的構(gòu)造函數(shù)必然也會(huì)有super語(yǔ)句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同
       的語(yǔ)句,就失去了語(yǔ)句的意義,編譯器也不會(huì)通過(guò)。
  10)this()和super()都指的是對(duì)象,所以,均不可以在static環(huán)境中使用。包括:static變
        量,static方法,static語(yǔ)句塊。
 11)從本質(zhì)上講,this是一個(gè)指向本對(duì)象的指針, 然而super是一個(gè)Java關(guān)鍵字。



第20集
函數(shù)的override(覆蓋、重寫(xiě))
需要滿(mǎn)足兩個(gè)條件:
1、在具有父子關(guān)系的兩個(gè)類(lèi)當(dāng)中。
2、父類(lèi)和子類(lèi)都有一個(gè)同定義的函數(shù)(返回值類(lèi)型、函數(shù)名和參數(shù)列表等完全相同)
當(dāng)父類(lèi)中的某A函數(shù)完全無(wú)法滿(mǎn)足我們的要求時(shí),我們可以在子類(lèi)上重寫(xiě)父類(lèi)的A函數(shù),這個(gè)A函數(shù)會(huì)完全覆蓋父類(lèi)的A函數(shù),當(dāng)執(zhí)行A函數(shù)時(shí),父類(lèi)的函數(shù)是不會(huì)被執(zhí)行的。
當(dāng)然,很少情況下會(huì)遇到父類(lèi)A函數(shù)完全無(wú)法滿(mǎn)足我的要求,若是遇到還不如重新寫(xiě)一個(gè)函數(shù)。當(dāng)然,如果是修改以及完成的源碼,因?yàn)楹竺娴拇a已經(jīng)寫(xiě)好調(diào)用了這個(gè)A函數(shù)名,那么這時(shí)候我們可以重寫(xiě)A函數(shù),而不必要修改后續(xù)的代碼調(diào)用。
一般遇到的是父類(lèi)的A函數(shù)能滿(mǎn)足一些基本的要求,但還是缺少一些功能,這時(shí)候我們可以先通過(guò)super.A() 來(lái)直接調(diào)用父類(lèi)的代碼,然后下面再添加需要的一些功能,這樣當(dāng)子類(lèi)的A函數(shù)被調(diào)用時(shí),會(huì)執(zhí)行super.A(),而super.A()會(huì)是調(diào)用父類(lèi)的A函數(shù),那么父類(lèi)的A函數(shù)執(zhí)行完后就會(huì)執(zhí)行接下來(lái)我們寫(xiě)的代碼了。
例:
class Person
{
       String name;
       int age;
      
       void OutMsg()
       {
              System.out.println("父類(lèi) OutMsg");
              System.out.println("我的名字是" + name + "我的年齡是" + age);
       }
}
class Student extends Person
{
       String address;
      
       void OutMsg()
       {
              // 若這里是和父類(lèi)的代碼一樣則可以換成 super.OutMsg();
              // 這樣就可以直接調(diào)用父類(lèi)的OutMsg函數(shù),避免重復(fù)代碼
              System.out.println("子類(lèi) OutMsg");
              System.out.println("名字是" + name + "年齡是" + age);
              
              // 這是子類(lèi)新增加的代碼
              System.out.println("我的地址是" + address);
       }
}
class Test
{
       public static void main(String[] args)
       {
              Student s = new Student();
              
              s.name = "張三楓";
              s.age = 20;
              s.address = "廣東";
              
              s.OutMsg();
       }      
}
輸出:
D:\MyJava>javac *.java
D:\MyJava>java Test
子類(lèi) OutMsg
名字是張三楓年齡是20
我的地址是廣東

================================================ 華麗的分割線 ================================================
2013-12-28 日 更新
[color=#3306f9,strength=3)"]================================================ 華麗的分割線 ================================================[color=#3306f9,strength=3)"]


21 對(duì)象的轉(zhuǎn)型
這一集特讓我糾結(jié)!作者說(shuō)的不是很詳細(xì),而且給出的結(jié)論也跟我自己做實(shí)驗(yàn)的不符。最最最重要的是,作者介紹了對(duì)象的轉(zhuǎn)型卻沒(méi)有舉個(gè)例子說(shuō)明其有什么作用。讓我感覺(jué)這玩意是不是沒(méi)啥用的。。。
對(duì)象向上轉(zhuǎn)型:將子類(lèi)的對(duì)象賦值給父類(lèi)的引用。
如:Student(子類(lèi))繼承 Person(父類(lèi))
       Student   s = new Student();        // 創(chuàng)建一個(gè)子類(lèi)對(duì)象 s指向這個(gè)對(duì)象
       Person    p = s;                           //通過(guò)子類(lèi)的引用將Student對(duì)象賦值給父類(lèi)的引用
       此時(shí)sp指向的是同一個(gè)對(duì)象。那么是否能把p當(dāng)成s去使用呢?看下面的例子。
class Person
{
       String name;
       int age;
       String yiyang;

       // 父類(lèi)有的
       void Person_fun()
       {
              System.out.println("父類(lèi):Person_fun執(zhí)行");
       }

       void OutMsg()
       {
              System.out.println("父類(lèi):OutMsgyiyang = "+yiyang);
              System.out.println("父類(lèi):我的名字是" + name + "我的年齡是" + age);
       }
}
class Studentextends Person
{
       String address;
       String yiyang;               //和父類(lèi)同名的
       void Student_fun()
       {
              System.out.println("子類(lèi):Student_fun 執(zhí)行super.yiyang = " + super.yiyang);
       }

       void OutMsg()
       {
              super.OutMsg();                   // 調(diào)用父類(lèi)的OutMsg函數(shù)               
              System.out.println("子類(lèi):我的地址是address=" +address + " yiyang=" + yiyang);      //這是子類(lèi)新增加的代碼
       }
}

class Test
{
       publicstatic void main(String[] args)
       {
              System.out.println("---------------邪惡的分割線-------------");
              System.out.println("以下是父類(lèi)的對(duì)象操作。。。。");
              System.out.println("------------------------------------------");

              Person p1 = new Person();
              
              p1.yiyang = "父類(lèi)yiyang";
              p1.name = " 父類(lèi)";
              p1.age = 21;
              //p1.address = "廣州";   // 由于Person類(lèi)沒(méi)有這個(gè)變量 當(dāng)然編譯報(bào)錯(cuò)

              p1.OutMsg();         //直接調(diào)用Person類(lèi)的函數(shù)OutMsg();
              //p1.Student_fun(); // 由于Person類(lèi)沒(méi)有這個(gè)函數(shù) 當(dāng)然編譯報(bào)錯(cuò)
              p1.Person_fun();    //直接調(diào)用Person類(lèi)的函數(shù)OutMsg();



              System.out.println("\n\n---------------邪惡的分割線-------------");
              System.out.println("以下是子類(lèi)的對(duì)象操作。。。。");
              System.out.println("------------------------------------------\n");

              Student s1 = new Student();
              
              s1.yiyang = "子類(lèi)yiyang";           // 與父類(lèi)同名變量,賦值的是子類(lèi)的變量
              s1.name = " 子類(lèi)";                            // 子類(lèi)沒(méi)有。賦值的是父類(lèi)的變量
              s1.age = 22;                                //同上
              s1.address = "深圳";                    // 父類(lèi)沒(méi)有,賦值的是子類(lèi)的變量

              s1.OutMsg();                       //該函數(shù)被重寫(xiě)(覆蓋)所以調(diào)用的是子類(lèi)的函數(shù)
              s1.Student_fun();                 //子類(lèi)獨(dú)有,調(diào)用的是子類(lèi)的
              s1.Person_fun();                  // 子類(lèi)沒(méi)有,調(diào)用的是父類(lèi)的
              


              System.out.println("\n\n---------------邪惡的分割線-------------");
              System.out.println("以下是對(duì)象向上轉(zhuǎn)型操作。。。。");
              System.out.println("------------------------------------------\n");

              Student s = new Student();
              Person  p = s;              // 對(duì)象的向上轉(zhuǎn)型
              
              p.yiyang = "上轉(zhuǎn)—yiyang";   // 與子類(lèi)同名,實(shí)際上賦值的是父類(lèi)的成員變量
              p.name = " 對(duì)象向上轉(zhuǎn)型";  //只有父類(lèi)有這個(gè)成員變量 賦值的是父類(lèi)的成員變量
              p.age = 23;            //賦值的是父類(lèi)的成員變量  賦值的是父類(lèi)的成員變量
              //p.address = "廣東";     // 在父類(lèi)沒(méi)有這個(gè)成員變量,編譯會(huì)報(bào)錯(cuò)這行
              
              p.OutMsg();         // 被復(fù)寫(xiě)(覆蓋)的函數(shù),調(diào)用的是子類(lèi)的OutMsg()               
              //p.Student_fun();   // 在父類(lèi)沒(méi)有這個(gè)成員函數(shù),編譯會(huì)報(bào)錯(cuò)這行
              p.Person_fun();     //可以調(diào)用父類(lèi)的成員函數(shù)

       }     
}
java編譯輸出:

如果沒(méi)有紅色字體沒(méi)有被注釋則輸出:
D:\MyJava>javacTest.java
Test.java:14: 錯(cuò)誤: 找不到符號(hào)
                p1.address = "廣州";    // 由于Person類(lèi)沒(méi)有這個(gè)變量 當(dāng)然編譯報(bào)錯(cuò)

                  ^
  符號(hào):   變量 address
  位置: 類(lèi)型為Person的變量 p1
Test.java:17: 錯(cuò)誤: 找不到符號(hào)
                p1.Student_fun();       // 由于Person類(lèi)沒(méi)有這個(gè)函數(shù) 當(dāng)然編譯報(bào)錯(cuò)

                  ^
  符號(hào):   方法 Student_fun()
  位置: 類(lèi)型為Person的變量 p1
Test.java:49: 錯(cuò)誤: 找不到符號(hào)
                p.address = "廣東";     // 在父類(lèi)沒(méi)有這個(gè)成員變量,編譯會(huì)報(bào)錯(cuò)這

                 ^
  符號(hào):   變量 address
  位置: 類(lèi)型為Person的變量 p
Test.java:52: 錯(cuò)誤: 找不到符號(hào)
                p.Student_fun();        // 在父類(lèi)沒(méi)有這個(gè)成員函數(shù),編譯會(huì)報(bào)錯(cuò)這

                 ^
  符號(hào):   方法 Student_fun()
  位置: 類(lèi)型為Person的變量 p
4 個(gè)錯(cuò)誤




如果注釋了紅色字體則成功被編譯。輸出的執(zhí)行結(jié)果是:

D:\MyJava>java Test
--------------- 邪惡的分割線 -------------
以下是父類(lèi)的對(duì)象操作。。。。
------------------------------------------
父類(lèi):OutMsgyiyang = 父類(lèi)yiyang                // 這個(gè)就不用解釋了,非常普通的類(lèi)操作
父類(lèi):我的名字是 父類(lèi)我的年齡是21
父類(lèi):Person_fun 執(zhí)行


--------------- 邪惡的分割線 -------------
以下是子類(lèi)的對(duì)象操作。。。。
------------------------------------------

父類(lèi):OutMsgyiyang = null        // 這里的yiyang是父類(lèi)的,沒(méi)給父類(lèi)yiyang賦值自然是null
父類(lèi):我的名字是 子類(lèi)我的年齡是22         //子類(lèi)沒(méi)有同名變量,所以是給父類(lèi)賦值
子類(lèi):我的地址是address=深圳 yiyang=子類(lèi)yiyang     
子類(lèi):Student_fun執(zhí)行super.yiyang = null  //同名變量,賦值的是子類(lèi)的,而不是父類(lèi)的
父類(lèi):Person_fun 執(zhí)行


--------------- 邪惡的分割線 -------------
以下是對(duì)象向上轉(zhuǎn)型操作。。。。
------------------------------------------

父類(lèi):OutMsgyiyang = 上轉(zhuǎn)—yiyang
父類(lèi):我的名字是 對(duì)象向上轉(zhuǎn)型我的年齡是23
子類(lèi):我的地址是address=null  yiyang=null           //可以發(fā)現(xiàn)子類(lèi)的變量并沒(méi)有被賦值
父類(lèi):Person_fun 執(zhí)行


我們可以總結(jié)一下,對(duì)象的向上轉(zhuǎn)型,在訪問(wèn)變量和函數(shù)的時(shí)候,和直接操作父類(lèi)對(duì)象相比,當(dāng)父類(lèi)對(duì)象調(diào)用不存在的函數(shù)和變量時(shí),編譯器直接報(bào)錯(cuò)。向上轉(zhuǎn)型對(duì)象也是。唯一和直接操作父類(lèi)對(duì)象不同的是,在調(diào)用被子類(lèi)重寫(xiě)(覆蓋)的函數(shù)時(shí),向上轉(zhuǎn)型對(duì)象操作的是子類(lèi)的函數(shù),而操作父類(lèi)對(duì)象則是直接調(diào)用父類(lèi)的函數(shù)。



下面是作者給出的結(jié)論:
       一個(gè)引用能夠調(diào)用哪些成員(變量和函數(shù)),取決于這個(gè)引用的類(lèi)型
       一個(gè)引用調(diào)用的是哪一個(gè)方法,取決于這個(gè)引用所指向的對(duì)象
(讓我郁悶的是,函數(shù)和方法不是指一樣?xùn)|西么,很矛盾。而且第二個(gè)結(jié)論是有前提的,那就是那個(gè)方法(函數(shù))要被子類(lèi)重寫(xiě)過(guò)才成立.

下面我們看看對(duì)象的向下轉(zhuǎn)型,由于視頻并沒(méi)有做過(guò)多介紹,所以唯有自己做實(shí)驗(yàn)。
向下轉(zhuǎn)型 將父類(lèi)的對(duì)象賦值給子類(lèi)的引用
例:Student s1 =new Student();
       Personp = s1;
       Students2 = (Student)p;
或:Person p =new Student();
       Students2 = (Student)p;

Test.java文件中加入以下代碼:

class Test
{
       publicstatic void main(String[] args)
       {
              //......
              //這代碼和上面的一樣,就不寫(xiě)出了。
              //......
              System.out.println("\n\n---------------邪惡的分割線-------------");
              System.out.println("以下是對(duì)象向下轉(zhuǎn)型操作。。。。");
              System.out.println("------------------------------------------\n");

              Studentss = new Student();
              Personpx = ss;
              Studentsx = (Student)px;
                     
              sx.yiyang= "下轉(zhuǎn)-yiyang";
              sx.name= "對(duì)象向下轉(zhuǎn)型";
              sx.age= 25;
              sx.address= "惠州";
              
              sx.OutMsg();
              sx.Student_fun();
              sx.Person_fun();

       }     
}
看看輸出的結(jié)果:



發(fā)現(xiàn)向下轉(zhuǎn)型和直接使用子類(lèi)沒(méi)啥區(qū)別。。。擦......






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1