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

初探Java內(nèi)部類(lèi)的使用

 更新時(shí)間:2022年09月23日 08:34:55   作者:lovekey  
Java內(nèi)部類(lèi)一般可以分為以下三種:成員內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)。這篇文章主要帶大家初探一下Java內(nèi)部類(lèi)的使用,感興趣的可以了解一下

之前對(duì)內(nèi)部類(lèi)的概念不太清晰,在此對(duì)內(nèi)部類(lèi)與外部類(lèi)之間的關(guān)系以及它們之間的調(diào)用方式進(jìn)行一個(gè)總結(jié)。

Java內(nèi)部類(lèi)一般可以分為以下三種:

  • 成員內(nèi)部類(lèi)
  • 靜態(tài)內(nèi)部類(lèi)
  • 匿名內(nèi)部類(lèi)

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

內(nèi)部類(lèi)的創(chuàng)建:成員內(nèi)部類(lèi)的創(chuàng)建需要依賴(lài)于外部類(lèi)對(duì)象,沒(méi)有創(chuàng)建外部類(lèi)實(shí)例之前無(wú)法創(chuàng)建成員內(nèi)部類(lèi)對(duì)象

若在main函數(shù)中直接創(chuàng)建成員內(nèi)部類(lèi)則會(huì)報(bào)錯(cuò):

MemberInner memberInner = new MemberInner();

私有屬性訪(fǎng)問(wèn):成員內(nèi)部類(lèi)可直接訪(fǎng)問(wèn)外部類(lèi)非靜態(tài)私有屬性,外部類(lèi)訪(fǎng)問(wèn)內(nèi)部類(lèi)私有屬性則需要通過(guò)內(nèi)部類(lèi)的對(duì)象來(lái)訪(fǎng)問(wèn)

在memberInnerTest()方法中,可以直接訪(fǎng)問(wèn)外部類(lèi)中的私有test字段,若內(nèi)部類(lèi)中有與外部類(lèi)同名字段,調(diào)用外部類(lèi)需要使用如下方法:

OuterTest.this.test

創(chuàng)建內(nèi)部類(lèi):

在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類(lèi)對(duì)象

private void createMemberInner(){
    MemberInner memberInner = new MemberInner();
    memberInner.memberInnerTest();
}

在外部類(lèi)外部創(chuàng)建內(nèi)部類(lèi)對(duì)象:需要先創(chuàng)建外部類(lèi)對(duì)象,再通過(guò)外部類(lèi)創(chuàng)建內(nèi)部類(lèi)

OuterTest outerTest = new OuterTest();
MemberInner memberInner = outerTest.new MemberInner();

若不需要使用外部類(lèi),可以使用如下方式創(chuàng)建內(nèi)部類(lèi)

MemberInner memberInner = new OuterTest().new MemberInner();

使用該方法創(chuàng)建內(nèi)部類(lèi)需要注意:若外部類(lèi)中有多個(gè)內(nèi)部類(lèi),這種方法會(huì)new出多個(gè)外部類(lèi)對(duì)象,各個(gè)類(lèi)對(duì)象都是獨(dú)立的,因此外部類(lèi)的成員變量并不會(huì)在內(nèi)部類(lèi)中共享。

如下代碼中,由于new出了兩個(gè)OuterVar類(lèi),所以InnerOne與InnerTwo類(lèi)輸出的成員變量var均為0。若想InnerOne與InnerTwo類(lèi)共享成員變量var,則需用如下方式創(chuàng)建:

  OuterVar outerVar = new OuterVar();
  InnerOne innerOne = outerVar.new InnerOne();
  InnerTwo innerTwo = outerVar.new InnerTwo();
public class OuterVar {
private int var = 0;
 
class InnerOne{
  private void innerOnePrint(){
      System.out.println("innerOnePrint:"+var);
      var+=1;
  }
}
 
class InnerTwo{
  private void innerTwoPrint(){
      System.out.println("innerTwoPrint:"+var);
  }
}
 
public static void main(String[] args) {
  InnerOne innerOne = new OuterVar().new InnerOne();
  InnerTwo innerTwo = new OuterVar().new InnerTwo();
 
  innerOne.innerOnePrint();
  innerTwo.innerTwoPrint();
}
}
/* 結(jié)果
innerOnePrint:0
innerTwoPrint:0
*/
/*1、成員內(nèi)部類(lèi)
  2、靜態(tài)內(nèi)部類(lèi)
  3、匿名內(nèi)部類(lèi)
*/
public class OuterTest {
    /*
    1、成員內(nèi)部類(lèi)
     */
    private String test = "OuterTest";
 
    private void createMemberInner(){
        MemberInner memberInner = new MemberInner();
        memberInner.memberInnerTest();
    }
 
    class MemberInner{
        private String test = "MemberInnerTest";
 
        public void memberInnerTest(){
            System.out.println("MemberInner");
            System.out.println(test);
            System.out.println(OuterTest.this.test);
 
        }
    }
 
    public static void main(String[] args) {
        // 成員內(nèi)部類(lèi)
        OuterTest outerTest = new OuterTest();
        MemberInner memberInner = outerTest.new MemberInner();
//        MemberInner memberInner = new OuterTest().new MemberInner();
        
        memberInner.memberInnerTest();
    }
}
 
 
/* 結(jié)果
   MemberInner
   MemberInnerTest
   OuterTest */

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

