使用內部類的原因
學習總得知其所以然,前面的一篇文章中我有提到過關於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技術的公眾號:理想二旬不止

