亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java 面向?qū)ο竺嬖嚰\

 更新時(shí)間:2016年11月02日 10:14:53   投稿:lqh  
這篇文章主要介紹了java 面向?qū)ο竺嬖嚰\的相關(guān)資料,這里整理了面向?qū)ο蟮幕A(chǔ)知識(shí),幫助大家學(xué)習(xí)理解此部分的知識(shí),需要的朋友可以參考下

java  面向?qū)ο螅?/strong>這里整理了面向?qū)ο蟮幕A(chǔ)知識(shí),幫助大家學(xué)習(xí)理解,希望能幫助到大家,這里是 根據(jù)公司面試資料整理的相關(guān)知識(shí):

Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類(lèi)型?

Overload是重載的意思,Override是覆蓋的意思,也就是重寫(xiě)。重載Overload表示同一個(gè)類(lèi)中可以有多個(gè)名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個(gè)數(shù)或類(lèi)型不同)。

重寫(xiě)Override表示子類(lèi)中的方法可以與父類(lèi)中的某個(gè)方法的名稱和參數(shù)完全相同,通過(guò)子類(lèi)創(chuàng)建的實(shí)例對(duì)象調(diào)用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義方法,這相當(dāng)于把父類(lèi)中定義的那個(gè)完全相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。

override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個(gè)方法并且對(duì)其重寫(xiě),以求達(dá)到不同的作用。對(duì)我們來(lái)說(shuō)最熟悉的覆蓋就是對(duì)接口方法的實(shí)現(xiàn),在接口中一般只是對(duì)方法進(jìn)行了聲明,而我們?cè)趯?shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。除了這個(gè)典型的用法以外,我們?cè)诶^承中也可能會(huì)在子類(lèi)覆蓋父類(lèi)中的方法。在覆蓋要注意以下的幾點(diǎn):

1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類(lèi);
4、被覆蓋的方法不能為private,否則在其子類(lèi)中只是新定義了一個(gè)方法,并沒(méi)有對(duì)其進(jìn)行覆蓋。

overload可以翻譯為重載,是指定義一些名稱相同的方法,通過(guò)定義不同的輸入?yún)?shù)來(lái)區(qū)分這些方法,然后再調(diào)用時(shí),VM就會(huì)根據(jù)不同的參數(shù)樣式,來(lái)選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點(diǎn):

1、在使用重載時(shí)只能通過(guò)不同的參數(shù)樣式。例如,不同的參數(shù)類(lèi)型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類(lèi)型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2、不能通過(guò)訪問(wèn)權(quán)限、返回類(lèi)型、拋出的異常進(jìn)行重載;
3、方法的異常類(lèi)型和數(shù)目不會(huì)對(duì)重載造成影響;
4、對(duì)于繼承來(lái)說(shuō),如果某一方法在父類(lèi)中是訪問(wèn)權(quán)限是priavte,那么就不能在子類(lèi)對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效果。

如果幾個(gè)Overloaded的方法的參數(shù)列表不一樣,它們的返回者類(lèi)型可以不一樣。如果兩個(gè)方法的參數(shù)列表完全一樣,就不可以通過(guò)返回值不同來(lái)實(shí)現(xiàn)重載Overload。我們可以用反證法來(lái)說(shuō)明這個(gè)問(wèn)題,例如,我們調(diào)用map.remove(key)方法時(shí),雖然remove方法有返回值,但是我們通常都不會(huì)定義接收返回結(jié)果的變量,這時(shí)候假設(shè)該類(lèi)中有兩個(gè)名稱和參數(shù)列表完全相同的方法,僅僅是返回類(lèi)型不同,Java就無(wú)法確定編程者倒底是想調(diào)用哪個(gè)方法了,因?yàn)樗鼰o(wú)法通過(guò)返回結(jié)果類(lèi)型來(lái)判斷。

構(gòu)造器Constructor是否可被override?

構(gòu)造器Constructor不能被繼承,因此不能重寫(xiě)Override,但可以被重載Overload。

