日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747


Java 內(nèi)部類詳解

 

內(nèi)部類

內(nèi)部定義普通類、抽象類、接口的統(tǒng)稱,是指一種嵌套的結(jié)構(gòu)關(guān)系。

缺點(diǎn):破壞了良好的程序結(jié)構(gòu)。

優(yōu)點(diǎn):內(nèi)部類定義在類的內(nèi)部,可以方便訪問外部類的的私有成員,并且和其它類進(jìn)行隔離,每個(gè)內(nèi)部類都能獨(dú)立的繼承一個(gè)接口的實(shí)現(xiàn),所以無論外部類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒有影響。

成員內(nèi)部類-外部類訪問內(nèi)部類私有成員

成員內(nèi)部類是依托外部類而存在的,定義在類內(nèi)部的非靜態(tài)類,就是成員內(nèi)部類。代碼示例如下:

 package neibu;
 class Outer{
     private int age ;
     private int name ;  
     public Outer() {
         super();
         // TODO Auto-generated constructor stub
     }
 
     public Outer(int age) {
         super();
         this.age = age;
     }
     
     public Intter getInfo() {
         Intter inter = new Intter("guoqun");
         return inter ;
         }
     
     class Intter{
         private String name ;
         
         
         public Intter(String name) {
             super();
             this.name = name;
         }
 
         public void name() {
              /*Intter類 像是Outer類的一個(gè)成員,Outer稱為外部類。
              成員內(nèi)部類可以無條件訪問外部類的所有成員屬性和成員方法,
              包括private成員和靜態(tài)成員。*/
             System.out.println(Outer.this.age + this.name);
             
         }
     }
 }

Intter類是Outer類的一個(gè)內(nèi)部類,Outer稱為外部類。成員內(nèi)部類可以無條件訪問外部類的所有成員屬性和成員方法,包括private成員和靜態(tài)成員。

需要注意的是,雖然成員內(nèi)部類可以無限制的訪問外部類中成員或方法,但當(dāng)成員內(nèi)部類與外部類擁有同名成員變量或者方法時(shí),會(huì)發(fā)生覆蓋,即默認(rèn)情況下訪問的是成員內(nèi)部類的成員,如上述代碼示例的name成員變量。如果要訪問外部類的同名成員,需要以下面的形式進(jìn)行訪問:

 外部類.this.成員變量 ,如Outer.this.age
 外部類.this.成員方法

外部類訪問成員內(nèi)部類的成員,需要先創(chuàng)建一個(gè)成員內(nèi)部類的對(duì)象,再通過引用來訪問內(nèi)部類成員。

內(nèi)部類可以直接被實(shí)例化,語法格式:

 外部類.內(nèi)部類 對(duì)象名稱 = new 外部類().new 內(nèi)部類();

代碼示例如下:

 public class Lian {
 
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         Outer.Intter inttera = new Outer(10).new Intter("guoqun");
         inttera.name();
     }
 }

內(nèi)部類可以擁有private訪問權(quán)限、protected訪問權(quán)限、public訪問權(quán)限及包訪問權(quán)限。內(nèi)部類私有化,可以使用 private、protected實(shí)現(xiàn)。如上面示例中,如果成員內(nèi)部類Intter使用private進(jìn)行修飾,那么只能在外部類的內(nèi)部訪問;如果用protected進(jìn)行修飾,那么只能在同一個(gè)包下或繼承外部類時(shí)訪問;如果使用public進(jìn)行修飾,那么在任何地方都能訪問;如果是默認(rèn)訪問權(quán)限(default),則只能在同一個(gè)包下訪問。這一點(diǎn)和外部類有一點(diǎn)不一樣,外部類只能被public或default訪問權(quán)限修飾。

 

