那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在普通類中使用內部結構

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-10 16:26 ? 次閱讀

在普通類中使用內部結構

不多說,先上個代碼

Outer類里面有個內部類Inner

public class Outer {
    private String msg = "哈哈";   //只能在類內部訪問
    public void fun(){
        Inner in = new Inner();    //實例化內部類的對象
        in.print();
    }
 
    //在Outer類中的內部類
    class Inner{
        public void print(){
            System.out.println(Outer.this.msg);   //msg是Outer類里面的屬性
        }
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.fun();
    }
}

創建外部類的實例調用外部類的方法卻執行了內部類的方法,打印出“哈哈”。

從整體的代碼結構來講,內部類的結構并不合理,所以內部類本身最大的缺陷在于破壞了程序的結構,但是破壞需要有目的的破壞,那么它也一定會有其優勢,如果要想更好的觀察出內部類的優勢,就可以將內部類拿到外面來。我將上面的代碼Inner拿出來

public class Outer {
    private String msg = "哈哈";   //只能在類內部訪問
    public void fun(){
        Inner in = new Inner(this);    //實例化內部類的對象
        in.print();
    }
    public String getMsg(){
        return this.msg;
    }
}
public class Inner {
    private Outer out;
    public Inner(Outer out){
        this.out = out;
    }
    public void print(){
        System.out.println(this.out.getMsg());   //msg是Outer類里面的屬性
    }
}
public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.fun();
    }
}

如果不是對引用知識掌握的比較扎實,會有點懵。我們折騰了半天主要的目的就是為了讓Inner這個內部類可以訪問Outer這個類中的私有屬性,如果不用內部類的時候整體代碼會非常的麻煩,所以可以得出內部類的優點: 輕松的訪問外部類中的私有屬性

需要注意的是, 內部類雖然可以方便的訪問外部類中的私有成員或私有方法 ,同理, 外部類也可以輕松訪問內部類中的私有成員或私有方法 。如下

public class Outer {
    private String msg = "哈哈";   
    public void fun(){
        Inner in = new Inner();
        in.print();
        System.out.println(in.info);        //訪問內部類的私有屬性
    }
    class Inner{
        private String info = "今天天氣不好";
        public void print(){
            System.out.println(Outer.this.msg);
        }
    }
}

使用了內部類之后,內部類與外部類之間的私有操作的訪問就不再需要通過setter,getter以及其他的間接方式完成了,可以直接進行操作,但是需要注意的是,內部類本身也屬于一個類,雖然在大部分情況下內部類往往是被外部類包裹的,但是外部依然可以產生內部類的實例化對象,而此時,內部類實例化對象的格式如下:

外部類.內部類 內部類對象 = new 外部類().new 內部類() ;

在內部類編譯完成之后會自動形成一個“Outer”這個符號換到程序中就變為“.”,所以 內部類的全稱:“外部類.內部類” 。內部類與外部類之間可以直接進行私有成員的訪問,這樣一來內部類如果要是提供有實例化對象了,一定要先保證外部類實例化了。

public class Test {
    public static void main(String[] args) {
        Outer.Inner in = new Outer().new Inner();
        in.print();
    }
}

如果此時Inner類只允許Outer類來使用,那么在這樣的情況下就可以使用private進行私有定義 。

這樣,此時的Inner類就無法再外部使用, 即在test中的這條語句 Outer.Inner in = new Outer().new Inner()就失效

2. 在抽象類和接口中使用內部結構

在我們的java之中,類作為最基礎的結構體實際上還有與之類似的抽象類或者是接口,抽象類和接口中都可以定義內部結構。

2.1 接口中定義內部接口

我們現在定義 內部接口

public interface IChannel {
    public void send(IMessage msg);
    //內部接口
    interface IMessage{
        public String getContent();
    }
}
public class ChannelImpl implements IChannel {
    @Override
    public void send(IMessage msg) {
        System.out.println(msg.getContent());
    }
 
    class MessageImpl implements IMessage{
        @Override
        public String getContent() {
            return "haha";
        }
    }
}
public class Test {
    public static void main(String[] args) {
        IChannel channel = new ChannelImpl();
        channel.send(((ChannelImpl)channel).new MessageImpl());
    }
}

最后打印出結果 “哈哈”

2.2 接口中定義內部抽象類

下面我們繼續觀察一個 內部抽象類 ,內部抽象類可以定義在普通類,抽象類,接口內部都可以

public interface IChannel {
    public void send();
    abstract class AbstractMessage{
        public abstract String getContent();
    }
}
public class ChannelImpl implements IChannel {
 
    @Override
    public void send() {
        AbstractMessage msg = new MessageImpl() ;
        System.out.println(msg.getContent());
 
    }
 
    class MessageImpl extends AbstractMessage {
        public String getContent() {
            return "哈哈";
        }
    }
}
public class Test {
    public static void main(String[] args) {
        IChannel channel = new ChannelImpl();
        channel.send();
    }
}

結果打印出來的是“哈哈”。

2.3 用內部類實現外部接口