接口是否可繼承接口? 抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口? 抽象類(lèi)是否可繼承具體類(lèi)(concrete class)? 抽象類(lèi)中是否可以有靜態(tài)的main方法?

接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口。抽象類(lèi)中可以有靜態(tài)的main方法。

抽象類(lèi)與普通類(lèi)的唯一區(qū)別就是不能創(chuàng)建實(shí)例對(duì)象和允許有abstract方法。

寫(xiě)clone()方法時(shí),通常都有一行代碼,是什么?

Clone()方法就是克隆,就是拷貝對(duì)象;即已經(jīng)有對(duì)象A,其中A中包含了一些有效的值,但想要有個(gè)對(duì)象B,并且對(duì)B的任何改動(dòng)都不會(huì)影響到A中的值,但B又不是被new出的新的對(duì)象。

拷貝:①拷貝對(duì)象返回的是一個(gè)新的對(duì)象,而不是有一個(gè)引用。②拷貝對(duì)象與用new操作符返回的對(duì)象的區(qū)別是拷貝 的已經(jīng)包含了原來(lái)對(duì)象的信 息,而不是對(duì)象 的初始信息

clone 有缺省行為,super.clone();因?yàn)槭紫纫迅割?lèi)中的成員復(fù)制到位,然后才是復(fù)制自己的成員。

面向?qū)ο蟮奶卣饔心男┓矫?/strong>

面向?qū)ο蟮木幊陶Z(yǔ)言有封裝、繼承 、抽象、多態(tài)等4個(gè)主要的特征。

1封裝:

封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來(lái)的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z(yǔ)言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語(yǔ)言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類(lèi)中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問(wèn)同一個(gè)對(duì)象中的屬性。通常情況下,只要記住讓變量和訪問(wèn)這個(gè)變量的方法放在一起,將一個(gè)類(lèi)中的成員變量全部定義成私有的,只有這個(gè)類(lèi)自己的方法才可以訪問(wèn)到這些成員變量,這就基本上實(shí)現(xiàn)對(duì)象的封裝。把握一個(gè)原則:把對(duì)同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個(gè)類(lèi)中,把方法和它操作的數(shù)據(jù)放在同一個(gè)類(lèi)中。

2.抽象:

抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個(gè)類(lèi),這個(gè)類(lèi)只考慮這些事物的相似和共性之處,并且會(huì)忽略與當(dāng)前主題和目標(biāo)無(wú)關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象包括行為抽象和狀態(tài)抽象兩個(gè)方面。例如,定義一個(gè)Person類(lèi),如下:

class Person{ 
String name; 
int age; 
} 

人本來(lái)是很復(fù)雜的事物,有很多方面,但因?yàn)楫?dāng)前系統(tǒng)只需要了解人的姓名和年齡,所以上面定義的類(lèi)中只包含姓名和年齡這兩個(gè)屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標(biāo)無(wú)關(guān)的細(xì)節(jié)。

3.繼承:

在定義和實(shí)現(xiàn)一個(gè)類(lèi)的時(shí)候,可以在一個(gè)已經(jīng)存在的類(lèi)的基礎(chǔ)之上來(lái)進(jìn)行,把這個(gè)已經(jīng)存在的類(lèi)所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來(lái)的方法使之更適合特殊的需要,這就是繼承。繼承是子類(lèi)自動(dòng)共享父類(lèi)數(shù)據(jù)和方法的機(jī)制,這是類(lèi)之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。

4多態(tài):

多態(tài)是指程序中定義的引用變量所指向的具體類(lèi)型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類(lèi)的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類(lèi)中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類(lèi),這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類(lèi)實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。例如,下面代碼中的UserDao是一個(gè)接口,它定義引用變量userDao指向的實(shí)例對(duì)象由daofactory.getDao()在執(zhí)行的時(shí)候返回,有時(shí)候指向的是UserJdbcDao這個(gè)實(shí)現(xiàn),有時(shí)候指向的是UserHibernateDao這個(gè)實(shí)現(xiàn),這樣,不用修改源代碼,就可以改變userDao指向的具體類(lèi)實(shí)現(xiàn),從而導(dǎo)致userDao.insertUser()方法調(diào)用的具體代碼也隨之改變,即有時(shí)候調(diào)用的是UserJdbcDao的insertUser方法,有時(shí)候調(diào)用的是UserHibernateDao的insertUser方法:

