Java之代碼塊和內(nèi)部類詳解
類中的五大成分:
成員變量,構(gòu)造器,方法,代碼塊,內(nèi)部類。前面我們已經(jīng)學(xué)過前三種今天我們來學(xué)最后兩種。
1、代碼塊
- 代碼塊是類的5大成員之一(成員變量、構(gòu)造器、方法、代碼塊、內(nèi)部類)。
代碼塊的為兩種:
靜態(tài)代碼塊:
- 格式:static{}
- 特點(diǎn):類加載時(shí)自動(dòng)執(zhí)行,由于類只會(huì)加載一次,所以靜態(tài)代碼塊也只會(huì)執(zhí)行一次。
- 作用:完成列=類的初始化,例如:對(duì)靜態(tài)變量的初始化賦值。
實(shí)例代碼塊:
- 格式:{}
- 特點(diǎn):每次創(chuàng)建對(duì)象時(shí),執(zhí)行實(shí)例代碼塊,并在構(gòu)造器前執(zhí)行。
- 作用:和構(gòu)造器一樣,都是用來完成對(duì)象的初始化的,例如:對(duì)實(shí)例變量進(jìn)行初始化賦值。
Test類:測(cè)試類,演示靜態(tài)代碼塊
import java.util.Arrays;
public class Test {
public static int[] cards = new int[10];
//由static修飾的代碼塊,在類加載的時(shí)候執(zhí)行,只執(zhí)行一次。
//基本作用:完成對(duì)類的靜態(tài)資源初始化
static{
System.out.println("靜態(tài)代碼塊");
//在代碼塊初始化只是初始化一次,如果放到方法中,每次調(diào)用方法都會(huì)初始化
cards[0] = 1;
cards[1] = 2;
cards[2] = 3;
cards[3] = 4;
cards[4] = 5;
}
public static void main(String[] args) {
//靜態(tài)代碼塊
System.out.println("main方法");
System.out.println(Arrays.toString(cards));
}
}
/*
靜態(tài)代碼塊
main方法
[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
*/Test類:測(cè)試實(shí)例代碼塊
public class Test {
private int a;
private String[] directory = new String[4]; //實(shí)例變量表示方向,如果用實(shí)例代碼塊表示每個(gè)對(duì)象的這個(gè)數(shù)組,都初始化NSEW, 表示東南西北。
//實(shí)例代碼塊,無static修飾,屬于對(duì)象,每次創(chuàng)建對(duì)象都會(huì)執(zhí)行
//基本作用:初始化對(duì)象實(shí)例資源
{
System.out.println("實(shí)例代碼塊");
a = 10;
directory[0] = "N";
directory[1] = "S";
directory[2] = "E";
directory[3] = "W";
}
public static void main(String[] args) {
//實(shí)例代碼塊
//new 實(shí)例代碼塊();
//沒有對(duì)象實(shí)例代碼塊{}是不執(zhí)行的
System.out.println("main方法");
Test i = new Test ();
}
}
/*
main方法
實(shí)例代碼塊
*/2、內(nèi)部類
- 如果一個(gè)類定義在另一個(gè)類的內(nèi)部,這個(gè)類就是內(nèi)部類。
- 場(chǎng)景:當(dāng)一個(gè)類的內(nèi)部,包含了一個(gè)完整的事物,且這個(gè)事物沒有必要單獨(dú)設(shè)計(jì)時(shí),就可以把這個(gè)事物設(shè)計(jì)成內(nèi)部類。
內(nèi)部類的格式
// 把發(fā)動(dòng)機(jī)類放到汽車類中。
public class Car{
// 內(nèi)部類
public class Engine{
}
}內(nèi)部類的種類
成員內(nèi)部類、靜態(tài)內(nèi)部類、局部?jī)?nèi)部類、匿名內(nèi)部類。
1.成員內(nèi)部類
就是類中的一個(gè)普通成員,類似前面我們學(xué)過的成員變量、成員方法。
public class Outer{
// 成員內(nèi)部類
public class Inner{
}
}成員內(nèi)部類創(chuàng)建對(duì)象的格式
外部類名.內(nèi)部類 對(duì)象名 = new 外部類(....).new內(nèi)部類(...); Outer.Inner inner = new Outer().new Inner();
- 成員內(nèi)部類中可以有普通類中所所以的東西,構(gòu)造器、成員變量、方法等。成員內(nèi)部類可以被繼承也可繼承其他類。
成員內(nèi)部類中訪問其他成員的特點(diǎn)
- 成員內(nèi)部類中可以直接訪問外部類的靜態(tài)成員、靜態(tài)方法。也可以直接訪問外部類的實(shí)例成員、實(shí)例方法。(實(shí)例成員屬于對(duì)象,但是成員內(nèi)部類屬于外部類對(duì)象)
- 成員內(nèi)部類的實(shí)例方法中,可以直接拿到當(dāng)前寄生的外部類對(duì)象:外部類.this()。
Outer 類:內(nèi)有成員內(nèi)部類Inner
public class Outer {
// 成員內(nèi)部類:無static修飾的內(nèi)部類,屬于外部類對(duì)象持有。
//注意事項(xiàng)2
private static int a = 100;
public class Inner{
private int a = 200;
public void show(){
int a = 300;
//任務(wù)在這里打印100 200 300 用a
System.out.println(a);
System.out.println(this.a);
System.out.println(Outer.this.a);
}
}
private int ans;
public void setAns(int ans) {
this.ans = ans;
}
public int getAns() {
return ans;
}
}
Test類
public class Test {
public static void main(String[] args) {
//目標(biāo):搞清楚內(nèi)部類的語法
//成員內(nèi)部類創(chuàng)建對(duì)象格式
//外部類對(duì)象.內(nèi)部類對(duì)象 對(duì)象名 = new 外部類名稱.new.內(nèi)部名稱();
Outer.Inner inner = new Outer().new Inner();
inner.show();
}
}
/*
輸出結(jié)果:
300
200
100
*/2.靜態(tài)內(nèi)部類
有static修飾的內(nèi)部類,屬于外部類自己持有。
public class Outer{
// 靜態(tài)內(nèi)部類
public static class Inner{
}
}靜態(tài)內(nèi)部類創(chuàng)建對(duì)象的格式
外部類名.內(nèi)部類 對(duì)象名 = new 外部類.內(nèi)部類(...); Outer.Inner inner = new Outer.Inner();
靜態(tài)內(nèi)部類注意點(diǎn):可以直接訪問外部類的靜態(tài)成員,不能直接訪問外部類的實(shí)力成員。
3.局部?jī)?nèi)部類(了解)

