JAVA內部類使用

一、什么是內部類?

  一個類的定義放在另一個類的內部,這個類就叫做內部類

二、內部類有那些特性?

  1、內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號 。
  2、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變量,無論是否是private的 。
  3、內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量 。

三、內部類有哪幾種?

  1.成員內部類

如:
 1 package com.test01;
 2 
 3 public class A {
 4     // 內部類 B 繼承 TestPojo 和實現 TestInterface 接口
 5     class B extends TestPojo implements TestInterface{
 6         //內部類 B 自己的方法
 7         public void run(){
 8             System.out.println("我正在跑!");
 9         }
10         //重寫的接口方法
11         public void testf() {
12             System.out.println("實現接口!");
13         }
14     } 
15     // 方法里面調用內部類
16     public  void test(){
17         B b = new B() ;
18         b.testf() ;        // 掉用重寫接口方法
19         b.run() ;         // 調用自己的方法
20         b.testpojo() ;     // 調用繼承父類的方法
21     }
22     // main 方法測試
23     public static void main(String[] args) {
24         A a = new A() ;
25         a.test() ;
26     }
27 }
28 // 定義了一個接口 ,方法為testf() 
29 interface TestInterface{
30     public void testf() ;
31 }
32 // 定義了一個普通類  方法testpojo() 
33 class TestPojo{
34     public void testpojo(){
35         System.out.println("我是簡單的pojo類");
36     }
37 }
38 // 實現 調用內部類里面的方法
39 class Textone{
40     public static void main(String[] args) {
41         A.B b = new A().new B() ;    //調用類A里面的內部類B
42         /** 等同于 下面代碼
43          *         A a = new A() ;
44          *         A.B b = a.new B() ;
45          * */
46         b.testf() ;      // 掉用重寫接口方法
47         b.run() ;        // 調用自己的方法
48         b.testpojo() ;   // 調用繼承父類的方法
49     }
50 }

  2、方法內部類

 1 package com.test01;
 2 
 3 public class PerTest {
 4     public void test(){         // 定義一個方法
 5         class Ne{                // 定義一個方法內部類
 6             public void fle(){    // 定義方法內部類的方法 
 7                 System.out.println("我正在飛翔!");
 8             }
 9         } ;
10         new Ne().fle() ;        //調用內部類的方法
11     }
12     public static void main(String[] args) {
13         new PerTest().test() ;    //測試
14     }
15 }  

  注意: (1)、方法內部類只能在定義該內部類的方法內實例化,不可以在此方法外對其實例化。
      (2)、方法內部類對象不能使用該內部類所在方法的非final局部變量。        

      因為方法的局部變量位于棧上,只存在于該方法的生命期內。當一個方法結束,其棧結構被刪除,
      局部變量成為歷史。但是該方法結束之后,在方法內創建的內部類對象可能仍然存在于堆中!
      例如,如果對它的引用被傳遞到其他某些代碼,并存儲在一個成員變量內。正因為不能保證局部變
      量的存活期和方法內部類對象的一樣長,所以內部類對象不能使用它們。 (該理解來源于百度百科)

   3、匿名內部類

      1)、抽象匿名內部類

        

 1 package com.anonymous;
 2 
 3 public class AbstractClass {
 4     public void test(){                //方法為test
 5         TestA a = new TestA(){        //實現抽象類
 6             @Override
 7             public void run() {        //實現抽象類的方法
 8                 System.out.println("我正在使用抽象匿名內部類");
 9             }
10         } ;
11         a.run() ;                    //調用內部類的方法
12     }
13     public static void main(String[] args) {
14         new AbstractClass().test() ;    //測試
15     }
16 }
17 //定義一個抽象類 TestA  抽象方法為run()
18 abstract class TestA{
19     public abstract void run() ;
20 }

    2)、接口匿名內部類

 1 package com.anonymous;
 2 
 3 public class TestAnonymous {
 4     MyInterface m = new MyInterface(){    //實現接口
 5         public void eat() {                //重寫MyInterface 接口方法
 6             System.out.println("我正在吃飯!");
 7         }
 8     } ;
 9     public void ss(){    //方法ss
10         m.eat() ;        //調用重寫的方法
11     }
12     public static void main(String[] args) {
13         new TestAnonymous().ss() ;    //測試
14     }
15 }
16 //定義一個接口  方法為 eat
17 interface MyInterface{
18     public void eat() ;
19 }

  注意:匿名內部 類 可以定義在方法內也可以定義在類的成員中,不管是那種匿名內部類都不能被外部類直接調用

四、內部類的作用?

  每個內部類都能獨立地繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對于內部類都沒有影響。如果沒有
內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。
接口解決了部分問題,而內部類有效地實現了“多重繼承”。

?

轉載于:https://www.cnblogs.com/ChangFen/p/6069531.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初學大數據之模塊集成:Pycharm安裝numpy,scipy,sklearn等包時遇到的各種問題的一鍵解決方法

最近在學習機器學習,要用Python寫程序,習慣了用IDE軟件,所以就使用Pycharm軟件。但是在導入類似numpy,sklearn等模塊的時候,發現了各種問題(如Python版本與模塊之間的兼容等各類問題),上網找了許多方法&…

html 圓環實現多種顏色,SVG實現多彩圓環倒計時效果的示例代碼

圓環倒計時我們經常見到,實現的方法也有很多種。但是本文將介紹一種全新的實現方式,使用SVG來實現倒計時功能。本文主要用到了SVG的stroke-dasharray和stroke-dashoffset特性。下圖是倒計時運行效果:SVG倒計時案例下面說說相關的實現代碼。cs…

調用API發送郵件163郵箱Python

#發郵件的庫 import smtplib# from email.mime.text import MIMEText #SMTP服務器 SMTPSever "smtp.163.com" #發郵件的地址 sender "18332191389163.com" #發送這郵箱的密碼 passwd "xxxxxxxx"#設置發送的內容 message "liu wang is …

u-boot文件夾

參考網址: http://www.cnblogs.com/PengfeiSong/p/6392056.html http://www.360doc.com/content/14/1114/14/8890849_425067013.shtml 轉載于:https://www.cnblogs.com/lijimmy/p/6580870.html

初學大數據之Python中5個最佳的數據科學庫的學習

在下載了pycharm軟件以及通過前兩篇文章,配置了相應的模塊包之后,那就開始對常用的模塊的學習,以便后期利用這些模塊對數據做模型化處理。 如果你已經決定把Python作為你的編程語言,那么,你腦海中的下一個問題會是&…

配置mq

mq的實現可以是apache的&#xff0c;也可以是ibm的&#xff0c;配置不同的地方是connectionFactory和queue和topic應用的包不同 <!-- 配置鏈接器&#xff0c;注入apache的實現 --><bean id"connectionFactory"class"org.springframework.jms.connectio…

模擬銀行自動提款系統python

列出對象及屬性名稱行為...py 人 類名&#xff1a;Person 屬性&#xff1a;姓名 身份證號 電話 卡 行為&#xff1a;卡 類名&#xff1a;Card 屬性&#xff1a;卡號 密碼 余額 行為&#xff1a;銀行 類名&#xff1a;Bank 屬性&#xff1a;用戶列表 提款機提款機 類名&#xf…

幫助文件html打不開,chm幫助文件打不開全是代碼?這幾種解決方法了解一下

win10系統chm幫助文件打不開怎么辦?近期使用win10 版本 1809 (OS 內部版本 17763.864)系統的用戶反應電腦打不開這個chm幫助文件的情況&#xff0c;打開后顯示不正常&#xff0c;針對這樣的問題如何解決呢?針對chm文件打開異常的現象大家可以參考本文中飛飛系統介紹的方法來修…

關于四種語言中substring()方法參數值的解析