UserDao userDao = daofactory.getDao(); userDao.insertUser(user);

java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?

靠的是父類(lèi)或接口定義的引用變量可以指向子類(lèi)或具體實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類(lèi)型中定義的方法。

abstract class和interface有什么區(qū)別?

含有abstract修飾符的class即為抽象類(lèi),abstract 類(lèi)不能創(chuàng)建的實(shí)例對(duì)象。含有abstract方法的類(lèi)必須定義為abstract class,abstract class類(lèi)中的方法不必是抽象的。abstract class類(lèi)中定義抽象方法必須在具體(Concrete)子類(lèi)中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果子類(lèi)沒(méi)有實(shí)現(xiàn)抽象父類(lèi)中的所有抽象方法,那么子類(lèi)也必須定義為abstract類(lèi)型。
接口(interface)可以說(shuō)成是抽象類(lèi)的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類(lèi)型,接口中的成員變量類(lèi)型默認(rèn)為public static final。

兩者的語(yǔ)法區(qū)別:

1.抽象類(lèi)可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
2.抽象類(lèi)中可以有普通成員變量,接口中沒(méi)有普通成員變量
3.抽象類(lèi)中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類(lèi)中的抽象方法的訪問(wèn)類(lèi)型可以是public,protected和(默認(rèn)類(lèi)型,雖然eclipse下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是public類(lèi)型的,并且默認(rèn)即為public abstract類(lèi)型。
5. 抽象類(lèi)中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6. 抽象類(lèi)和接口中都可以包含靜態(tài)成員變量,抽象類(lèi)中的靜態(tài)成員變量的訪問(wèn)類(lèi)型可以任意,但接口中定義的變量只能是public static final類(lèi)型,并且默認(rèn)即為public static final類(lèi)型。
7. 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)。

兩者在應(yīng)用上的區(qū)別:

接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類(lèi)在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用,例如,模板方法設(shè)計(jì)模式是抽象類(lèi)的一個(gè)典型應(yīng)用,假設(shè)某個(gè)項(xiàng)目的所有Servlet類(lèi)都要用相同的方式進(jìn)行權(quán)限判斷、記錄訪問(wèn)日志和處理異常,那么就可以定義一個(gè)抽象的基類(lèi),讓所有的Servlet都繼承這個(gè)抽象基類(lèi),在抽象基類(lèi)的service方法中完成權(quán)限判斷、記錄訪問(wèn)日志和處理異常的代碼,在各個(gè)子類(lèi)中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下:

public abstract class BaseServlet extends HttpServlet{
    public final void service(HttpServletRequest request, HttpServletResponse response) throws  
    IOExcetion,ServletException {
   記錄訪問(wèn)日志
     進(jìn)行權(quán)限判斷
      if(具有權(quán)限){
  try{
    doService(request,response);
}
  catch(Excetpion e) {
      記錄異常信息
  }
}
    } 
    protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws 
   IOExcetion,ServletException; //注意訪問(wèn)權(quán)限定義成protected,顯得既專業(yè),又嚴(yán)謹(jǐn),因?yàn)樗莭
                 專門(mén)給子類(lèi)用的
public class MyServlet1 extends BaseServlet
{
protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
    {
      本Servlet只處理的具體業(yè)務(wù)邏輯代碼
    } 

}

父類(lèi)方法中間的某段代碼不確定,留給子類(lèi)干,就用模板方法設(shè)計(jì)模式。

abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?

abstract的method 不可以是static的,因?yàn)槌橄蟮姆椒ㄊ且蛔宇?lèi)實(shí)現(xiàn)的,而static與子類(lèi)扯不上關(guān)系!