4.匿名內(nèi)部類(重點(diǎn))
1.認(rèn)識(shí)匿名內(nèi)部類
- 是一種特殊的局部?jī)?nèi)部類;
- 所謂匿名:是類程序員不需要為這個(gè)類聲明名字,默認(rèn)有個(gè)隱藏的名字。
匿名內(nèi)部類格式
new 類或接口(參數(shù)值...){
類體(一般是方法重寫);
}new Animal(){
@Override
public void cry(){
}
}特點(diǎn):匿名內(nèi)部類本質(zhì)是一個(gè)子類,并會(huì)立即創(chuàng)建出一個(gè)子類對(duì)象。
作用:用于更方便的創(chuàng)建一個(gè)子類對(duì)象。
Animal 類:抽象類
public abstract class Animal {
public abstract void cry(); //抽象類沒有方法體
}
Cat 類:繼承了Animal 類
public class Cat extends Animal{
//方法重寫
@Override
public void cry(){
System.out.println("貓喵喵喵~~");
}
}Test類:測(cè)試類
public class Test {
public static void main(String[] args) {
Animal c = new Cat();
c.cry();
}
}
/*
輸出結(jié)果:
貓喵喵喵~~
*/上面的代碼使我們?cè)跊]有學(xué)習(xí)內(nèi)部類之前所寫的,現(xiàn)在我們學(xué)習(xí)了匿名內(nèi)部類,怎么用匿名內(nèi)部類來寫呢?
Animal 類:抽象類
public abstract class Animal {
public abstract void cry(); //抽象類沒有方法體
}
Test類:測(cè)試類
public class Test {
public static void main(String[] args) {
//匿名內(nèi)部類本質(zhì)是一個(gè)子類,同時(shí)會(huì)立即構(gòu)建一個(gè)子類對(duì)象
Animal c = new Animal() {
@Override
public void cry() {
System.out.println("貓喵喵喵~~(匿名你內(nèi)部類)");
}
}; //這里的分號(hào)不能忘。
c.cry();
}
}
/*
輸出結(jié)果:
貓喵喵喵~~(匿名你內(nèi)部類)
*/
上面代碼運(yùn)行產(chǎn)生的源碼:證明了匿名內(nèi)部類是一個(gè)子類。

2.匿名內(nèi)部類在開發(fā)中的常見形式
- 通常作為一個(gè)對(duì)象參數(shù)傳輸給方法。

