欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明

 更新時(shí)間:2020年09月14日 11:51:17   作者:flydean程序那些事  
這篇文章主要介紹了java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)介

一般來(lái)說(shuō),我們創(chuàng)建類(lèi)和接口的時(shí)候都是一個(gè)類(lèi)一個(gè)文件,一個(gè)接口一個(gè)文件,但有時(shí)候?yàn)榱朔奖慊蛘吣承┨厥獾脑?,java并不介意在一個(gè)文件中寫(xiě)多個(gè)類(lèi)和多個(gè)接口,這就有了我們今天要講的內(nèi)部類(lèi)和內(nèi)部接口。

內(nèi)部類(lèi)

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

靜態(tài)內(nèi)部類(lèi)

我們?cè)赾lass內(nèi)部定義一個(gè)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();
 }
}

因?yàn)閟tatic變量可以直接根據(jù)類(lèi)名來(lái)存取,所以我們使用new StaticInnerClass.Inner()來(lái)實(shí)例化內(nèi)部類(lèi)。

非靜態(tài)內(nèi)部類(lèi)

class中定義的類(lèi)也可以是非靜態(tài)的,如下所示:

@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();
 }
}

要訪(fǎng)問(wèn)到類(lèi)的變量,需要實(shí)例化外部?jī)?nèi),然后再實(shí)例化內(nèi)部類(lèi):new InnerClass().new Inner()。

注意這里我們需要使用到兩個(gè)new。

靜態(tài)方法內(nèi)部類(lèi)

我們可以在靜態(tài)方法中定義一個(gè)類(lèi),這個(gè)類(lèi)其實(shí)就相當(dāng)于方法中的變量,這個(gè)變量當(dāng)然不能是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();
 }
}

方法中的類(lèi),我們是無(wú)法在外部實(shí)例化的。

非靜態(tài)方法的內(nèi)部類(lèi)

同樣的非靜態(tài)方法也可以定義內(nèi)部類(lèi):

@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();
 }
}

注意,這里需要先實(shí)例化外部類(lèi)才可以繼續(xù)調(diào)用。

匿名類(lèi)

最后一個(gè),匿名類(lèi),直接在需要的時(shí)候?qū)嵗念?lèi)。匿名類(lèi)我們遇到了很多次了,比如在構(gòu)建SortedSet的時(shí)候,可以傳入自定義的Comparator,我們可以用匿名類(lèi)來(lái)實(shí)現(xiàn),也可以直接使用lambda表達(dá)式。

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);
 }
}

內(nèi)部接口

Inner Interface是指在接口中定義的接口。最常見(jiàn)的就是Map中的Entry了:

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

這里的內(nèi)部接口一定是static的,因?yàn)榻涌谑遣荒軐?shí)例化的,所以為了訪(fǎng)問(wèn)到接口中的接口,必須定義為static。如果不指定,則默認(rèn)就是static。

我們看一個(gè)該內(nèi)部接口的實(shí)現(xiàn):

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;
 }
}

總結(jié)

本文講解了5個(gè)內(nèi)部類(lèi)的實(shí)現(xiàn)和一個(gè)內(nèi)部接口的應(yīng)用。大家只要把內(nèi)部的類(lèi)或者接口看成一個(gè)變量,就可以很好的理解上面的內(nèi)容了。

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

補(bǔ)充知識(shí):內(nèi)部類(lèi)(成員內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)、方法內(nèi)部類(lèi))

一:成員內(nèi)部類(lèi):

最常見(jiàn)的內(nèi)部類(lèi)就是成員內(nèi)部類(lèi),也稱(chēng)作普通內(nèi)部類(lèi);

1、Inner類(lèi)定義在Outer類(lèi)的內(nèi)部,相當(dāng)于Outer類(lèi)的成員變量的位置,Inner類(lèi)可以使用任意訪(fǎng)問(wèn)修飾符,如:public、private、protected等。

2、Inner類(lèi)中定義的test()方法可以訪(fǎng)問(wèn)Outer類(lèi)中的數(shù)據(jù),不受訪(fǎng)問(wèn)控制符的影響。

3、 定義了成員內(nèi)部類(lèi)后,必須使用外部類(lèi)對(duì)象來(lái)創(chuàng)建內(nèi)部類(lèi)對(duì)象,而不能直接去 new 一個(gè)內(nèi)部類(lèi)對(duì)象,即:內(nèi)部類(lèi) 對(duì)象名 = 外部類(lèi)對(duì)象.new 內(nèi)部類(lèi)( );如創(chuàng)建Inner的內(nèi)部類(lèi)對(duì)象:要先創(chuàng)建外部類(lèi)對(duì)象:Outer o = new outer(); 創(chuàng)建內(nèi)部類(lèi):Inner i = o.new Inner();訪(fǎng)問(wèn)Inner中的test()方法:i.test();

例如:

4、如果外部類(lèi)和內(nèi)部類(lèi)具有相同的成員變量或方法,內(nèi)部類(lèi)可以直接訪(fǎng)問(wèn)內(nèi)部類(lèi)的成員變量或方法,但如果內(nèi)部類(lèi)訪(fǎng)問(wèn)外部類(lèi)的成員變量或者方法時(shí),需要使用this關(guān)鍵字;如下:

二:靜態(tài)內(nèi)部類(lèi)

靜態(tài)內(nèi)部類(lèi)就是用static修飾的內(nèi)部類(lèi),這種內(nèi)部類(lèi)的特點(diǎn)是:

1、靜態(tài)內(nèi)部類(lèi)不能直接訪(fǎng)問(wèn)外部類(lèi)的非靜態(tài)成員,但,可以通過(guò)new 外部類(lèi)().成員的方式訪(fǎng)問(wèn);

2、如果外部類(lèi)的靜態(tài)成員與內(nèi)部類(lèi)的靜態(tài)成員相同, 可以通過(guò)"類(lèi)名.靜態(tài)成員"來(lái)訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)成員;如果不同,可以直接調(diào)用外部類(lèi)的靜態(tài)成員名。

3、創(chuàng)建靜態(tài)內(nèi)部類(lèi)的對(duì)象時(shí),不需要外部類(lèi)的對(duì)象,可以直接創(chuàng)建;

三:方法內(nèi)部類(lèi):

1、方法內(nèi)部類(lèi)就是定義在外部類(lèi)的方法中,方法內(nèi)部類(lèi)只在該方法內(nèi)可以用;

2、由于方法內(nèi)部類(lèi)不能在外部類(lèi)的方法以外的地方使用,因此方法內(nèi)部類(lèi)不能使用訪(fǎng)問(wèn)控制符和 static 修飾符。

以上這篇java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論