內部類還有一些更為有意思的結構,即:如果現在 定義了一個接口,那么可以在內部利用類實現該接口 ,在JDK1.8之后,接口中追加了static方法可以不受到實例化對象的控制,現在就可以利用此特性來完成功能。

接口內部進行接口實現

public interface IChannel {
    public void send();
 
    class ChannelImpl implements IChannel{
        public void send(){
            System.out.println("哈哈");
        }
    }
    
    public static IChannel getInstance(){
        return new ChannelImpl();
    }
}
public class Test {
    public static void main(String[] args) {
        IChannel channel = IChannel.getInstance();
        channel.send();
    }
}

輸出的結果為“哈哈”

從上面可以看到,內部類是非常靈活的結構,只要你的語法滿足了,各種需求都可以幫你實現!

3. 總結:

方法,類,抽象類,接口,代碼塊中都可以定義內部結構-------類,抽象類,接口。今天主要講了如何在內部類中使用內部類和接口中使用內部類。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81415
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69054
收藏 人收藏

    評論

    相關推薦

    智能吉他的內部結構

    智能吉他的內部結構是怎么樣的?我的電話是13316312382,謝謝
    發表于 12-22 17:15

    芯片封裝內部結構

    `芯片封裝內部結構經典封裝知識,內部結構完美呈現,分析芯片封裝的每一個知識點。[hide][/hide]`
    發表于 06-11 16:10

    8051內部結構

    8051內部結構供大家參考。
    發表于 12-17 08:59

    cd4017內部結構

    cd4017內部結構
    發表于 11-19 20:23 ?2175次閱讀
    cd4017<b class='flag-5'>內部結構</b>

    華為NodeB的內部結構和單板介紹

    華為NodeB的內部結構和單板介紹 華為BTS3812結構如下: 華
    發表于 06-30 09:33 ?3176次閱讀
    華為NodeB的<b class='flag-5'>內部結構</b>和單板介紹

    L4990內部結構框圖

    L4990內部結構框圖
    發表于 10-15 11:52 ?809次閱讀
    L4990<b class='flag-5'>內部結構</b>框圖

    MAX782內部結構框圖

    MAX782內部結構框圖 內部框圖
    發表于 11-14 16:24 ?1010次閱讀
    MAX782<b class='flag-5'>內部結構</b>框圖

    LT1072的內部結構框圖

    LT1072的內部結構框圖
    發表于 11-14 16:59 ?1081次閱讀
    LT1072的<b class='flag-5'>內部結構</b>框圖

    蓄電池內部結構

    蓄電池內部結構
    發表于 11-16 14:15 ?5359次閱讀

    CX20106內部結構框圖

    CX20106 內部結構框圖 考慮到調制解調時可靠性,利用紅外線專用接收集成芯片CX20106 進行調制解調,其內部結構框圖如圖6 所示。
    發表于 01-06 18:08 ?2538次閱讀
    CX20106<b class='flag-5'>內部結構</b>框圖

    伺服電機內部結構

    伺服電機內部結構
    發表于 02-25 17:38 ?4772次閱讀
    伺服電機<b class='flag-5'>內部結構</b>

    動鐵耳機的內部結構

    動鐵耳機的內部結構  
    發表于 05-17 18:28 ?9416次閱讀

    元件的內部結構

    元件的內部結構
    發表于 03-04 17:48 ?6次下載

    交叉導軌的內部結構

    交叉導軌的內部結構
    的頭像 發表于 08-16 17:52 ?1119次閱讀
    交叉導軌的<b class='flag-5'>內部結構</b>

    MOSFET和IGBT內部結構與應用

    MOSFET和IGBT內部結構不同,決定了其應用領域的不同。
    的頭像 發表于 11-03 14:53 ?1115次閱讀
    MOSFET和IGBT<b class='flag-5'>內部結構</b>與應用
    百家乐官网路子技巧| 网上的百家乐官网是假的吗| 百家乐官网娱乐网址| 百家乐扑克玩法| 贝博百家乐的玩法技巧和规则| 大发888娱乐场 手机版| 百家乐官网神仙道礼包| 百家乐官网是骗人的么| 至尊百家乐官网娱乐场| 金百家乐官网网站| 百家乐官网斗地主炸金花| 百家乐桌| 365体育投注| 百家乐官网网盛世三国| 真人百家乐代理分成| 大发888娱乐客户端真钱| 百家乐官网机械投注法| 百家乐太阳城菲律宾| 大发888娱乐城可靠吗| 博彩老头排列三| 星际百家乐官网娱乐城| 百家乐技巧赚钱| 云梦县| 风水24山图片| 大发888亚洲| 百家乐官网开闲几率| 新澳博百家乐娱乐城| 渭南市| 百家乐是如何骗人的| 奔驰娱乐城开户| 公海百家乐官网的玩法技巧和规则 | 百家乐官网最佳注码法| 什么叫百家乐的玩法技巧和规则| 百家乐官网视频象棋| 百家乐视频下载地址| 六合彩开奖结果查询| 百家乐官网技巧技巧| 大发888 官方| 棋牌游戏开发商| 百家乐兑换棋牌| 36棋牌的深海捕鱼|