3.匿名內(nèi)部類在開發(fā)中真實(shí)使用場(chǎng)景實(shí)例
調(diào)用別人提供的方法實(shí)現(xiàn)需求時(shí),這個(gè)方法正好可以讓我們傳輸一個(gè)匿名內(nèi)部類對(duì)象給其使用。
Test類
import javax.swing.*;
import java.awt.event.ActionEvent;
public class Test {
public static void main(String[] args) {
//目標(biāo):搞清楚幾個(gè)匿名內(nèi)部類的使用場(chǎng)景
//需求:創(chuàng)建一個(gè)登錄窗口,窗口上只有一個(gè)登錄按鈕
JFrame win = new JFrame();
win.setSize(300, 200);
win.setLocationRelativeTo(null); //居中顯示
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
win.add(panel);
JButton btn = new JButton("登錄");
panel.add(btn);
//Java要求必須傳輸給這個(gè)按鈕添加一個(gè)點(diǎn)擊事件監(jiān)視器對(duì)象,這個(gè)對(duì)象可以監(jiān)視用戶的點(diǎn)擊操作,就可以做出反應(yīng)
btn.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("登錄成功~");
}
});
win.setVisible(true);
}
}
案例2:對(duì)象數(shù)組排序
使用comparator接口的匿名內(nèi)部類實(shí)現(xiàn)對(duì)數(shù)組進(jìn)行排序
對(duì)象數(shù)組排序
import java.util.Arrays;
import java.util.Comparator;
public class Testt {
public static void main(String[] args) {
Student []s = new Student[5];
s[0] = new Student("張三", 18);
s[1] = new Student("李四", 19);
s[2] = new Student("張三", 50);
s[3] = new Student("李白", 5);
s[4] = new Student("王五", 10);
for (int i = 0; i < s.length; i++) {
System.out.println(s[i].getName() + " " + s[i].getAge());
}
Arrays.sort( s, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println("排序后:____________");
for (int i = 0; i < s.length; i++) {
System.out.println(s[i].getName() + " " + s[i].getAge());
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
jenkins-node節(jié)點(diǎn)配置方式解讀
Jenkins通過主從節(jié)點(diǎn)實(shí)現(xiàn)分布式構(gòu)建,支持負(fù)載均衡和特定環(huán)境任務(wù),配置包括標(biāo)簽匹配、啟動(dòng)方式、環(huán)境變量及工具管理,可參數(shù)化選擇節(jié)點(diǎn)執(zhí)行2025-08-08
從Maven到Spring Boot實(shí)戰(zhàn)教程
本文系統(tǒng)梳理了Java后端開發(fā)的核心技術(shù)棧,從Maven項(xiàng)目管理到Spring Boot實(shí)戰(zhàn),從MyBatis持久層到Spring MVC Web開發(fā),涵蓋了項(xiàng)目開發(fā)的全流程與關(guān)鍵知識(shí)點(diǎn),感興趣的朋友跟隨小編一起看看吧2025-11-11
Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題
這篇文章主要介紹了Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
javaweb學(xué)習(xí)總結(jié)——使用JDBC處理MySQL大數(shù)據(jù)
本篇文章主要介紹了JDBC處理MySQL大數(shù)據(jù),有時(shí)是需要用程序把大文本或二進(jìn)制數(shù)據(jù)直接保存到數(shù)據(jù)庫(kù)中進(jìn)行儲(chǔ)存的,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-11-11
java反射機(jī)制及beanUtils的實(shí)現(xiàn)原理分析
本文介紹了Java的反射機(jī)制、VO、DTO、PO的概念以及BeanUtils的實(shí)現(xiàn)原理和簡(jiǎn)單示例,通過反射可以在運(yùn)行時(shí)動(dòng)態(tài)操作類、方法和字段,BeanUtils用于在不同bean之間進(jìn)行屬性復(fù)制2024-12-12
Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作,結(jié)合實(shí)例形式分析了spring在bean銷毀之前的行為相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下2019-11-11
Spring 框架實(shí)現(xiàn)賬戶轉(zhuǎn)賬功能(推薦)
通過本文的介紹,我們了解了如何使用Spring框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的賬戶轉(zhuǎn)賬功能,主要使用了 Spring 的依賴注入、和事務(wù)管理功能,保證了轉(zhuǎn)賬操作的原子性和數(shù)據(jù)的一致性,感興趣的朋友跟隨小編一起看看吧2025-07-07