定義內(nèi)部接口

 package neibu;
 
 interface Jiekou<T>{
     
     public abstract void jie(T x);
     // 內(nèi)部接口
     interface KouJie {
         public abstract void fun();
 
     }
 
 ?
 class Jj<T> implements Jiekou<T>{
     public void jie(T x) {
         System.out.print(x);
     }
     
     class Abs implements KouJie {
         public  void fun() {
             System.out.print("asdasda");
 ?
         }
     }
     
 }

實(shí)例化內(nèi)部類接口實(shí)例化對(duì)象前需要首先獲取外部類實(shí)例化對(duì)象,代碼示例如下:

 public class Lian {
 
     public static void main(String[] args) {
         // 實(shí)例化外部類接口對(duì)象
         neibu.Jiekou<Integer> Jie = new neibu.Jj<Integer> () ;
         Jie.jie(10 );
         // 實(shí)例化內(nèi)部類接口實(shí)例化對(duì)象前需要首先獲取外部類實(shí)例化對(duì)象
         Jiekou.KouJie kou = ((Jj) Jie).new Abs();
         kou.fun();
     }
 ?
 }

 

接口子類定義為自身內(nèi)部類

 package neibu;
 public class Lian {
 
     public static void main(String[] args) {
     
         FaceM.getFace().getInfo();
     }
     
 }
 interface FaceM{
     public abstract void getInfo();
     class mm implements FaceM {
         public void getInfo() {
             System.out.println("接口子類定義為自身內(nèi)部類");
         }
     }
     public static FaceM getFace() {
         return new mm(); 
     }
 }

 

static 定義內(nèi)部類(靜態(tài)內(nèi)部類)

使用static定義內(nèi)部類,此時(shí)的內(nèi)部類不再受外部類實(shí)例化對(duì)象的影響,所以等同于于一個(gè)“外部類”,內(nèi)部類的名稱為“外部類.內(nèi)部類”,同時(shí)static定義的內(nèi)部類只能調(diào)用外部類中static定義的結(jié)構(gòu),并且在進(jìn)行內(nèi)部類的實(shí)例化時(shí)也不再需要先獲取外部類實(shí)例化對(duì)象,static內(nèi)部類對(duì)象實(shí)例化格式如下:

外部類內(nèi)部類內(nèi)部類對(duì)象外部類內(nèi)部類

 package neibu;
 public class Lian {
 
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         System.out.println();
         Outer.Intter inttera = new Outer.Intter("guoqun");
         inttera.name();
         }
 }
 class Outer{
     public Outer(int age) {
         super();
         this.age = age;
     }
     
     public Intter getInfo() {
         Intter inter = new Intter("guoqun");
         return inter ;
         }
     
     private int age ;   
     static class Intter{
         private String name ;   
         public Intter(String name) {
             super();
             this.name = name;
         }
 
         public void name() {
             System.out.println(this.name);
             
         }
     }
 }

使用static 定義內(nèi)部接口(靜態(tài)內(nèi)部類)

 package neibu;
 public class Lian {
 
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         System.out.println();
         JieKou.Load load = new LoadFace();
         JieKou.Compare compare = new CompareFace();
         JieKou.getInfo(load, compare);
     }
 
 }
 
 interface JieKou{
     // 內(nèi)部接口
     static interface Load {
         public abstract boolean loadData(); 
     }
     
     static interface Compare {
         public abstract void compareData(); 
     }
     
     public static void getInfo(Load sLoad , Compare sCompare) {     
         if (sLoad.loadData()) {
             Compare.compareData();  
         }
         else {
             System.out.println("加載失敗");
         }
     }
 }
 
 class LoadFace implements JieKou.Load{
     public boolean loadData() {
         return true;
     }
 }
 
 class CompareFace implements JieKou.Compare{
     public void  compareData() {
         System.out.println("compareData");      
     }
 }
 

方法中定義內(nèi)部類(局部類)

 package neibu;
 
 public class Lian {
 
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         System.out.println();
         Outer outer = new Outer(12);
         outer.getInfo();
     }
 
 }
 
 
 class Outer{
     private int  age ;
     public Outer(int age ) {
         this.age = age ;
     }
     public void   getInfo() {
         class Inter {  // 內(nèi)部類 
             public void interFun() {
                 System.out.println("interFun" + Outer.this.age) ;   
             }
         }
          new Inter().interFun() ;
         
     }
 }

如果一個(gè)類只在某個(gè)方法中使用,則可以考慮使用局部類。

匿名內(nèi)部類,函數(shù)式接口

匿名內(nèi)部類使用廣泛,如我們常用的綁定監(jiān)聽的時(shí)候。

 package neibu;
 public class Lian {
     public static void main(String[] args) {
         /*
         接口對(duì)象無法直接實(shí)例化,使用匿名內(nèi)部類后就可以利用對(duì)象的實(shí)例化格式獲取接口實(shí)例
         */
         Face face  = new Face() { // 匿名內(nèi)部類  
             @Override
             public void name() {
                 // TODO Auto-generated method stub
                 System.out.println("sss");
             }
         };
     }
 
 }
 
 @FunctionalInterface
 interface Face {
     public abstract void name();
     
 }

在接口中利用匿名內(nèi)部類實(shí)現(xiàn)接口

 package neibu;
 public class Lian {
     public static void main(String[] args) {
         FaceN.getFace().name();
     }
 
 }
 interface FaceN {
     public abstract void name();
     public static FaceN getFace() {
         return new FaceN() {    
             @Override
             public void name() {
                 System.out.println("在接口中利用匿名內(nèi)部類實(shí)現(xiàn)接口");
                 
             }
         };
     }
     
 }

適合于接口只有一個(gè)子類的時(shí)候,并且也可以對(duì)外部調(diào)用處隱含子類。

分享到:
標(biāo)簽:部類 Java
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定