乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java 面向?qū)ο笾R(shí)點(diǎn)整理

       小小郡 2017-03-11

      1. 重載、重寫(xiě)和隱藏

      1). 重載(overload):

      方法重載就是多個(gè)方法名稱(chēng)相同但是參數(shù)類(lèi)型或者參數(shù)個(gè)數(shù)不同的方法, 與返回值類(lèi)型和修飾符無(wú)關(guān)

      class Test {
          public int test(int a) {
              return a;
          }
      
          public String test(String a) {
              return a;
          }
      
          public float test(int a, String b) {
              return 0f;
          }
      
          public float test(String a, int b) {
              return 1.0f;
          }
      
          String test(float a) {
              return "";
          }
      
          String test(int a) {//該方法不是重載  
              return "";
          }
      }

      前面五個(gè)互為重載,第一個(gè)和第六個(gè)雖然返回值類(lèi)型不同,但參數(shù)相同,所以第一個(gè)和第六個(gè)參數(shù)不是重載

      2). 重寫(xiě)(override):

      子類(lèi)繼承父類(lèi)時(shí),子類(lèi)的方法名稱(chēng)、參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)與父類(lèi) 完全相同 ,則認(rèn)為子類(lèi)重寫(xiě)了父類(lèi)的方法。

      方法重寫(xiě)規(guī)則:

      • 參數(shù)列表和原方法完全相同
      • 返回值類(lèi)型和原方法相同或者為父類(lèi)返回值類(lèi)型的子類(lèi)型
      • 不能比原方法限制更嚴(yán)格的訪問(wèn)級(jí)別(舉例:父類(lèi)方法為public,那么子類(lèi)不能為protected、private)
      • 父類(lèi)方法被定義為final時(shí),則不能被重寫(xiě)
      • 父類(lèi)方法被定義為static時(shí),不能被重寫(xiě),但是可以重寫(xiě)聲明一個(gè)相同的方法(參考 隱藏
      • 不能拋出新的異常或比原方法更廣泛的異常(父類(lèi)拋出IOException,重寫(xiě)方法不能拋出Exception只能拋出IOException或者IOException子類(lèi)異常)

      3). 隱藏:

      隱藏是針對(duì)于父類(lèi)的成員變量和靜態(tài)方法而言的。子類(lèi)中聲明了和父類(lèi)相同的變量名或靜態(tài)方法(方法名相同、參數(shù)列表相同、返回類(lèi)型相同)則實(shí)現(xiàn)了對(duì)父類(lèi)成員變量和靜態(tài)方法的隱藏,下面舉個(gè)例子有助理解:

      class A {  
          static int a = 1;  
          static int b = 2;  
          int c = 33;
      
          public static void printA() {  
              System.out.print(a);  
          }  
      
          public static void printB() {  
              System.out.print(b);  
          }  
      
      }
      
      class B extends A {  
          static int a = 3;  
          static int b = 4;
          int c = 44;
      
          public static void printB() { 
              System.out.print(b);  
          }  
      }
      
      public class Test {  
          public static void main(String[] args) {  
              B.printA();
              B.printB();
              System.out.print(B.a);  
      
              A a = new B();
              B b = new B();
      
              a.printB();
              b.printB();
              System.out.print(a.c);
              System.out.print(b.c);
          }  
      }  
      
      輸出結(jié)果:
      1 4 3 2 4 33 44

      如果子類(lèi)中有相同名稱(chēng)的靜態(tài)方法或變量父類(lèi)的會(huì)被 隱藏 ,如果子類(lèi)中存在同名的靜態(tài)方法或變量,則會(huì) 隱藏 父類(lèi)中得靜態(tài)方法或變量,此時(shí)子類(lèi)調(diào)用的就是子類(lèi)中自己的靜態(tài)方法或變量;如果子類(lèi)中不存在同名的靜態(tài)方法或變量,則會(huì)調(diào)用父類(lèi)中的靜態(tài)方法或變量;父類(lèi)調(diào)用的始終是其本身的靜態(tài)方法和變量。

      2. 封裝:

      封裝是把對(duì)象的屬性和操作結(jié)合為一個(gè)獨(dú)立的整體,隱藏對(duì)象內(nèi)部操作的實(shí)現(xiàn),用戶只需要通過(guò)其對(duì)外提供的方法來(lái)訪問(wèn)該對(duì)象,無(wú)需知道其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。

      優(yōu)點(diǎn):

      • 隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),提供公共訪問(wèn)方式
      • 類(lèi)內(nèi)部可以自由修改不影響其調(diào)用者
      • 減少耦合度,提高安全性

      3. 繼承:

      繼承是一個(gè)對(duì)象獲取另一個(gè)對(duì)象屬性的過(guò)程,關(guān)鍵字為 extends 和 implements 。

      1). IS-A關(guān)系(一個(gè)對(duì)象所屬于另一個(gè)對(duì)象):

      方式一. 用extends來(lái)實(shí)現(xiàn)繼承:

      public class Animal {
          public void eat() {
              System.out.println("Animal eating...");
          }
      }
      
      public class Mammal extends Animal {
          public void eat() {
              System.out.println("Mammal eating...");
          }
      }
      
      public class Dog extends Mammal {
          public void eat() {
              System.out.println("Dog eating...");
          }
      }

      方式二. 用implements來(lái)實(shí)現(xiàn)繼承:

      public interface Animal {
          void eat();
      }
      
      public class Mammal extends Animal {
          public void eat() {
              System.out.println("Mammal eating...");
          }
      }
      
      public class Dog extends Mammal {
          public void eat() {
              System.out.println("Dog eating...");
          }
      }

      無(wú)論方式一還是方式二,我們都可以用instanceof關(guān)鍵字檢查得出:Mammal是一個(gè)Animal(哺乳動(dòng)物也是動(dòng)物);Dog既是一個(gè)Mammal,也是一個(gè)Animal(狗既是哺乳動(dòng)物也是動(dòng)物)。

      public class Test {  
           /**
             * instanceof關(guān)鍵字檢查代碼
            */
          public static void main(String[] args) {
              Mammal m = new Mammal();
              Dog d = new Dog();
              System.out.print(m instanceof Animal);
              System.out.print(d instanceof Mammal);
              System.out.print(d instanceof Animal);
          }
      }
      
      輸出結(jié)果:
      true true true

      2). HAS-A關(guān)系(一個(gè)對(duì)象含有另一個(gè)對(duì)象的一些屬性):

      public class Car{}
      
      public class Speed{}
      
      public class Benz extends Car{
          private Speed sp; 
      }

      Benz含有Spend屬性,但Benz不是Spend

      4. 多態(tài):

      實(shí)現(xiàn)多態(tài)的三個(gè)必要條件:繼承、重寫(xiě)、父類(lèi)引用指向子類(lèi)對(duì)象。

      1). 向上轉(zhuǎn)型:

      我們實(shí)例化一個(gè)Dog對(duì)象可以用 Dog d = new Dog(); 我們也可以用 Animal d = new Dog(); ,后者就是向上轉(zhuǎn)型(父引用指向子對(duì)象),上面兩種方式創(chuàng)建出來(lái)的對(duì)象d,調(diào)用 d.eat(); 輸出的結(jié)果都是 Dog eating... ,這就體現(xiàn)出了java得多態(tài)。向上轉(zhuǎn)型創(chuàng)建的對(duì)象會(huì)遺失掉和父類(lèi)不同的方法和變量(不能用來(lái)調(diào)用子類(lèi)特有的方法和變量)。

      2). 舉例說(shuō)明:

      class A {
          public String show(D obj) {
              return ("A and D");
          }
      
          public String show(A obj) {
              return ("A and A");
          }
      }
      
      class B extends A {
          public String show(B obj) {
              return ("B and B");
          }
      
          public String show(A obj) {
              return ("B and A");
          }
      }
      
      class C extends B {}
      
      class D extends B {}
      
      class Test {
          public static void main(String[] args) {
              A a1 = new A();
              A a2 = new B();
              B b = new B();
              C c = new C();
              D d = new D();
              System.out.println(a1.show(b)); //  ①
              System.out.println(a1.show(c)); //  ②
              System.out.println(a1.show(d)); //  ③
              System.out.println(a2.show(b)); //  ④
              System.out.println(a2.show(c)); //  ⑤
              System.out.println(a2.show(d)); //  ⑥
              System.out.println(b.show(b));  //  ⑦
              System.out.println(b.show(c));  //  ⑧
              System.out.println(b.show(d));  //  ⑨
          }
      }
      
      輸出結(jié)果:
      A and A    //  ①
      A and A    //  ②
      A and D    //  ③
      B and A    //  ④
      B and A    //  ⑤
      A and D    //  ⑥
      B and B    //  ⑦
      B and B    //  ⑧
      A and D    //  ⑨

      前三個(gè)比較簡(jiǎn)單不容易出錯(cuò),看看下面幾個(gè):

      • ④:a2是A的引用指向B對(duì)象,向上轉(zhuǎn)型創(chuàng)建的對(duì)象會(huì)遺失掉和父類(lèi)不同的方法和變量,所以a2只能調(diào)用 show(D obj) 、 show(A obj) 兩個(gè)方法,所以 a2.show(b) 應(yīng)該調(diào)用 show(A obj) 方法,B中重寫(xiě)了該方法,所以運(yùn)行時(shí)JVM會(huì)調(diào)用B類(lèi)中重寫(xiě)的 show(A obj) 方法,所以輸出 B and A ;
      • ⑤: 原理同④;
      • ⑥: a2.show(d) 應(yīng)該調(diào)用 show(D obj) 方法,B中沒(méi)有重寫(xiě)該方法所以調(diào)用的為A類(lèi)中的該方法,所以輸出為 A and D ;
      • ⑦⑧⑨:b為B類(lèi)對(duì)象,可調(diào)用A類(lèi)中 show(D obj) 、B類(lèi)中 show(B obj) 、B類(lèi)中 show(A obj) 方法,所以輸出如上。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多