1.關于substring(a,b)Jsvar str"bdqn";var resultstr.substring(1,2);alert(result);第一個參數&#xff1a;開始的位置&#xff0c;從0開始數第二個參數&#xff0c;結束的索引&#xff0c;從1開始數&#xff0c;而不是獲取幾個長度SQLselect substring(bdqn,2,1)第…

python中tkinter的使用-上

00基礎代碼 import tkinterwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020")win.mainloop() 01簡單示例 #創建主窗口 win tkinter.Tk() #設置標題 win.title("Liuwang") #設置大小和位置 win.geometry("400x40020…

滾動條樣式修改

/*滾動條*/ ::-webkit-scrollbar { width: 4px; height: 4px; background-color: #F5F5F5; } /*定義滾動條軌道 內陰影圓角*/ ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.…

sklearn中常用的數據預處理方法

常見的數據預處理方法&#xff0c;以下通過sklearn的preprocessing模塊來介紹; 1. 標準化&#xff08;Standardization or Mean Removal and Variance Scaling) 變換后各維特征有0均值&#xff0c;單位方差。也叫z-score規范化&#xff08;零均值規范化&#xff09;。計算方式是…

兒童學計算機編程好處,兒童學習編程有什么好處

原標題&#xff1a;兒童學習編程有什么好處前幾年中國家長可能對少兒編程教育感到陌生。但隨著這兩年美國STEM教育在中國的流行&#xff0c;以及今年國務院普及中小學階段人工智能、編程教育規劃的發布&#xff0c;現在國內也漸漸掀起少兒學習編程的風潮。孩子學電腦編程&#…

python中tkinter的使用-中

00Listbox控件 import tkinterwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020") 列表框控件&#xff0c;可以包含一個或者多個文本框 作用&#xff1a;在listbox控件的小窗口顯示一個字符串 #1、創建一個listbox,添加幾個元素&#…

SharePoint Server 2016 PWA(Project web app) 被變為只讀模式

今天有同事反應了一個狀況&#xff0c;我們SharePoint 2016里面集成的Project Web App(以下簡稱PWA)變成 read-only 只讀模式了&#xff01;今天就給大家分享一下我的排查過程&#xff0c;供大家參考。 整個過程我一共使用了五種辦法&#xff0c;結果最后一種才生效&#xff0c…

HDU 5741 Helter Skelter(構造法)

【題目鏈接】 http://acm.hdu.edu.cn/showproblem.php?pid5741 【題目大意】 一個01相間的串&#xff0c;以0開頭&#xff0c;給出的序列每個數字表示連續的0的個數或者1的個數&#xff0c;現在有m個詢問&#xff0c;求0的個數為a且1的個數為b的串是否存在。 【題解】 我們發現…

集成學習之參數調整策略

1 Random Forest和Gradient Tree Boosting參數詳解 在sklearn.ensemble庫中&#xff0c;我們可以找到Random Forest分類和回歸的實現&#xff1a;RandomForestClassifier和RandomForestRegression&#xff0c;Gradient Tree Boosting分類和回歸的實現&#xff1a;GradientBoost…

python中tkinter的使用-下

00表格數據 import tkinter from tkinter import ttkwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020")#表格 tree ttk.Treeview(win) tree.pack() #列 tree["columns"] ("姓名","年齡","身高&…

計算機科學和建筑設計結合,智能化建筑中計算機科學與技術的應用

4494 科技創新 建筑工程技術與設計2018年5月上【摘要】隨著我國經濟的發展&#xff0c;計算機科學技術已經逐漸應用到各個領域。將計算機科學與建筑相結合&#xff0c;為建筑業的發展提供了契機。本文介紹了計算機科學技術在智能化建筑中的應用&#xff0c;以期其為加快我國智能…

符號

符號&#xff1a;; 多個命令的分隔符/ 根或者路徑的分隔符> 或1>標準輸出重定向&#xff08;數據流朝著箭頭的方向流動&#xff09;&#xff0c;覆蓋原來的文件>>或1>>追加重定向&#xff08;數據流朝著箭頭的方向流動&#xff09;&#xff0c;再原來的文件…