native方法表示該方法要用另外一種依賴平臺(tái)的編程語(yǔ)言實(shí)現(xiàn)的,不存在著被子類(lèi)實(shí)現(xiàn)的問(wèn)題,所以,它也不能是抽象的,不能與abstract混用。例如,F(xiàn)ileOutputSteam類(lèi)要硬件打交道,底層的實(shí)現(xiàn)用的是操作系統(tǒng)相關(guān)的api實(shí)現(xiàn),例如,在windows用C語(yǔ)言實(shí)現(xiàn)的,所以,查看jdk 的源代碼,可以發(fā)現(xiàn)FileOutputStream的open方法的定義如下:private native void open(String name) throws FileNotFoundException;

如果我們要用java調(diào)用別人寫(xiě)的c語(yǔ)言函數(shù),我們是無(wú)法直接調(diào)用的,我們需要按照java的要求寫(xiě)一個(gè)c語(yǔ)言的函數(shù),又我們的這個(gè)c語(yǔ)言函數(shù)去調(diào)用別人的c語(yǔ)言函數(shù)。由于我們的c語(yǔ)言函數(shù)是按java的要求來(lái)寫(xiě)的,我們這個(gè)c語(yǔ)言函數(shù)就可以與java對(duì)接上,java那邊的對(duì)接方式就是定義出與我們這個(gè)c函數(shù)相對(duì)應(yīng)的方法,java中對(duì)應(yīng)的方法不需要寫(xiě)具體的代碼,但需要在前面聲明native。

對(duì)于synchronized,方法上的synchronized同步所使用的同步鎖對(duì)象是this,而抽象方法上無(wú)法確定this是什么。

什么是內(nèi)部類(lèi)?Static Nested Class 和 Inner Class的不同。

內(nèi)部類(lèi)就是在一個(gè)類(lèi)的內(nèi)部定義的類(lèi),內(nèi)部類(lèi)中不能定義靜態(tài)成員,靜態(tài)成員不是對(duì)象的特性,只是為了找一個(gè)容身之處,所以需要放到一個(gè)類(lèi)中而已,,內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)中的成員變量,內(nèi)部類(lèi)可以定義在外部類(lèi)的方法外面,也可以定義在外部類(lèi)的方法體中,如下所示:

public class Outer
{
    int out_x = 0;
    public void method()
    {
      Inner1 inner1 = new Inner1();
      public class Inner2  //在方法體內(nèi)部定義的內(nèi)部類(lèi)
      {
        public method()
        {
          out_x = 3;
        }
      }
      Inner2 inner2 = new Inner2();
    }

    public class Inner1  //在方法體外面定義的內(nèi)部類(lèi)
    {
    }

}

在方法體外面定義的內(nèi)部類(lèi)的訪問(wèn)類(lèi)型可以是public,protecte,默認(rèn)的private等4種類(lèi)型,這就好像類(lèi)中定義的成員變量有4種訪問(wèn)類(lèi)型一樣,它們決定這個(gè)內(nèi)部類(lèi)的定義對(duì)其他類(lèi)是否可見(jiàn);對(duì)于這種情況,我們也可以在外面創(chuàng)建內(nèi)部類(lèi)的實(shí)例對(duì)象,創(chuàng)建內(nèi)部類(lèi)的實(shí)例對(duì)象時(shí),一定要先創(chuàng)建外部類(lèi)的實(shí)例對(duì)象,然后用這個(gè)外部類(lèi)的實(shí)例對(duì)象去創(chuàng)建內(nèi)部類(lèi)的實(shí)例對(duì)象,代碼如下:

Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();

