摘要:密碼備份文件我們來看其測試運行結果密碼備份文件這樣做的好處之一就是,我們可以在這個方法中增加一些判斷語句,起到數據安全的作用。
使用內部類的原因
學習總得知其所以然,前面的一篇文章中我有提到過關于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技術的公眾號:理想二旬不止
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76218.html
摘要:用這種方式創建組件時,并沒有對內部的函數,進行綁定,所以如果你想讓函數在回調中保持正確的,就要手動對需要的函數進行綁定,如上面的,在構造函數中對進行了綁定。 當我們談起React的時候,多半會將注意力集中在組件之上,思考如何將頁面劃分成一個個組件,以及如何編寫可復用的組件。但對于接觸React不久,還沒有真正用它做一個完整項目的人來說,理解如何創建一個組件也并不那么簡單。在最開始的時候...
摘要:用戶態不能干擾內核態所以指令就有兩種特權指令和非特權指令不同的狀態對應不同的指令。非特權指令所有程序均可直接使用。用戶態常態目態執行非特權指令。 這是我今年從三月份開始,主要的大廠面試經過,有些企業面試的還沒來得及整理,可能有些沒有帶答案就發出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助! 面試清單 平安產險 飛豬 上汽大通 浩鯨科...
摘要:從今天起我們開始討論的面向對象面向對象概念理解面向對象語言有個標志它們都具有類的概念,通過類可以創建任意多個具有相同屬性和方法的對象。 從今天起我們開始討論javascript的面向對象 面向對象概念理解 面向對象語言有個標志=>它們都具有類的概念,通過類可以創建任意多個具有相同屬性和方法的對象。面向對象有三大特性 封裝 繼承 多態 但JS中對象與純面向對象語言中的對象是不同的 J...
摘要:這個算法看似不錯而且簡單,不過存在這一個致命傷當兩個對象互相引用的時候,就永遠不會被回收于是引用計數算法就永遠回收不了這兩個對象,下面介紹另一種算法。 前言 ? 如果要問Java與其他編程語言最大的不同是什么,我第一個想到的一定就是Java所運行的JVM所自帶的自動垃圾回收機制,以下是我學習JVM垃圾回收機制整理的筆記,希望能對讀者有一些幫助。 哪些內存需要回收?what? ? ...
閱讀 1804·2023-04-26 02:32
閱讀 567·2021-11-18 13:12
閱讀 2446·2021-10-20 13:48
閱讀 2515·2021-10-14 09:43
閱讀 3825·2021-10-11 10:58
閱讀 3483·2021-09-30 10:00
閱讀 2932·2019-08-30 15:53
閱讀 3487·2019-08-30 15:53