Java語言中4種內(nèi)部類的超詳細講解
一.內(nèi)部類的介紹
內(nèi)部類: 一個類定義在 另一個類 的 內(nèi)部。
內(nèi)部類分為四種:實例內(nèi)部類、靜態(tài)內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類。
使用時機:當一個事物的內(nèi)部,還需要一個完整的結(jié)構(gòu)進行描述時,而這個內(nèi)部的完整結(jié)構(gòu)又只為外部事物提供服務,這個完整結(jié)構(gòu)最好使用內(nèi)部類。(通常 數(shù)據(jù)結(jié)構(gòu) 時會使用)
內(nèi)部類代碼實例:
public class Person{
class Student{
}
}
//Person是外部類
//Student是內(nèi)部類注: 1.定義在class類名外{}花括號外部的其他類,即使是一個文件夾,都不能稱為內(nèi)部類。 2.內(nèi)部類和外部類共用一個Java源文件,但是經(jīng)過編譯之后,內(nèi)部類會形成單獨的字節(jié)碼文件。
二.內(nèi)部類的種類
2.1實例內(nèi)部類
代碼實例:
public class Person {
public int data1=10;
public int data2=20;
//實例內(nèi)部類
class InnerClass{
public int data1 = 40;
//public static int data4=60; 無法定義靜態(tài)成員變量
public static finally int data4=60 //finally修飾,為常量
public void textInner(){
System.out.println("textInner");
System.out.println(this.data1); //輸出為40;
System.out.println(Person.this.data1); //輸出為10;
}
}
public static void main(String[] args) {
//實例化內(nèi)部類
Person kk = new Person();
Person.InnerClass fw = new Person().new InnerClass();
fw.textInner(); //輸出結(jié)果為:textInner
//實例化內(nèi)部類
Person.InnerClass fw1 =new Person().new InnerClass();
fw1.textInner(); //輸出結(jié)果為:textInner
}
}解析:
1.定義在類當中,且不被static修飾的內(nèi)部類。
2.因為static不依賴于對象,所以無法定義靜態(tài)成員變量
3.當需要實例化實例內(nèi)部類時,語法格式為:
1. 外部類名.內(nèi)部類名 變量名=new 外部類名().new 內(nèi)部類();
2. 外部類名 變量名1=new 外部類名();
外部類名.內(nèi)部類名 變量名2=變量名1.new 內(nèi)部類名();
4.當內(nèi)部類的變量名和外部類的變量名相同時,優(yōu)先訪問自己的,而想調(diào)用外部類的成員,調(diào)用方法:外部類名.this.同名成員。
5.外部類的任何成員都可以在實例內(nèi)部類方法中直接訪問。
2.2.靜態(tài)內(nèi)部類
public class Person2 {
public int data=10;
private int data2=20;
//靜態(tài)內(nèi)部類
static class InnerClass{
public int data = 40;
//public static int data3=60; 無法定義靜態(tài)成員變量
public void textInner(){
System.out.println("textInner");
System.out.println(data); //輸出內(nèi)部類的40
Person2 kk=new Person2();
System.out.println(kk.data); //輸出外部類的10;
}
}
public static void main(String[] args) {
//實例化靜態(tài)內(nèi)部類
Person2.InnerClass fw1 =new Person2.InnerClass() ;
fw1.textInner(); //輸出結(jié)果為:textInner
}
}解析 :
- 定義在類當中,被static修飾的內(nèi)部類
- 當需要實例化靜態(tài)內(nèi)部類時,語法格式為 :外部類名.內(nèi)部類名 變量名=new 外部類名.內(nèi)部類();
- 訪問外部變量時,必須先實例化外部變量的對象,再進行調(diào)用。
2.3局部內(nèi)部類
public class Person3 {
public int data=10;
private int data2=20;
public void textInner(){
//定義局部內(nèi)部類
class InnerClass{
int data3=20;
public void methodInner(){
System.out.println(data3);
}
}
//實例化局部內(nèi)部類
InnerClass fw=new.InnerClass();
fw. methodInner();
}
public static void main(String[] args) {
//方法體
}
}解析:
1.在方法當中定義的內(nèi)部類。
2.只能在該方法體內(nèi)部使用,其他位置都不能使用。
3.也不能被訪問修飾符public、private等修飾
2.4匿名內(nèi)部類
interface Shape{
void draw();
}
public class Text3 {
public static void main(String[] args) {
int area=20;
new Shape(){
//需要重寫內(nèi)部方法
public void draw()
{
// area=50; 無法修改,一旦修改無法訪問了。
System.out.println("正方形面積:"+area);
}
}.draw(); //調(diào)用draw();
}
}解析:
1.匿名內(nèi)部類與接口有關(guān),匿名一詞便可以知道不需要變量名。
2.語法格式: new 接口名() {//重寫的方法
}.需要調(diào)用的方法;
3.匿名內(nèi)部類里使用到外部變量時,不可以在匿名內(nèi)部類里修改變量值,會停止訪問。
總結(jié)
四種內(nèi)部類,使用最少的是局部內(nèi)部類,并且四種內(nèi)部類有這很大的不同,不同的語法要求,使用限制等等,在數(shù)據(jù)結(jié)構(gòu)的線性表、棧堆等都需要使用,所以我們得熟練掌握。
到此這篇關(guān)于Java語言中4種內(nèi)部類的超詳細講解的文章就介紹到這了,更多相關(guān)Java內(nèi)部類講解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你使用eclipse?搭建Swt?環(huán)境的全過程
本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置詳解
Log4J2是Apache Log4j的升級版,參考了logback的一些優(yōu)秀的設計,并且修復了一些問題,因此帶來了一些重大的提升,這篇文章主要介紹了Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置,需要的朋友可以參考下2023-12-12
Springboot mybatis-plus配置及用法詳解
這篇文章主要介紹了Springboot mybatis-plus配置及用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
關(guān)于Java中配置ElasticSearch集群環(huán)境賬號密碼的問題
這篇文章主要介紹了Java中配置ElasticSearch集群環(huán)境賬號密碼的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
詳解springMVC之與json數(shù)據(jù)交互方法
本篇文章主要介紹了詳解springMVC之與json數(shù)據(jù)交互方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