在方法內(nèi)部定義的內(nèi)部類(lèi)前面不能有訪問(wèn)類(lèi)型修飾符,就好像方法中定義的局部變量一樣,但這種內(nèi)部類(lèi)的前面可以使用final或abstract修飾符。這種內(nèi)部類(lèi)對(duì)其他類(lèi)是不可見(jiàn)的其他類(lèi)無(wú)法引用這種內(nèi)部類(lèi),但是這種內(nèi)部類(lèi)創(chuàng)建的實(shí)例對(duì)象可以傳遞給其他類(lèi)訪問(wèn)。這種內(nèi)部類(lèi)必須是先定義,后使用,即內(nèi)部類(lèi)的定義代碼必須出現(xiàn)在使用該類(lèi)之前,這與方法中的局部變量必須先定義后使用的道理也是一樣的。這種內(nèi)部類(lèi)可以訪問(wèn)方法體中的局部變量,但是,該局部變量前必須加final修飾符。

在方法體內(nèi)部還可以采用如下語(yǔ)法來(lái)創(chuàng)建一種匿名內(nèi)部類(lèi),即定義某一接口或類(lèi)的子類(lèi)的同時(shí),還創(chuàng)建了該子類(lèi)的實(shí)例對(duì)象,無(wú)需為該子類(lèi)定義名稱:

public class Outer
{
    public void start()
    {
      new Thread(
      new Runable(){
          public void run(){};
    }).start();
  }
}

最后,在方法外部定義的內(nèi)部類(lèi)前面可以加上static關(guān)鍵字,從而成為Static Nested Class,它不再具有內(nèi)部類(lèi)的特性,所有,從狹義上講,它不是內(nèi)部類(lèi)。Static Nested Class與普通類(lèi)在運(yùn)行時(shí)的行為和功能上沒(méi)有什么區(qū)別,只是在編程引用時(shí)的語(yǔ)法上有一些差別,它可以定義成public、protected、默認(rèn)的、private等多種類(lèi)型,而普通類(lèi)只能定義成public和默認(rèn)的這兩種類(lèi)型。在外面引用Static Nested Class類(lèi)的名稱為“外部類(lèi)名.內(nèi)部類(lèi)名”。在外面不需要?jiǎng)?chuàng)建外部類(lèi)的實(shí)例對(duì)象,就可以直接創(chuàng)建Static Nested Class,例如,假設(shè)Inner是定義在Outer類(lèi)中的Static Nested Class,那么可以使用如下語(yǔ)句創(chuàng)建Inner類(lèi):

Outer.Inner inner = new Outer.Inner();

由于static Nested Class不依賴于外部類(lèi)的實(shí)例對(duì)象,所以,static Nested Class能訪問(wèn)外部類(lèi)的非static成員變量。當(dāng)在外部類(lèi)中訪問(wèn)Static Nested Class時(shí),可以直接使用Static Nested Class的名字,而不需要加上外部類(lèi)的名字了,在Static Nested Class中也可以直接引用外部類(lèi)的static的成員變量,不需要加上外部類(lèi)的名字。
在靜態(tài)方法中定義的內(nèi)部類(lèi)也是Static Nested Class,這時(shí)候不能在類(lèi)前面加static關(guān)鍵字,靜態(tài)方法中的Static Nested Class與普通方法中的內(nèi)部類(lèi)的應(yīng)用方式很相似,它除了可以直接訪問(wèn)外部類(lèi)中的static的成員變量,還可以訪問(wèn)靜態(tài)方法中的局部變量,但是,該局部變量前必須加final修飾符。

內(nèi)部類(lèi)可以引用它的包含類(lèi)的成員嗎?有沒(méi)有什么限制?

完全可以。如果不是靜態(tài)內(nèi)部類(lèi),就沒(méi)有什么限制!

如果你把靜態(tài)嵌套類(lèi)當(dāng)作內(nèi)部類(lèi)的一種特例,那在這種情況下不可以訪問(wèn)外部類(lèi)的普通成員變量,而只能訪問(wèn)外部類(lèi)中的靜態(tài)成員,例如,下面的代碼:

class Outer
{
  static int x;
  static class Inner
  {
    void test()
    {
      syso(x);
    }
 }
}
}

Anonymous Inner Class (匿名內(nèi)部類(lèi)) 是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現(xiàn))interface(接口)?

可以繼承其他類(lèi)或?qū)崿F(xiàn)其他接口。不僅是可以,而是必須!