靜態(tài)內(nèi)部類(lèi)定義在外部類(lèi)的內(nèi)部,使用static關(guān)鍵字修飾,靜態(tài)內(nèi)部類(lèi)不需要外部類(lèi)對(duì)象產(chǎn)生就能使用,不能訪(fǎng)問(wèn)外部類(lèi)的成員域,但能訪(fǎng)問(wèn)靜態(tài)域。

私有屬性訪(fǎng)問(wèn):靜態(tài)內(nèi)部類(lèi)不可直接訪(fǎng)問(wèn)外部類(lèi)的非靜態(tài)屬性

創(chuàng)建內(nèi)部類(lèi):

在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類(lèi)對(duì)象

private void createStaticInner(){
    StaticInner staticInner = new StaticInner();
    staticInner.staticInnerTest();
}

在外部類(lèi)外部創(chuàng)建內(nèi)部類(lèi)對(duì)象:可以不創(chuàng)建外部類(lèi)對(duì)象,直接創(chuàng)建內(nèi)部類(lèi)對(duì)象

StaticInner staticInner = new StaticInner();
public class OuterTest {
    /*
      2、靜態(tài)內(nèi)部類(lèi)
     */
    private String test = "OuterTest";
 
    private void createStaticInner(){
        StaticInner staticInner = new StaticInner();
        staticInner.staticInnerTest();
    }
 
 
    static class StaticInner{
        private String test = "StaticInnerTest";
 
        public void staticInnerTest(){
            System.out.println("StaticInner");
            System.out.println(test);
        }
    }
 
    public static void main(String[] args) {
        // 靜態(tài)內(nèi)部類(lèi)
        StaticInner staticInner = new StaticInner();
        staticInner.staticInnerTest();
    }
}
 
/* 結(jié)果
   StaticInner
   StaticInnerTest */

三、匿名內(nèi)部類(lèi)

使用匿名內(nèi)部類(lèi)的前提條件:必須繼承一個(gè)父類(lèi)或?qū)崿F(xiàn)一個(gè)接口。 有以下一些特點(diǎn):

由于匿名內(nèi)部類(lèi)是沒(méi)有類(lèi)名,所以匿名內(nèi)部類(lèi)不能有構(gòu)造方法

匿名內(nèi)部類(lèi)不能定義任何靜態(tài)成員、方法和類(lèi)

//匿名內(nèi)部類(lèi)
interface Father{
    public abstract void talk();
 
    public abstract void eat();
}
public class Test {
    public static void main(String[] args) {
        //匿名內(nèi)部類(lèi)
        Father father = new Father() {
            @Override
            public void talk() {
                System.out.println("I'm Father");
            }
 
            @Override
            public void eat() {
                System.out.println("I'm eating");
            }
        };
        father.talk();
        father.eat();
    }
}
 
/* 結(jié)果
   I'm Father
   I'm eating */

到此這篇關(guān)于初探Java內(nèi)部類(lèi)的使用的文章就介紹到這了,更多相關(guān)Java內(nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Property類(lèi)使用詳解

    Java Property類(lèi)使用詳解

    這篇文章主要介紹了Java Property類(lèi)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 解決遇到Cannot resolve ch.qos.logback:logback-classic:1.2.3錯(cuò)誤的問(wèn)題

    解決遇到Cannot resolve ch.qos.logback:logback-classic:

    當(dāng)使用Maven配置項(xiàng)目依賴(lài)時(shí),可能會(huì)遇到無(wú)法解析特定版本的錯(cuò)誤,例如,logback-classic版本1.2.3可能無(wú)法在配置的倉(cāng)庫(kù)中找到,解決方法包括檢查倉(cāng)庫(kù)是否包含所需版本,或更新到其他可用版本,可通過(guò)Maven官網(wǎng)搜索并找到適用的版本,替換依賴(lài)配置中的版本信息
    2024-09-09
  • Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解

    Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解

    Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下
    2021-06-06
  • Java 內(nèi)存安全問(wèn)題的注意事項(xiàng)

    Java 內(nèi)存安全問(wèn)題的注意事項(xiàng)

    內(nèi)存安全問(wèn)題是每個(gè)程序員開(kāi)發(fā)時(shí)都需要面對(duì)的問(wèn)題,本文介紹了JVM管理內(nèi)存的原理以及內(nèi)存安全問(wèn)題需要注意的地方,有此需求的朋友可以參考下本文
    2021-06-06
  • Java中Json解析的方法分析

    Java中Json解析的方法分析

    這篇文章主要介紹了Java中Json解析的方法,結(jié)合實(shí)例形式分析了java針對(duì)json格式數(shù)據(jù)的解析實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • MyEclipse安裝JS代碼提示的教程(Spket插件)

    MyEclipse安裝JS代碼提示的教程(Spket插件)

    本篇文章主要介紹了MyEclipse安裝JS代碼提示的教程(Spket插件),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析

    Java矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析

    這篇文章主要介紹了Java矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)矩陣連乘的算法原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • Maven 搭建SpringMVC+Hibernate項(xiàng)目詳解

    Maven 搭建SpringMVC+Hibernate項(xiàng)目詳解

    本文主要介紹Maven 搭建SpringMVC+Hibernate的知識(shí),這里整理了詳細(xì)的資料,并附示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • java生成圖片驗(yàn)證碼返回base64圖片信息方式

    java生成圖片驗(yàn)證碼返回base64圖片信息方式

    這篇文章主要介紹了java生成圖片驗(yàn)證碼返回base64圖片信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • ReentrantLock重入鎖底層原理示例解析

    ReentrantLock重入鎖底層原理示例解析

    這篇文章主要為大家介紹了ReentrantLock重入鎖底層原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論