IT培訓(xùn)-高端面授IT培訓(xùn)機(jī)構(gòu)
          云和教育:云和數(shù)據(jù)集團(tuán)高端IT職業(yè)教育品牌
          • 國(guó)家級(jí)
            全民數(shù)字素養(yǎng)與技能培訓(xùn)基地
          • 河南省
            第一批產(chǎn)教融合型企業(yè)建設(shè)培育單位
          • 鄭州市
            數(shù)字技能人才(碼農(nóng))培養(yǎng)評(píng)價(jià)聯(lián)盟

          JAVA大咖分享:深入剖析JAVA內(nèi)部類(lèi)

          • 發(fā)布時(shí)間:
            2020-08-20
          • 版權(quán)所有:
            云和教育
          • 分享:
          什么是內(nèi)部類(lèi)?
          概念:定義在類(lèi)中的類(lèi)
          怎么用的?
          就像在類(lèi)中定義屬性一樣修飾符 class 類(lèi)名{}第一:內(nèi)部類(lèi)相當(dāng)于是外部類(lèi)中的一個(gè)屬性第二:內(nèi)部類(lèi)本身也就是一個(gè)類(lèi),跟正常的類(lèi)一樣
          為什么要用它?
          類(lèi)的生命周期程序運(yùn)行時(shí)開(kāi)始到程序結(jié)束時(shí)銷(xiāo)毀,但是呢,某些情況下,在整個(gè)應(yīng)用程序中對(duì)該類(lèi)的使用頻率較低,那此時(shí)就需要將其定義為內(nèi)部類(lèi),以縮短其生命周期;簡(jiǎn)單點(diǎn)來(lái)說(shuō):縮短類(lèi)的生命周期劃分:內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)、匿名內(nèi)部類(lèi)使用場(chǎng)景:當(dāng)類(lèi)或該類(lèi)的對(duì)象并不是很常用的時(shí)候,就可以定義為內(nèi)部類(lèi)
          內(nèi)部類(lèi)
          java
          public class Outer {public int count;//內(nèi)部類(lèi)也相當(dāng)于是外部類(lèi)中的一個(gè)成員變量
          class Inner{
          public int count;
          public void show() {
          System.out.println("inner show");
          }
          }
          }
          //思路:1、把內(nèi)部類(lèi)當(dāng)成是外部類(lèi)中的一個(gè)成員,那么想要找到內(nèi)部類(lèi)就需要有外部類(lèi)的對(duì)象
          //2、show方法需要對(duì)象進(jìn)行調(diào)用的,而內(nèi)部類(lèi)的對(duì)象又需要外部類(lèi)的對(duì)象進(jìn)行調(diào)用
          //3、外部類(lèi).內(nèi)部類(lèi) 變量名 = 外部類(lèi)對(duì)象.內(nèi)部類(lèi)對(duì)象
          //4、Outer.Inner inner = new Outer().new Inner();
          public static void main(String[] args) {
          Outer outer = new Outer();
          System.out.println(outer.count);
          //創(chuàng)建內(nèi)部類(lèi)對(duì)象
          Outer.Inner inner = outer.new Inner();
          inner.show();
          }
          ?
          內(nèi)部類(lèi)和不同的修飾同時(shí)存在時(shí)的特點(diǎn):

          java
          public class Outer {//對(duì)于該成員變量,其生命周期和對(duì)象的生命周期一致,作用域在整個(gè)類(lèi)中都可以使用,調(diào)用形式:使用對(duì)象調(diào)用
          //可用的修飾符:public private protected static final
          private int count;//private修飾后,該類(lèi)就只能在當(dāng)前類(lèi)中使用
          //static修飾后,該類(lèi)的生命周期和外部類(lèi)的生命周期一致,就失去了內(nèi)部類(lèi)本身的意義
          //final修飾后,該類(lèi)無(wú)法被繼承
          class Inner{
          private int count;
          public void show() {
          System.out.println("inner show");
          }
          }
          }
          //調(diào)用
          Outer.Inner inner = new Outer.Inner();
          inner.show();
          Outer outer = new Outer();
          Outer.Inner inner = outer.new Inner();
          inner.show();
          ?
          注意:內(nèi)部類(lèi)可以調(diào)用外部類(lèi)的屬性和方法,但是外部類(lèi)只能通過(guò)對(duì)象的形式去調(diào)用內(nèi)部類(lèi)中的屬性和方法。
          
          

          java
          //在內(nèi)部類(lèi)中區(qū)分this關(guān)鍵詞的所屬
          public class Outer {
          private int count = 6;
          //內(nèi)部類(lèi)也相當(dāng)于是外部類(lèi)中的一個(gè)成員變量
          class Inner{
          public int count = 5;
          public int num;
          public void show() {
          int count = 4;
          System.out.println("inner show "+ Outer.this.count);
          }
          }
          public void method() {
          Inner inner = new Inner();
          inner.show();
          }
          }

          局部?jī)?nèi)部類(lèi):定義在方法中的類(lèi),生命周期和方法的生命周期一致,作用域只在方法中
          java
          public class Outer2 {
          /**
          * jdk1.8中內(nèi)部類(lèi)所在的方法中的參數(shù)默認(rèn)是final修飾的
          * jdk1.7及之前需要明確標(biāo)出final
          * @param count
          */
          public void method(int count) {
          int a = 1;
          //count++;
          class Inner{
          public void show() {
          System.out.println("show "+count);
          }
          }
          new Inner().show();
          }
          public static void main(String[] args) {
          Outer2 outer = new Outer2();
          outer.method(1);
          }
          }
          匿名內(nèi)部類(lèi):沒(méi)有具體的子類(lèi)名字
          例如:User user = new User();? ?new User(); 有名字的話(huà)可以多次使用
          概念:沒(méi)有名字的內(nèi)部類(lèi),沒(méi)名字說(shuō)明不經(jīng)常用,內(nèi)部類(lèi)作用是為了縮短生命周期
          例如:老王家生了個(gè)孩子起名叫小王,過(guò)段時(shí)間他老婆又懷了一個(gè),叫老王家的孩子,他是沒(méi)有名字,所以只能通過(guò)其父親的名字來(lái)區(qū)別,因此,匿名內(nèi)部類(lèi)必須要有繼承或?qū)崿F(xiàn);
          語(yǔ)法:父類(lèi)類(lèi)名 名字 = new 父類(lèi)類(lèi)型(){};
          注意:new 父類(lèi)類(lèi)型(){}相當(dāng)于就是一個(gè)子類(lèi)對(duì)象
          學(xué)習(xí)時(shí)只需要記住三個(gè)點(diǎn):
          1、記住語(yǔ)法
          2、new 父類(lèi)類(lèi)型(){}相當(dāng)于就是一個(gè)子類(lèi)對(duì)象,只是沒(méi)有名字
          3、父類(lèi)類(lèi)名 名字 = new 父類(lèi)類(lèi)型(){};是多態(tài)形式,向上轉(zhuǎn)型
          java
          public interface ItemDao{
          public int delUser(int uid);
          }
          public static void main(String[] args){
          new ItemDao(){
          @Override
          public int delUser(int uid){}
          }.delUser(1);
          }
          //上述形式,相當(dāng)于創(chuàng)建了一個(gè)子類(lèi)去實(shí)現(xiàn)了ItemDao接口并重寫(xiě)方法
          public class ItemDaoImpl implements ItemDao{
          @Override
          public int delUser(int uid){}
          }
          //單獨(dú)創(chuàng)建一個(gè)類(lèi)去實(shí)現(xiàn)接口和使用匿名內(nèi)部類(lèi)實(shí)現(xiàn)接口的區(qū)別是:使用匿名內(nèi)部類(lèi)可節(jié)約資源-生命周期短
          ?
          思考:根據(jù)上述匿名內(nèi)部類(lèi)的調(diào)用形式上發(fā)現(xiàn)一個(gè)問(wèn)題,如果其中重寫(xiě)了多個(gè)方法時(shí),如何調(diào)用?
          回答:匿名內(nèi)部類(lèi)可以使用其父類(lèi)來(lái)進(jìn)行接收
          java
          public interface ItemDao{
          public int delUser(int uid);
          public int insertUser();
          }
          public static void main(String[] args){
          ItemDao itemDao = new ItemDao(){
          @Override
          public int delUser(int uid){}
          @Override
          public int inserUser(){}
          };
          itemDao.delUser(1);
          itemDao.inserUser();
          }
          思考:根據(jù)上述的使用方案,匿名內(nèi)部類(lèi)本身也是一個(gè)類(lèi),那也可以有自己特有的方法,如何調(diào)用呢?
          回答:當(dāng)子類(lèi)有自己的特有方法時(shí)也就意味著該類(lèi)應(yīng)該被定義成一個(gè)單獨(dú)的類(lèi)存在
          java
          public interface ItemDao{
          public int delUser(int uid);
          public int insertUser();
          }
          public static void main(String[] args){
          ItemDao itemDao = new ItemDao(){
          @Override
          public int delUser(int uid){}
          @Override
          public int inserUser(){}
          public void show(){}
          };
          itemDao.delUser(1);
          itemDao.inserUser();
          //itemDao.show();
          }
          練習(xí)題:
          java
          public interface IUserDao{
          public void speak();
          }
          public static void main(String[] args){
          Object obj = new IUserDao(){
          @Override
          public void speak(){
          Syso("speak");
          };
          };
          obj.speak();
          IUserDao userDao = new IUserDao(){
          @Override
          public void speak(){
          Syso("speak");
          };
          };
          userDao.speak();
          }
          文/云和數(shù)據(jù)java高級(jí)開(kāi)發(fā)工程師代老師