詳解Java內(nèi)部類(lèi)與對(duì)象的打印概念和流程
一、內(nèi)部類(lèi)的概念
在 Java 中,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)或者一個(gè)方法的內(nèi)部,前者稱為內(nèi)部類(lèi),后者稱為外部類(lèi)。內(nèi)部類(lèi)也是封裝的一種體現(xiàn)。
public class OutClass {//外部類(lèi)
class InnerClass{//內(nèi)部類(lèi)
}
}
注意事項(xiàng):
1、內(nèi)部類(lèi)一定是定義在class 類(lèi)名{}之中的類(lèi),定義在class 類(lèi)名{}之外的,哪怕是在一份文件中,也并不能稱為內(nèi)部類(lèi)。例如:
public class A{
}
class B{
}
//A和B兩個(gè)類(lèi)是獨(dú)立的,無(wú)內(nèi)外部類(lèi)一說(shuō)
2、內(nèi)部類(lèi)和外部類(lèi)共用同一個(gè)java源文件,但是經(jīng)過(guò)編譯之后,內(nèi)部類(lèi)會(huì)形成單獨(dú)的字節(jié)碼文件。
二、內(nèi)部類(lèi)的分類(lèi)
public class OutClass {
//普通內(nèi)部類(lèi)
class InnerClass1{
}
//靜態(tài)內(nèi)部類(lèi)
static class InnerClass2{
}
{
//定義在實(shí)例代碼塊中的 局部?jī)?nèi)部類(lèi)
class InnerClass3{
}
}
static{
//定義在靜態(tài)代碼塊中的 局部?jī)?nèi)部類(lèi)
class InnerClass4{
}
}
public void method(){
//定義在方法中的 局部?jī)?nèi)部類(lèi)
class InnerClass5{
}
{
//方法中的普通代碼塊中也可以定義局部?jī)?nèi)部類(lèi)
class InnerClass6{
}
}
}
}
根據(jù)內(nèi)部類(lèi)定義的位置不同,可以分為:
成員內(nèi)部類(lèi):普通內(nèi)部類(lèi)和靜態(tài)內(nèi)部類(lèi)。
局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)。
三、成員內(nèi)部類(lèi)
1、普通內(nèi)部類(lèi)
未被static修飾的成員內(nèi)部類(lèi)。
public class OutClass {//外部類(lèi)
private int a;
private int b;
private int c;
public void method1(){
a=100;
System.out.println(a);
}
public void method2(){
System.out.println(b);
}
class InnerClass{ //普通內(nèi)部類(lèi)
private int c; //與外部類(lèi)成員變量名稱相同的內(nèi)部成員變量
public void methodInner() {
//在內(nèi)部類(lèi)中可以直接訪問(wèn)外部類(lèi)任意限定符的成員變量和方法
b = 150;
method1();
method2();
//在訪問(wèn)與外部類(lèi)成員名稱相同的成員時(shí),優(yōu)先訪問(wèn)內(nèi)部類(lèi)自己的成員
c = 300;
System.out.println(c);
//要訪問(wèn)外部類(lèi)中的同名成員必須使用——— 外部類(lèi)名.this.成員名 來(lái)訪問(wèn)
OutClass.this.c = 400;
System.out.println(OutClass.this.c);
}
}
public static void main(String[] args) {
//創(chuàng)建內(nèi)部類(lèi)對(duì)象
OutClass.InnerClass innerclass1=new OutClass().new InnerClass();
//也可以先創(chuàng)建外部類(lèi)對(duì)象,再創(chuàng)建內(nèi)部類(lèi)對(duì)象
OutClass outclass=new OutClass();
//注意當(dāng)在不同文件中創(chuàng)建其內(nèi)部類(lèi)對(duì)象一定需要加上該內(nèi)部類(lèi)的外部類(lèi)名,同一文件下可加可不加
OutClass.InnerClass innerclass2=outclass.new InnerClass();
innerclass2.methodInner();
}
}
/*
100
150
300
400
*/
注意事項(xiàng):
1、普通內(nèi)部類(lèi)中可以直接訪問(wèn)外部類(lèi)中的所有方法。
2、普通內(nèi)部類(lèi)成員的位置與外部類(lèi)成員位置相同,都受public,private等限定符的限制。
3、在普通內(nèi)部類(lèi)方法中訪問(wèn)同名的成員時(shí),優(yōu)先訪問(wèn)自己的,如果要訪問(wèn)外部類(lèi)同名的成員,必須:外部類(lèi)名稱.this.同名成員 來(lái)訪問(wèn)。
4、要?jiǎng)?chuàng)建普通內(nèi)部類(lèi)對(duì)象,要先創(chuàng)建外部類(lèi)的對(duì)象。在創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),如果該內(nèi)部類(lèi)在當(dāng)前文件,則在創(chuàng)建對(duì)象語(yǔ)句最前面不需要外部類(lèi)名,如果在不同文件,那么一定要指明該內(nèi)部類(lèi)的外部類(lèi)名。
5、 普通內(nèi)部類(lèi)中包含了一個(gè)指向外部類(lèi)對(duì)象的引用。