例如:

import java.util.Date;
public class Test extends Date{
  public static void main(String[] args) {
    new Test().test();
  }

  public void test(){
    System.out.println(super.getClass().getName());
  }
}

結(jié)果是Test

在test方法中,直接調(diào)用getClass().getName()方法,返回的是Test類(lèi)名,由于getClass()在Object類(lèi)中定義成了final,子類(lèi)不能覆蓋該方法,所以,在test方法中調(diào)用getClass().getName()方法,其實(shí)就是在調(diào)用從父類(lèi)繼承的getClass()方法,等效于調(diào)用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應(yīng)該是Test。如果想得到父類(lèi)的名稱,應(yīng)該用如下代碼:

getClass().getSuperClass().getName();

面向?qū)ο笈c面向過(guò)程有什么區(qū)別

1出發(fā)點(diǎn)不同。面向?qū)ο蠓椒ㄊ怯梅铣R?guī)思維的方式來(lái)處理客觀世界的問(wèn)題。強(qiáng)調(diào)把問(wèn)題域的要領(lǐng)直接影射到對(duì)象與對(duì)象之間的接口上。而面向過(guò)程方法強(qiáng)調(diào)的則是過(guò)程的抽象化與模塊化,它是以過(guò)程為中心構(gòu)造或處理客觀世界問(wèn)題。

2層次邏輯不同,面向?qū)ο蠓椒ㄊ怯糜?jì)算機(jī)邏輯來(lái)模擬客觀世界中的物理存在,以對(duì)象的集合類(lèi)作為處理問(wèn)題的基本單位,盡可能使計(jì)算機(jī)世界像客觀世界靠攏,以使問(wèn)題的處理更加直接清晰直接,面向?qū)ο蠓椒ㄊ怯妙?lèi)的層次結(jié)構(gòu)來(lái)體現(xiàn)類(lèi)之間的繼承與發(fā)展,而面向?qū)ο筮^(guò)程方法處理問(wèn)題的基本單位使能清晰準(zhǔn)確的表達(dá)過(guò)程的模塊,用模塊的層次結(jié)構(gòu)概括模塊或模塊間的關(guān)系與功能,把客觀世界的問(wèn)題抽象成計(jì)算機(jī)可以處理的過(guò)程

3數(shù)據(jù)處理方式與控制程序方式不同。面向?qū)ο蠓椒▽?shù)據(jù)與對(duì)應(yīng)的代碼封裝成一個(gè)整體,原則上其他對(duì)象不能直接修改其數(shù)據(jù),即對(duì)象的修改只能由自身的成員函數(shù)完成,控制程序方式上是通過(guò)“事件驅(qū)動(dòng)”來(lái)激活和運(yùn)行程序。而面向?qū)ο筮^(guò)程是直接通過(guò)程序來(lái)處理數(shù)據(jù),處理完畢后即顯示處理結(jié)果,在控制程序方式上是按照設(shè)計(jì)調(diào)用或返回程序,不能由導(dǎo)航,各模塊之間存在控制與被控制,調(diào)用與被調(diào)用的關(guān)系。

4分析設(shè)計(jì)與編碼轉(zhuǎn)換方式不同。面向?qū)ο蠓椒ㄘ灤┯谲浖芷诘姆治?。設(shè)計(jì)及編碼中,是一個(gè)平滑的過(guò)程,從分析到設(shè)計(jì)再到編碼是采用一致性的模型展示,即實(shí)現(xiàn)的是一種無(wú)縫連接。而面向?qū)ο筮^(guò)程方法強(qiáng)調(diào)分析設(shè)計(jì)以及編碼之間按規(guī)則進(jìn)行轉(zhuǎn)換,貫穿 與軟件生命周期的分析,設(shè)計(jì)及編碼中,實(shí)現(xiàn)的是一種有縫連接。

面向?qū)ο箝_(kāi)發(fā)方式有什么優(yōu)點(diǎn)

