Java面向?qū)ο笾畠?nèi)部類詳解
前言
在 Java 中,允許一個(gè)類的定義位于另一個(gè)類的內(nèi)部,前者稱為內(nèi)部類,后者稱為外部類。本篇博客將總結(jié)內(nèi)部類的使用。
內(nèi)部類概述
當(dāng)一個(gè)事物的內(nèi)部,還有一個(gè)部分需要一個(gè)完整的結(jié)構(gòu)進(jìn)行描述,而這個(gè)內(nèi)部的完整的結(jié)構(gòu)又只為外部事物提供服務(wù),那么整個(gè)內(nèi)部的完整結(jié)構(gòu)最好使用內(nèi)部類。
在 Java 中,允許一個(gè)類的定義位于另一個(gè)類的內(nèi)部,前者稱為內(nèi)部類,后者稱為外部類。
內(nèi)部類一般用在定義它的類或語句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱。
內(nèi)部類的名字不能與包含它的外部類類名相同;
內(nèi)部類的分類
內(nèi)部類分為:
成員內(nèi)部類( static 成員內(nèi)部類和非 static 成員內(nèi)部類)
局部內(nèi)部類(方法內(nèi),代碼塊內(nèi),構(gòu)造器內(nèi))
成員內(nèi)部類
一方面,作為外部類的成員:
- 調(diào)用外部類的結(jié)構(gòu)。
- 可以被 static 修飾(注意里面只能調(diào)用靜態(tài)方法,靜態(tài)屬性)。
- 可以被4種不同的權(quán)限修飾。
另一方面,作為一個(gè)類:
- 類內(nèi)可以定義屬性、方法、構(gòu)造器等。
- 可以被final修飾,表示此類不能被繼承。
- 可以被 abstract 修飾。
class People{ String race; String countries; //靜態(tài)成員內(nèi)部類 static class Man{ String name; public Man(){ } public void display(){ System.out.println("3090yyds"); } } // 非靜態(tài)成員內(nèi)部類 class Women{ String name; public Women(){ } public void display(){ System.out.println("化妝"); } } }
如何實(shí)例化成員內(nèi)部類的對(duì)象
package 內(nèi)部類; ???????public class Demo { public static void main(String[] args) { //創(chuàng)建Man對(duì)象(靜態(tài)的成員內(nèi)部類) People.Man m = new People.Man(); m.display(); //創(chuàng)建Women對(duì)象(非靜態(tài)的成員內(nèi)部類) People p = new People(); People.Women w = p.new Women(); w.display(); } }
如何在成員內(nèi)部類成員中區(qū)分調(diào)用外部類的對(duì)象
package 內(nèi)部類; public class Demo { public static void main(String[] args) { //創(chuàng)建Women對(duì)象(非靜態(tài)的成員內(nèi)部類) People p = new People(); People.Women w = p.new Women(); w.display("a"); } } class People{ String name = "niu"; String countries; public void eat(){ System.out.println("吃飯"); } // 非靜態(tài)成員內(nèi)部類 class Women{ String name = "aniu"; public Women(){ } public void eat(){ System.out.println("吃蔬菜"); } public void display(String name){ System.out.println("化妝"); System.out.println(name); //方法的形參 System.out.println(this.name); //內(nèi)部類的屬性 System.out.println(People.this.name); //外部類的屬性 this.eat(); //內(nèi)部類的方法 People.this.eat(); // 外部類的方法 } } }
局部內(nèi)部類
局部內(nèi)部類可以在方法內(nèi),代碼塊內(nèi),構(gòu)造器內(nèi)
class Animal{ // 局部內(nèi)部類 // 構(gòu)造器內(nèi) Animal(){ class Dog{ } } // 代碼塊內(nèi) { class Cat{ } } // 方法內(nèi) public void method(){ class Bird{ } } }
開發(fā)中局部內(nèi)部類的使用
我們?cè)陂_發(fā)中局部內(nèi)部類使用較多,比如,我們需要一個(gè)方法返回實(shí)現(xiàn)了某個(gè)接口的類的對(duì)象,此時(shí)方法內(nèi)自然就需要一個(gè)內(nèi)部類實(shí)現(xiàn)接口!
例:
// 返回一個(gè)實(shí)現(xiàn)了Comparable接口的類的對(duì)象 public Comparable getComparable(){ // 創(chuàng)建一個(gè)實(shí)現(xiàn)了Comparable接口的類 ---局部內(nèi)部類 class MyComparable implements Comparable{ @Override public int compareTo(Object o) { return 0; } } return new MyComparable(); // 非匿名內(nèi)部類的匿名對(duì)象 }
或者是這樣
// 返回一個(gè)實(shí)現(xiàn)了Comparable接口的類的對(duì)象 public Comparable getComparable(){ return new Comparable() { @Override public int compareTo(Object o) { return 0; } }; // 匿名內(nèi)部類的匿名對(duì)象
到此這篇關(guān)于Java面向?qū)ο笾畠?nèi)部類詳解的文章就介紹到這了,更多相關(guān)Java內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse 使用Maven構(gòu)建SpringMVC項(xiàng)目
本文主要介紹在Eclipse下創(chuàng)建Maven項(xiàng)目構(gòu)建SpringMVC框架的過程,講解的比較詳細(xì),需要的朋友可以參考下。2016-06-06通過System.getProperty配置JVM系統(tǒng)屬性
這篇文章主要介紹了通過System.getProperty配置JVM系統(tǒng)屬性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java反射 JavaBean對(duì)象自動(dòng)生成插入,更新,刪除,查詢sql語句操作
這篇文章主要介紹了Java反射 JavaBean對(duì)象自動(dòng)生成插入,更新,刪除,查詢sql語句操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08java的Jackson將json字符串轉(zhuǎn)換成泛型List
這篇文章主要介紹了java的Jackson將json字符串轉(zhuǎn)換成泛型List ,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-02-02JDBC獲取數(shù)據(jù)庫連接的5種方式實(shí)例
JDBC是一種用于執(zhí)行SQL語句的JavaAPI,為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法,這篇文章主要給大家介紹了關(guān)于JDBC獲取數(shù)據(jù)庫連接的5種方式,需要的朋友可以參考下2022-06-06分析java中全面的單例模式多種實(shí)現(xiàn)方式
單例模式是一種常用的軟件設(shè)計(jì)模式,單例對(duì)象的類只能允許一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,有利于協(xié)調(diào)系統(tǒng)整體的行為。比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中。本文將介紹它的思想和多種實(shí)現(xiàn)方式2021-06-06mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié)
MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié),需要的朋友可以參考下2017-02-02javabean?中使用@Transient屬性處理臨時(shí)字段
@Transient表示該屬性并非一個(gè)到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性,本文給大家介紹javabean?中臨時(shí)字段的處理:@Transient,感興趣的朋友跟隨小編一起看看吧2023-08-08SpringBoot使用@ResponseBody返回圖片的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot使用@ResponseBody返回圖片的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11