Java面向?qū)ο笾畠?nèi)部類(lèi)詳解
前言
在 Java 中,允許一個(gè)類(lèi)的定義位于另一個(gè)類(lèi)的內(nèi)部,前者稱(chēng)為內(nèi)部類(lèi),后者稱(chēng)為外部類(lèi)。本篇博客將總結(jié)內(nèi)部類(lèi)的使用。
內(nèi)部類(lè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)部類(lèi)。
在 Java 中,允許一個(gè)類(lèi)的定義位于另一個(gè)類(lèi)的內(nèi)部,前者稱(chēng)為內(nèi)部類(lèi),后者稱(chēng)為外部類(lèi)。
內(nèi)部類(lèi)一般用在定義它的類(lèi)或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱(chēng)。
內(nèi)部類(lèi)的名字不能與包含它的外部類(lèi)類(lèi)名相同;
內(nèi)部類(lèi)的分類(lèi)
內(nèi)部類(lèi)分為:
成員內(nèi)部類(lèi)( static 成員內(nèi)部類(lèi)和非 static 成員內(nèi)部類(lèi))
局部?jī)?nèi)部類(lèi)(方法內(nèi),代碼塊內(nèi),構(gòu)造器內(nèi))
成員內(nèi)部類(lèi)
一方面,作為外部類(lèi)的成員:
- 調(diào)用外部類(lèi)的結(jié)構(gòu)。
- 可以被 static 修飾(注意里面只能調(diào)用靜態(tài)方法,靜態(tài)屬性)。
- 可以被4種不同的權(quán)限修飾。
另一方面,作為一個(gè)類(lèi):
- 類(lèi)內(nèi)可以定義屬性、方法、構(gòu)造器等。
- 可以被final修飾,表示此類(lèi)不能被繼承。
- 可以被 abstract 修飾。
class People{
String race;
String countries;
//靜態(tài)成員內(nèi)部類(lèi)
static class Man{
String name;
public Man(){
}
public void display(){
System.out.println("3090yyds");
}
}
// 非靜態(tài)成員內(nèi)部類(lèi)
class Women{
String name;
public Women(){
}
public void display(){
System.out.println("化妝");
}
}
}
如何實(shí)例化成員內(nèi)部類(lèi)的對(duì)象
package 內(nèi)部類(lèi);
???????public class Demo {
public static void main(String[] args) {
//創(chuàng)建Man對(duì)象(靜態(tài)的成員內(nèi)部類(lèi))
People.Man m = new People.Man();
m.display();
//創(chuàng)建Women對(duì)象(非靜態(tài)的成員內(nèi)部類(lèi))
People p = new People();
People.Women w = p.new Women();
w.display();
}
}
如何在成員內(nèi)部類(lèi)成員中區(qū)分調(diào)用外部類(lèi)的對(duì)象
package 內(nèi)部類(lèi);
public class Demo {
public static void main(String[] args) {
//創(chuàng)建Women對(duì)象(非靜態(tài)的成員內(nèi)部類(lè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)部類(lè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)部類(lèi)的屬性
System.out.println(People.this.name); //外部類(lèi)的屬性
this.eat(); //內(nèi)部類(lèi)的方法
People.this.eat(); // 外部類(lèi)的方法
}
}
}

局部?jī)?nèi)部類(lèi)
局部?jī)?nèi)部類(lèi)可以在方法內(nèi),代碼塊內(nèi),構(gòu)造器內(nèi)
class Animal{
// 局部?jī)?nèi)部類(lèi)
// 構(gòu)造器內(nèi)
Animal(){
class Dog{
}
}
// 代碼塊內(nèi)
{
class Cat{
}
}
// 方法內(nèi)
public void method(){
class Bird{
}
}
}開(kāi)發(fā)中局部?jī)?nèi)部類(lèi)的使用
我們?cè)陂_(kāi)發(fā)中局部?jī)?nèi)部類(lèi)使用較多,比如,我們需要一個(gè)方法返回實(shí)現(xiàn)了某個(gè)接口的類(lèi)的對(duì)象,此時(shí)方法內(nèi)自然就需要一個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)接口!
例:
// 返回一個(gè)實(shí)現(xiàn)了Comparable接口的類(lèi)的對(duì)象
public Comparable getComparable(){
// 創(chuàng)建一個(gè)實(shí)現(xiàn)了Comparable接口的類(lèi) ---局部?jī)?nèi)部類(lèi)
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable(); // 非匿名內(nèi)部類(lèi)的匿名對(duì)象
}
或者是這樣
// 返回一個(gè)實(shí)現(xiàn)了Comparable接口的類(lèi)的對(duì)象
public Comparable getComparable(){
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
}; // 匿名內(nèi)部類(lèi)的匿名對(duì)象到此這篇關(guān)于Java面向?qū)ο笾畠?nèi)部類(lèi)詳解的文章就介紹到這了,更多相關(guān)Java內(nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java內(nèi)部類(lèi)之成員內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)用法及說(shuō)明
- Java匿名內(nèi)部類(lèi)導(dǎo)致內(nèi)存泄露的原因與解決方案詳解
- Java內(nèi)部類(lèi)持有外部類(lèi)導(dǎo)致內(nèi)存泄露的原因與解決方案詳解
- 初探Java內(nèi)部類(lèi)的使用
- 一文帶你真正理解Java中的內(nèi)部類(lèi)
- 詳解Java中static關(guān)鍵字和內(nèi)部類(lèi)的使用
- 關(guān)于JavaEE內(nèi)部類(lèi)的部分注意事項(xiàng)
相關(guān)文章
關(guān)于mybatis resulttype 返回值異常的問(wèn)題
這篇文章主要介紹了mybatis resulttype 返回值異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪問(wèn)項(xiàng)目方式
這篇文章主要介紹了springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪問(wèn)項(xiàng)目方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Java設(shè)計(jì)模式之靜態(tài)工廠模式詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之靜態(tài)工廠模式,簡(jiǎn)單說(shuō)明了靜態(tài)工廠模式的概念、原理、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2017-09-09
Springboot整合Mybatispuls的實(shí)例詳解
這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
在SpringBoot框架下實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的方法詳解
SpringBoot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,今天我們就使用純前對(duì)按表格控件帶大家了解,如何在Spring Boot框架下實(shí)現(xiàn)Excel服務(wù)端導(dǎo)入導(dǎo)出,需要的朋友可以參考下2023-06-06
java中帶參數(shù)的try(){}語(yǔ)法含義詳解
這篇文章主要介紹了java中帶參數(shù)的try(){}語(yǔ)法含義詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java中 Set與Map排序輸出到Writer詳解及實(shí)例
這篇文章主要介紹了 java中 Set與Map排序輸出到Writer詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03