1較高的開(kāi)發(fā)效率。采用面向?qū)ο箝_(kāi)發(fā),可以對(duì)現(xiàn)實(shí)的事物進(jìn)行抽象,可以把現(xiàn)實(shí)的實(shí)務(wù)直接映射為開(kāi)發(fā)的對(duì)象。

2保證軟件的魯棒性,正是由于面向?qū)ο箝_(kāi)發(fā)方法有很高的重用性,在開(kāi)發(fā)過(guò)程中可以重用已有的而且在相關(guān)領(lǐng)域經(jīng)過(guò)長(zhǎng)期測(cè)試的代碼,因此,自然而然的對(duì)軟件的魯棒性起到很好的促進(jìn)作用。

3保證軟件的高維護(hù)性。由于采用面向?qū)ο蟮拈_(kāi)發(fā)方式,使得代碼的可讀性非常好,同時(shí)面向?qū)ο蟮脑O(shè)計(jì)模式使得代碼結(jié)構(gòu)更加清晰明了,同時(shí)針對(duì)面向?qū)ο箝_(kāi)發(fā)模式,已有許多非常成熟的設(shè)計(jì)模式,這些設(shè)計(jì)模式可以使程序在面對(duì)需求的變更時(shí),只需要修改部分的模塊就可以滿足需求,因?yàn)榫S護(hù)起來(lái)更加方便。

This與super有什么區(qū)別

在JAVA語(yǔ)言中,this是指向當(dāng)前實(shí)例對(duì)象,他的一個(gè)非常重要的作用就是用來(lái)區(qū)分對(duì)象的成員變量與方法的形參(當(dāng)一個(gè)方法的形參與成員變量的名字相同時(shí),就會(huì)覆蓋成員變量)。
Super可以用來(lái)訪問(wèn)父類(lèi)的方法或成員變量。當(dāng)子類(lèi)的方法或成員變量與父類(lèi)有相同的名字時(shí)也會(huì)覆蓋父類(lèi)的方法或成員變量,要想訪問(wèn)父類(lèi)的方法或成員變量只能通過(guò)super關(guān)鍵字來(lái)訪問(wèn)

如何獲取父類(lèi)的類(lèi)名

Java語(yǔ)言中提供了獲取類(lèi)名的方法:getClass().getName(),開(kāi)發(fā)人員可以調(diào)用這個(gè)方法來(lái)獲取類(lèi)名。但對(duì)于繼承,不能通過(guò)調(diào)用父類(lèi)的getClass().getName()方法來(lái)獲取父類(lèi)的類(lèi)名例如:

Class A{}
Public class Test extends A{
public void test(){
System.out.println(super.getClass().getName());
}
Public static void main(String [])args){
New Test.test();
}
}

程序運(yùn)行結(jié)果為T(mén)est。原因是java語(yǔ)言中任何類(lèi)都繼承自object類(lèi),getClass方法在object類(lèi)中被定義為final何native,子類(lèi)不能覆蓋該方法。因此this.getClass()和super.getClass()最終都調(diào)用的object類(lèi)中的getClass()方法.而object類(lèi)中的getClass()方法的釋義是:返回此object的運(yùn)行時(shí)類(lèi)??梢酝ㄟ^(guò)java的反射機(jī)制在子類(lèi)中獲取父類(lèi)的名字代碼如下:

Class A{}
Public class Test extends A{
public void test(){
System.out.println(this.getClass().getSuperclass().getName());
}
Publci static void main(string[] args){
New Test().test();
}
}

組合與繼承有什么區(qū)別

組合和繼承是面向?qū)ο笾袃煞N代碼復(fù)用的方式。組合是指在新類(lèi)里面創(chuàng)建原有類(lèi)的對(duì)象,重復(fù)利用已有類(lèi)的功能。繼承是面向?qū)ο蟮闹饕匦灾唬试S設(shè)計(jì)人員根據(jù)其他類(lèi)的實(shí)現(xiàn)來(lái)定義一個(gè)類(lèi)的實(shí)現(xiàn)。組合和繼承都允許在新的類(lèi)中設(shè)置子對(duì)象,只是組合是顯示的,而繼承是隱式的。組合和繼承存在著對(duì)應(yīng)關(guān)系:組合中的整體類(lèi)和繼承中的子類(lèi)對(duì)應(yīng),組合中的局部類(lèi)和繼承中的父類(lèi)對(duì)應(yīng)。在使用時(shí)遵循以下兩點(diǎn)原則:

1除非兩個(gè)類(lèi)之間是“is-a”的關(guān)系,否則不要輕易使用繼承,因?yàn)檫^(guò)多的使用繼承會(huì)破壞代碼的可維護(hù)性,當(dāng)父類(lèi)被修改時(shí),會(huì)影響到所有繼承自他的子類(lèi)。

2,不要僅僅為了實(shí)現(xiàn)多態(tài)而使用繼承,如果類(lèi)之間不是“is-a”的關(guān)系,就可以通過(guò)實(shí)現(xiàn)接口與組合的方式來(lái)達(dá)到相同的目的。
由于java語(yǔ)言只支持單繼承,如果想同時(shí)繼承兩個(gè)或多個(gè)類(lèi),在Java中是無(wú)法直接實(shí)現(xiàn)的,同時(shí),在java語(yǔ)言中,如果繼承太多,也會(huì)使一個(gè)class里面的內(nèi)容變得臃腫不堪,所以在Java語(yǔ)言中,能使用組合就盡量不使用繼承。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 解決Spring配置文件中bean的property屬性中的name出錯(cuò)問(wèn)題

    解決Spring配置文件中bean的property屬性中的name出錯(cuò)問(wèn)題

    這篇文章主要介紹了解決Spring配置文件中bean的property屬性中的name出錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java8中Map的一些騷操作總結(jié)

    java8中Map的一些騷操作總結(jié)

    這篇文章主要給大家介紹了關(guān)于java8中Map的一些騷操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Mybatis之a(chǎn)ssociation和collection用法

    Mybatis之a(chǎn)ssociation和collection用法

    這篇文章主要介紹了Mybatis之a(chǎn)ssociation和collection用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    前一陣子在研究文檔展示時(shí)使用了java進(jìn)程直接調(diào)用外部程序,其中遇到一個(gè)問(wèn)題花了好長(zhǎng)時(shí)間才解決,這個(gè)問(wèn)題就是外部程序直接執(zhí)行沒(méi)什么問(wèn)題,但是當(dāng)使用Java進(jìn)程執(zhí)行時(shí)外部程序就阻塞在那兒不動(dòng)了。而且這個(gè)外部程序在處理某些文件時(shí)使用Java進(jìn)程執(zhí)行是沒(méi)問(wèn)題的
    2014-03-03
  • Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析

    Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析

    這篇文章主要介紹了Java 多層嵌套JSON類(lèi)型數(shù)據(jù)全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解

    Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解

    這篇文章主要介紹了Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽(tīng)的示例

    Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽(tīng)的示例

    本篇文章主要介紹了Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽(tīng)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時(shí)響應(yīng)中斷,比如一個(gè)線程t1通過(guò)lockInterruptibly()方法獲取到一個(gè)可重入鎖,并執(zhí)行一個(gè)長(zhǎng)時(shí)間的任務(wù),需要的朋友可以參考下
    2023-12-12
  • Java was started but returned exit code=13問(wèn)題解決案例詳解

    Java was started but returned exit code=13問(wèn)題解決案例詳解

    這篇文章主要介紹了Java was started but returned exit code=13問(wèn)題解決案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 詳細(xì)解讀spring中的@Resource注解

    詳細(xì)解讀spring中的@Resource注解

    這篇文章主要介紹了詳細(xì)解讀spring中的@Resource注解,此注解來(lái)源于JSR規(guī)范(Java?Specification?Requests),其作用是找到依賴的組件注入到應(yīng)用來(lái),它利用了JNDI技術(shù)查找所需的資源,需要的朋友可以參考下
    2023-10-10

最新評(píng)論