1. 程式人生 > 程式設計 >java中的內部類內部介面用法說明

java中的內部類內部介面用法說明

簡介

一般來說,我們建立類和介面的時候都是一個類一個檔案,一個介面一個檔案,但有時候為了方便或者某些特殊的原因,java並不介意在一個檔案中寫多個類和多個介面,這就有了我們今天要講的內部類和內部介面。

內部類

先講內部類,內部類就是在類中定義的類。類中的類可以看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。

靜態內部類

我們在class內部定義一個static的class,如下所示:

@Slf4j
public class StaticInnerClass {

 static class Inner {
  void print() {
   log.info("Inner class is: " + this);
  }
 }

 public static void main(String[] args) {
  StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
  inner.print();
 }
}

因為static變數可以直接根據類名來存取,所以我們使用new StaticInnerClass.Inner()來例項化內部類。

非靜態內部類

class中定義的類也可以是非靜態的,如下所示:

@Slf4j
public class InnerClass {

  class Inner {
  void print() {
   log.info("Inner class is: " + this);
  }
 }

 public static void main(String[] args) {
  InnerClass.Inner inner = new InnerClass().new Inner();
  inner.print();
 }
}

要訪問到類的變數,需要例項化外部內,然後再例項化內部類:new InnerClass().new Inner()。

注意這裡我們需要使用到兩個new。

靜態方法內部類

我們可以在靜態方法中定義一個類,這個類其實就相當於方法中的變數,這個變數當然不能是static的。我們看下面的例子:

@Slf4j
public class StaticMethodInnerClass {

 private static String x = "static x";

 public static void print() {
  class MyInner {
   public void printOuter() {
    log.info("x is " + x);
   }
  }
  MyInner i = new MyInner();
  i.printOuter();
 }

 public static void main(String[] args) {
  StaticMethodInnerClass.print();
 }
}

方法中的類,我們是無法在外部例項化的。

非靜態方法的內部類

同樣的非靜態方法也可以定義內部類:

@Slf4j
public class MethodInnerClass {

 private String x = "non static x";

 public void print() {
  class MyInner {
   public void printOuter() {
    log.info("x is " + x);
   }
  }
  MyInner i = new MyInner();
  i.printOuter();
 }

 public static void main(String[] args) {
  new MethodInnerClass().print();
 }
}

注意,這裡需要先例項化外部類才可以繼續呼叫。

匿名類

最後一個,匿名類,直接在需要的時候例項化的類。匿名類我們遇到了很多次了,比如在構建SortedSet的時候,可以傳入自定義的Comparator,我們可以用匿名類來實現,也可以直接使用lambda表示式。

public class AnonymousClass {

 public static void main(String[] args) {
  SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){
   @Override
   public int compare(Object o1,Object o2) {
    return 0;
   }
  });

  SortedSet sortedSet2 = new ConcurrentSkipListSet((o1,o2) -> 0);
 }
}

內部介面

Inner Interface是指在介面中定義的介面。最常見的就是Map中的Entry了:

public interface Map<K,V> {
 interface Entry<K,V> {
  K getKey();
 }

這裡的內部介面一定是static的,因為介面是不能例項化的,所以為了訪問到介面中的介面,必須定義為static。如果不指定,則預設就是static。

我們看一個該內部介面的實現:

public class MapImpl implements Map.Entry{
 @Override
 public Object getKey() {
  return 0;
 }

 @Override
 public Object getValue() {
  return null;
 }

 @Override
 public Object setValue(Object value) {
  return null;
 }
}

總結

本文講解了5個內部類的實現和一個內部介面的應用。大家只要把內部的類或者介面看成一個變數,就可以很好的理解上面的內容了。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

補充知識:內部類(成員內部類、靜態內部類、方法內部類)

一:成員內部類:

最常見的內部類就是成員內部類,也稱作普通內部類;

java中的內部類內部介面用法說明

1、Inner類定義在Outer類的內部,相當於Outer類的成員變數的位置,Inner類可以使用任意訪問修飾符,如:public、private、protected等。

2、Inner類中定義的test()方法可以訪問Outer類中的資料,不受訪問控制符的影響。

3、 定義了成員內部類後,必須使用外部類物件來建立內部類物件,而不能直接去 new 一個內部類物件,即:內部類 物件名 = 外部類物件.new 內部類( );如建立Inner的內部類物件:要先建立外部類物件:Outer o = new outer(); 建立內部類:Inner i = o.new Inner();訪問Inner中的test()方法:i.test();

例如:

java中的內部類內部介面用法說明

4、如果外部類和內部類具有相同的成員變數或方法,內部類可以直接訪問內部類的成員變數或方法,但如果內部類訪問外部類的成員變數或者方法時,需要使用this關鍵字;如下:

java中的內部類內部介面用法說明

二:靜態內部類

靜態內部類就是用static修飾的內部類,這種內部類的特點是:

1、靜態內部類不能直接訪問外部類的非靜態成員,但,可以通過new 外部類().成員的方式訪問;

java中的內部類內部介面用法說明

2、如果外部類的靜態成員與內部類的靜態成員相同, 可以通過"類名.靜態成員"來訪問外部類的靜態成員;如果不同,可以直接呼叫外部類的靜態成員名。

java中的內部類內部介面用法說明

java中的內部類內部介面用法說明

3、建立靜態內部類的物件時,不需要外部類的物件,可以直接建立;

三:方法內部類:

1、方法內部類就是定義在外部類的方法中,方法內部類只在該方法內可以用;

java中的內部類內部介面用法說明

2、由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。

以上這篇java中的內部類內部介面用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。