6、外部類(lèi)中,不能直接訪問(wèn)內(nèi)部類(lèi)中的成員,如果要訪問(wèn)必須先要?jiǎng)?chuàng)建內(nèi)部類(lèi)的對(duì)象。
public class OutClass1 {
private int a;
public void method(){
System.out.println(c); //在外部類(lèi)中直接訪問(wèn)內(nèi)部類(lèi)成員,編譯報(bào)錯(cuò)
}
class InnerClass{
private int c;
}
}
public class OutClass1 {
private int a;
public void methodOut(){
InnerClass I2=new InnerClass();//在外部類(lèi)方法中創(chuàng)建內(nèi)部類(lèi)對(duì)象可以直接創(chuàng)建
System.out.println(I2.c);
}
class InnerClass{
private int c;
}
}
從堆和棧的角度來(lái)看內(nèi)部類(lèi)和外部類(lèi):

2、靜態(tài)內(nèi)部類(lèi)
被static修飾的成員內(nèi)部類(lèi)稱為靜態(tài)內(nèi)部類(lèi)。
public class OutClass {//外部類(lèi)
private int a;
static int b; //靜態(tài)變量
public void method1(){
}
public static void method2(){ //靜態(tài)方法
}
static class InnerClass{ //靜態(tài)內(nèi)部類(lèi)
public void methodInner() {
//在靜態(tài)內(nèi)部類(lèi)中只能訪問(wèn)外部類(lèi)的靜態(tài)成員和方法
// a=100;編譯失敗,a不是外部類(lèi)的成員變量
b = 150;
// method1();編譯失敗,method1不是外部類(lèi)的成員方法
method2();
}
}
public static void main(String[] args) {
//靜態(tài)內(nèi)部類(lèi)的創(chuàng)建
InnerClass innerclass=new InnerClass();
//成員訪問(wèn)
innerclass.methodInner();
}
}
注意事項(xiàng):
1、在內(nèi)部類(lèi)中只能訪問(wèn)外部類(lèi)中的靜態(tài)成員。

2、創(chuàng)建靜態(tài)內(nèi)部類(lèi)對(duì)象時(shí),不需要先創(chuàng)建外部類(lèi)對(duì)象。
3、成員內(nèi)部類(lèi),經(jīng)過(guò)編譯之后會(huì)生成自己獨(dú)立的字節(jié)碼文件,例如下:
![]()
四、局部?jī)?nèi)部類(lèi)
定義在外部類(lèi)的方法體或者{}中,該種內(nèi)部類(lèi)只能在其定義的位置使用。
public class OutClass {//外部類(lèi)
int a=10;
public void method(){ //外部類(lèi)方法
int b=10;
class InnerClass{ //局部?jī)?nèi)部類(lèi),只能在該方法體內(nèi)部使用
public void methodInnerClass(){
System.out.println(a);
System.out.println(b);
}
}
InnerClass innerclass=new InnerClass();
innerclass.methodInnerClass();
}
public static void main(String[] args) {
//InnerClass innerclass=null; 編譯失敗
}
}
注意事項(xiàng):
1、局部?jī)?nèi)部類(lèi)只能在所定義的方法體內(nèi)部使用。
2、局部?jī)?nèi)部類(lèi)不能被public、static等限定符修飾。
3、同樣編譯之后局部?jī)?nèi)部類(lèi)會(huì)生成自己的字節(jié)碼文件。
命名格式:外部類(lèi)名$x內(nèi)部類(lèi)名.class, 其中x是一個(gè)整數(shù)。
![]()
五、對(duì)象的打印
public class Person {
String name;
String gender;
int age;
public Person(String name,String gender,int age){
this.name=name;
this.gender=gender;
this.age=age;
}
public static void main(String[] args) {
Person person=new Person("luka","man",21);
System.out.println(person);
}
}
打印結(jié)果: 并不是對(duì)象本身。

如果想要打印對(duì)象本身,那么需要重寫(xiě)toString方法。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public String toString() { //重寫(xiě)了toString方法
return "[" + name + "," + gender + "," + age + "]";
}
public class Person {
String name;
String gender;
int age;
public Person(String name,String gender,int age){
this.name=name;
this.gender=gender;
this.age=age;
}
public String toString() { //重寫(xiě)了toString方法
return "[" + name + "," + gender + "," + age + "]";
}
public static void main(String[] args) {
Person person=new Person("luka","man",21);
System.out.println(person);
}
}
/*
執(zhí)行結(jié)果:
[luka,man,21]
*/
到此這篇關(guān)于詳解Java內(nèi)部類(lèi)與對(duì)象的打印概念和流程的文章就介紹到這了,更多相關(guān)Java 內(nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享
這篇文章主要為大家分享了java實(shí)現(xiàn)的一個(gè)簡(jiǎn)單TCPSocket聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
Java實(shí)現(xiàn)簡(jiǎn)單棋盤(pán)存檔和讀取功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單棋盤(pán)存檔和讀取功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問(wèn)題
這篇文章主要介紹了解決get請(qǐng)求入?yún)NotNull驗(yàn)證不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理
在開(kāi)發(fā)Java項(xiàng)目時(shí),依賴注入是一種常見(jiàn)的實(shí)現(xiàn)方式,SpringBoot框架通過(guò)@Autowired注解來(lái)實(shí)現(xiàn)依賴注入的功能,本文將介紹SpringBoot中 Autowired注解實(shí)現(xiàn)的原理2023-06-06
關(guān)于Controller 層返回值的公共包裝類(lèi)的問(wèn)題
本文給大家介紹Controller 層返回值的公共包裝類(lèi)-避免每次都包裝一次返回-InitializingBean增強(qiáng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-09-09

