日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java学习笔记_多态/内部类

發(fā)布時間:2023/12/15 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java学习笔记_多态/内部类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

多態(tài)的格式與使用
代碼當(dāng)中體現(xiàn)多態(tài)性,其實(shí)就是一句話,父類引用指向子類對象

格式:
父類名稱 對象名 = new 子類名稱();
或者
接口名稱 對象名 = new 實(shí)現(xiàn)類名稱();

public class Demo{public static void main(String[] args){//使用多態(tài)寫法//左側(cè)父類的引用,指向了右側(cè)子類對象Fu obj = new Zi();obj.method();obj.methodFu();} }

多態(tài)中成員變量的使用特點(diǎn)
訪問成員變量的兩種方式:

  • 直接通過對象名稱訪問成員變量:看等號左邊是誰,優(yōu)先用誰,沒有則向上找
  • 間接通過成員方法訪問成員變量:看該方法屬于誰,優(yōu)先用誰,沒有則向上找
  • public class Demo{public static void main(String[] args){//使用多態(tài)寫法//左側(cè)父類的引用,指向了右側(cè)子類對象Fu obj = new Zi();System.out.println(obj.num);//父:10System.out.println(obj.age);//錯誤寫法//子類沒有覆蓋重寫,就是父//子類如果覆蓋重寫,就是子obj.showNum();} }

    多態(tài)中成員方法的使用特點(diǎn)
    在多態(tài)的代碼當(dāng)中,成員方法的訪問規(guī)則是:
    看new的是誰,就優(yōu)先用誰,沒有則向上找
    口訣:編譯看左邊,運(yùn)行看右邊

    成員變量:編譯看左邊,運(yùn)行還看左邊
    成員方法:編譯看左邊,運(yùn)行看右邊

    public class Demo{public static void main(String[] args){//使用多態(tài)寫法//左側(cè)父類的引用,指向了右側(cè)子類對象Fu obj = new Zi();//多態(tài)obj.method();//父子都有,優(yōu)先用子obj.methodFu();//子類沒有,父類有,向上找到父類//編譯看左邊,左邊是Fu,Fu當(dāng)中沒有methodZi方法,編譯報(bào)錯//obj.methodZi(); //錯誤寫法

    instantceof關(guān)鍵字
    對象一旦向上轉(zhuǎn)型為父類,那么就無法調(diào)用子類原本特有的內(nèi)容

    解決方案:用對象的向下轉(zhuǎn)型還原

    public class Demo{public static void main(String[] args){//對象的向上轉(zhuǎn)型,就是父類引用指向子類對象Animal animal = new Cat();//本來創(chuàng)建的時候是一只貓animal.eat();//貓吃魚// animal.catchMouse();//錯誤寫法//向下轉(zhuǎn)型,進(jìn)行“還原”動作Cat cat = (Cat) animal;cat.catchMouse();//貓抓老鼠 }

    如何才能知道一個父類引用的對象,本來是什么子類?
    格式:
    對象 instanceof 類名稱
    這將會得到有個boolean值結(jié)果,也就是判斷前面的對象能不能當(dāng)作后面類型的實(shí)例

    public class Demo{public static void main(String[] args){Animal animal = new Cat();//本來是一只貓animal.eat();//貓吃魚//如果希望調(diào)用子類特有的方法,需要向下轉(zhuǎn)型//判斷一下父類引用animal本來是不是Dogif(animal instanceof Dog){Dog dog = (Dog) animal;dog.watchHouse();}//判斷一下animal本來是不是catif(animal instanceof Cat){Cat cat = (Cat) animal;cat.catchMouse();}} }

    final關(guān)鍵字用于修飾類
    當(dāng)final關(guān)鍵字用來修飾一個類的時候,格式:
    public final class 類名稱{
    //…
    }

    含義:當(dāng)前這個類不能有任何子類
    注意:一個類如果是final的,那么其中所有的成員方法都無法進(jìn)行覆蓋重寫

    public final class MyClass{public void method(){System.out.println(“方法執(zhí)行”)} }

    final關(guān)鍵字修飾成員方法
    當(dāng)final關(guān)鍵字用來修飾一個方法的時候,這個方法就是最終方法,也就是不能被覆蓋重寫
    格式:
    修飾符 final 返回值類型 方法名稱(參數(shù)列表){
    //方法體
    }

    注意事項(xiàng):
    對于類、方法來說,abstract關(guān)鍵字和final關(guān)鍵字不能同時使用,因?yàn)槊?/p> public abstract /*final*/ void methodAbs();

    final關(guān)鍵字修飾局部變量
    final關(guān)鍵字代表最終的、不可改變的

    常見的四種用法:

  • 可以用來修飾一個類
  • 可以用來修飾一個方法
  • 可以用來修飾一個局部變量
  • 可以用來修飾一個成員變量
  • public class Demo{public static void main(String[] args){int num1 = 10;System.out.println(num1);num1 = 20;System.out.println(num1);//一旦使用final修飾局部變量,那么這個變量就不能更改final int num2 = 200;System.out.println(num2);//num2 = 250; //錯誤寫法,不可修改final int num3;num3 = 300;//對于基本類型來說,不可改變的是變量當(dāng)中的數(shù)據(jù)不可改變//對于引用類型來說,不可變說的是變量當(dāng)中的地址值不可改變Student stu1 = new Student(name:”zhangsan”);System.out.println(stu1);System.out.println(stu1.getName());final Student stu2 = new Student(name:”lisi”);System.out.println(stu.getName());stu2.setName(“wangwu”);System.out.println(stu2.getName());}}

    final關(guān)鍵字用于修飾成員
    對于成員變量來說,如果使用final關(guān)鍵字修飾,那么這個變量照樣是不可變的

  • 由于成員變量具有默認(rèn)值,所以使用了final之后必須手動賦值,不會再給默認(rèn)值
  • 對于final的成員變量,要么使用直接賦值,要么通過構(gòu)造方法賦值
  • 必須保證類當(dāng)中所有重載的構(gòu)造方法,都最終會對final的成員變量進(jìn)行賦值
  • public class Person{private final String name;public Person(){name = “zhangsan”;} }

    成員內(nèi)部類

    成員內(nèi)部類的定義格式

    修飾符 class 外部類名稱{
    修飾符 class 內(nèi)部類名稱{
    // …
    }
    // …
    }

    注意:內(nèi)用外,隨意訪問;外用內(nèi),需要內(nèi)部類對象

    使用成員內(nèi)部類的方式:

  • 間接訪問:在外部類當(dāng)中訪問,使用內(nèi)部類;然后main只是調(diào)用外部類的方法
  • 直接方式:公式類名稱 對象名 = new 類名稱();
    外部類名稱.內(nèi)部類名稱 對象名 = new 外部類名稱().new 內(nèi)部類名稱();
  • public class Demo{public static void main(String[] args){Body body = new Body();//通過外部類的對象,調(diào)用外部類的方法,里面間接在使用內(nèi)部類Heartbody.methodBody();Body.Heart heart = new Body().new Heart();heart.beat();} }

    內(nèi)部類的同名變量訪問
    如果出現(xiàn)了重名現(xiàn)象,那么格式是:外部類.this.外部類成員變量名

    public class Outer{int num = 10;public class Inner{int num = 20;public void methodInner(){int num = 30;System.out.println(num);//局部變量,就近原則System.out.println(this.num);//內(nèi)部類的成員變量System.out.println(Outer.this.num);//外部類的成員變量}} }

    局部內(nèi)部類的定義
    定義格式:
    修飾符 class 外部類名稱 {
    修飾符 返回值類型 外部類方法名稱(參數(shù)列表{
    class 局部內(nèi)部類名稱{
    // …
    }
    }
    }

    局部內(nèi)部類的final問題

    局部內(nèi)部類,如果希望訪問所在方法的局部變量,那么這個局部變量必須是有效final的
    備注:從Java8開始,只要局部變量事實(shí)不變,那么final關(guān)鍵字可以省略

    匿名內(nèi)部類
    如果接口的實(shí)現(xiàn)類(或者是父類的子類)只需要使用唯一的一次
    那么這種情況下就可以省略掉該類的定義,而改為使用匿名內(nèi)部類

    匿名內(nèi)部類的定義:
    接口名稱 對象名 = new 接口名稱(){
    //覆蓋重寫所有抽象方法
    }

    public class Demo{public static void main(String[] args){//MyInterface obj = new MyInterfaceImpl();//obj.method();//MyInterface some = new MyInterface();//使用匿名內(nèi)部類MyInterface obj = new MyInterface(){public void method(){System.out.println(“匿名內(nèi)部類實(shí)現(xiàn)了方法”)}};obj.method;} }
  • 匿名內(nèi)部類,在創(chuàng)建對象時,只能使用唯一一次
    如果希望多次創(chuàng)建對象,而且類的內(nèi)容一樣的話,那么就必須使用單獨(dú)定義的實(shí)現(xiàn)類
  • 匿名對象,在調(diào)用方法的時候,只能調(diào)用唯一一次
    如果希望同一個對象,調(diào)用多次方法,那么必須給對象起個名字
  • 匿名內(nèi)部類是省略實(shí)現(xiàn)類/子類名稱,但是匿名對象是省略了對象名稱
  • 總結(jié)

    以上是生活随笔為你收集整理的Java学习笔记_多态/内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。