簡單談一談Java內部類的使用原因


使用內部類的原因

學習總得知其所以然,前面的一篇文章中我有提到過關於java內部類的幾種用法以及一些示例,但是不明白內部類具體可以做什么,顯然學習起來很渺茫,今天的文章簡單說一說使用內部類的幾個原因,為了可讀性更好,示例都極大的簡化了,希望能給初學者一些幫助

(一) 封裝性

作為一個類的編寫者,我們很顯然需要對這個類的使用訪問者的訪問權限做出一定的限制,我們需要將一些我們不願意讓別人看到的操作隱藏起來,

如果我們的內部類不想輕易被任何人訪問,可以選擇使用private修飾內部類,這樣我們就無法通過創建對象的方法來訪問,想要訪問只需要在外部類中定義一個public修飾的方法,間接調用。

public interface Demo {
    void show();
}
class Outer {
    private class test implements Demo {
        public void show() {
            System.out.println("密碼備份文件");
        }
    }
    
    public Demo getInner() {
        return new test();
    }
    
}

我們來看其測試

    public static void main(String[] args) {
    	Outer outer = new Outer();
        Demo d = outer.getInner();
        i.show();
    }

//運行結果
密碼備份文件

這樣做的好處之一就是,我們可以在這個public方法中增加一些判斷語句,起到數據安全的作用。

其次呢,我們的對外可見的只是getInner()這個方法,它返回了一個Demo接口的一個實例,而我們真正的內部類的名稱就被隱藏起來了

(二) 實現多繼承 ※

我們之前的學習知道,java是不可以實現多繼承的,一次只能繼承一個類,我們學習接口的時候,有提到可以用接口來實現多繼承的效果,即一個接口有多個實現,但是這里也是有一點弊端的,那就是,一旦實現一個接口就必須實現里面的所有方法,有時候就會出現一些累贅,但是使用內部類可以很好的解決這些問題

public class Demo1 {
    public String name() {
        return "BWH_Steven";
    }
}
public class Demo2 {
    public String email() {
        return "xxx.@163.com";
    }
}
public class MyDemo {

    private class test1 extends Demo1 {
        public String name() {
            return super.name();
        }
    }

    private class test2 extends Demo2  {
        public String email() {
            return super.email();
        }
    }

    public String name() {
        return new test1().name();
    }

    public String email() {
        return new test2().email();
    }

    public static void main(String args[]) {
        MyDemo md = new MyDemo();
        System.out.println("我的姓名:" + md.name());
        System.out.println("我的郵箱:" + md.email());
    }
}

我們編寫了兩個待繼承的類Demo1和Demo2,在MyDemo類中書寫了兩個內部類,test1和test2 兩者分別繼承了Demo1和Demo2類,這樣MyDemo中就間接的實現了多繼承

(三) 用匿名內部類實現回調功能

我們用通俗講解就是說在Java中,通常就是編寫一個接口,然后你來實現這個接口,然后把這個接口的一個對象作以參數的形式傳到另一個程序方法中, 然后通過接口調用你的方法,匿名內部類就可以很好的展現了這一種回調功能

public interface Demo {
    void demoMethod();
}
public class MyDemo{
    public test(Demo demo){
    	System.out.println("test method");
    }
    
    public static void main(String[] args) {
        MyDemo md = new MyDemo();
        //這里我們使用匿名內部類的方式將接口對象作為參數傳遞到test方法中去了
        md.test(new Demo){
            public void demoMethod(){
                System.out.println("具體實現接口")
            }
        }
    }
}

(四) 解決繼承及實現接口出現同名方法的問題

編寫一個接口 Demo

public interface Demo {
    void test();
}

編寫一個類 MyDemo

public class MyDemo {

    public void test() {
        System.out.println("父類的test方法");
    }
    
}

編寫一個測試類

public class DemoTest extends MyDemo implements Demo {
    public void test() {
    }
}

這樣的話我就有點懵了,這樣如何區分這個方法是接口的還是繼承的,所以我們使用內部類解決這個問題

public class DemoTest extends MyDemo {


    private class inner implements Demo {
        public void test() {
            System.out.println("接口的test方法");
        }
    }
    
    public Demo getIn() {
        return new inner();
    }
    
    
    public static void main(String[] args) {
        //調用接口而來的test()方法
        DemoTest dt = new DemoTest();
        Demo d = dt.getIn();
        d.test();
        
        //調用繼承而來的test()方法
        dt.test();
    }
}

//運行結果
接口的test方法
父類的test方法

結尾:

如果內容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !_

如果能幫到你的話,那就來關注我吧!(系列文章均會在公眾號第一時間更新)

在這里的我們素不相識,卻都在為了自己的夢而努力 ❤

一個堅持推送原創Java技術的公眾號:理想二旬不止


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM