JAVA抽象類,接口,內(nèi)部類詳解
一.內(nèi)容
抽象類
當(dāng)編寫一個(gè)類時(shí),常常會(huì)為該類定義一些方法,這些方法用于描述這個(gè)類的行為。但在某些情況下只需要定義出一些方法,而不需要具體的去實(shí)現(xiàn)這些行為。也就是說這些方法沒有方法體,只是一些簽名而已,這樣的方法被稱為抽象方法,包含抽象方法的類被稱為抽象類。
抽象方法與抽象類
抽象方法與抽象類必須使用abstract關(guān)鍵字進(jìn)行修飾,有抽象方法的類必須被定義成抽象類,抽象類里面可以沒有抽象方法。
抽象類與抽象方法的規(guī)則如下:
- 抽象類與抽象方法必須使用abstract關(guān)鍵字進(jìn)行修飾,抽象方法不能有方法體。
- 抽象類不能被實(shí)例化。即使抽象類不包含抽象方法,也不能被實(shí)例化
- 抽象類可以包含field、方法、構(gòu)造器、初始化塊、內(nèi)部類5種成分。
- 包含抽象方法的類,只能被定義成抽象類。
語法格式:抽象方法
【修飾符】 abstract 返回值類型 methodName(形參列表); //示例: public abstract void runWay();//定義一個(gè)行進(jìn)的方法
注意:抽象方法是沒有方法體,僅僅是一個(gè)方法聲明而已。所有Java要求其子類必須將父類中定義的抽象方法進(jìn)行實(shí)現(xiàn)。這也就意味著子類需要先將該方法繼承過來,所以修飾符也就只能是public或者protected。
示例代碼:抽象類定義
public abstract class Piece{}//定義一個(gè)棋子類
注意:抽象類不能實(shí)例化,只能被繼承,抽象類中可以沒有抽象方法,即使抽象類中沒有抽象方法也不能被實(shí)例化。
抽象類的使用
抽象類不能創(chuàng)建實(shí)例,只能當(dāng)成父類來被繼承。抽象類可以看成是從多個(gè)具體類中抽象出來的父類,它具有更高層次的抽象。從多個(gè)具有相同特征的類中抽象出來的一個(gè)抽象類,以這個(gè)抽象類作為其子類的模板,從而避免子類設(shè)計(jì)的隨意性。
抽象類的體現(xiàn)就是一種模板模式的設(shè)計(jì),抽象類作為多個(gè)子類的通用模板,子類在抽象類的基礎(chǔ)上進(jìn)行擴(kuò)展、改造,但子類總體上會(huì)保留抽象類的行為方式。
編寫一個(gè)抽象父類,父類提供了多個(gè)子類的通用方法,并把一個(gè)或多個(gè)方法留給其子類實(shí)現(xiàn),這就是一種模板模式,模板模式也是十分常見的設(shè)計(jì)模式。
示例代碼:
//定義抽象父類Piece
public abstract class Piece{
/**
*定義棋子的行進(jìn)方法
*/
public abstract void runWay();
/**
*定義棋子進(jìn)攻的方法
*/
public void attack() {
System.out.println("吃掉下面的棋子");
}
}
//Piece的子類Horse
public class Horse extends Piece{
/**
*實(shí)現(xiàn)父類中定義的抽象方法
*/
public void runWay() {
System.out.println("按照日字格行進(jìn)!");
}
}
//Piece的子類Cannon
public class Cannon extends Piece{
/**
*實(shí)現(xiàn)父類中定義的抽象方法
*/
public void runWay() {
System.out.println("按照直線方式行進(jìn)!");
}
}
模板模式在面向?qū)ο蟮能浖泻艹S茫湓砗唵?,?shí)現(xiàn)也很簡單。使用模板模式有如下規(guī)則:抽象父類可以只定義需要使用的方法,把不能實(shí)現(xiàn)的部分抽象成抽象方法留給子類去實(shí)現(xiàn)。
接口
抽象類是從多個(gè)類中抽象出來的模板,如果將這種抽象進(jìn)行得更徹底,則可以提煉出一種更加特殊的“抽象類”——接口(interface)。接口里不能包含普通方法,接口里的所有方法都是抽象方法。接口里面可以放:常量,抽象方法,默認(rèn)方法,靜態(tài)方法,私有化方法
接口的概念
Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。
接口的定義
接口和類定義不同,定義接口不在使用class關(guān)鍵字,而是使用interface關(guān)鍵字。
語法格式如下:
【public】interface 接口名 extends 父接口1,父接口2{
//零到多個(gè)常量定義
//零到多個(gè)抽象方法定義
}
語法分析:
- 修飾符可以是public或者protected,大多數(shù)是使用public,protected省略采用默認(rèn)包權(quán)限訪問控制符。
- 接口名應(yīng)與類名采用相同的命名規(guī)則。
- 一個(gè)接口可以有多個(gè)直接父接口,但接口只能繼承接口,不能繼承類。
接口中的成員變量
接口定義的是一種規(guī)范,因此接口里不能包含構(gòu)造器和初始化塊定義。接口里可以包含field、方法、內(nèi)部類定義。因?yàn)榻涌跊]有構(gòu)造器與初始化塊,因此系統(tǒng)不能為field進(jìn)行默認(rèn)的初始化操作,只能由程序編寫人員為field指定默認(rèn)的值,所以field只能是常量。又因?yàn)閒ield只能是常量,所以系統(tǒng)自動(dòng)為這些field增加了static和final兩個(gè)修飾符。也就是說在接口中定義的Field不管是否使用了public static final修飾符,接口里的Field總是默認(rèn)使用public static final修飾符來進(jìn)行修飾,不可更改。
示例代碼
interface DBobjectType{
//對(duì)于在接口中定義的成員變量,用或不用public static final,意義都是相同的
public static final int ROOT=0;
public static final int DATABASE=1;
int TABLE=2;
int COLUMN=3;
int INDEX=4;
}
接口中的方法
接口里定義的方法都是抽象方法,因此系統(tǒng)會(huì)自動(dòng)為方法增加public abstract修飾符。因此不管定義接口方法時(shí)是否使用了public abstract修飾符,系統(tǒng)都會(huì)默認(rèn)方法使用public abstract修飾符來進(jìn)行修飾。
示例代碼:
public interface DataConnection{
/**
*定義獲取數(shù)據(jù)庫連接的方法*/
public abstract void getConnection();
/**
*定義關(guān)閉數(shù)據(jù)庫連接的方法,在接口中是否使用public abstract意義相同*/
void close();
}
接口的繼承
接口的繼承與類的繼承不一樣,接口完全支持多繼承,即一個(gè)接口可以有多個(gè)直接父接口。和繼承相似,子接口擴(kuò)展父接口,將會(huì)獲得父接口里定義的所有抽象方法、field、內(nèi)部類和枚舉定義。
一個(gè)接口繼承多個(gè)父接口時(shí),多個(gè)父接口排在extends關(guān)鍵字之后,多個(gè)父接口之間使用英文逗號(hào)(,)進(jìn)行分隔。
示例代碼:
public interface InterA{//定義接口A
void a();
}
public interface InterB{//定義接口B
void b();
}
public interface Inter extends InterA,InterB{//定義接口Inter繼承A、B
voidc();
}
接口的實(shí)現(xiàn)/使用
接口不能用于創(chuàng)建實(shí)例,但接口可以用于聲明引用類型變量。當(dāng)使用接口來聲明引用類型變量時(shí),這個(gè)引用類型變量必須引用到其實(shí)現(xiàn)類的對(duì)象。除此之外,接口的主要用途就是被實(shí)現(xiàn)類進(jìn)行實(shí)現(xiàn)。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,繼承使用extends關(guān)鍵字,而實(shí)現(xiàn)則使用implements關(guān)鍵字。
單繼承多實(shí)現(xiàn)
示例代碼:
public interface InterA {
void a();
}
public class InterAImpl implements InterA
{
@Override
public void a(){
System.out.println("將接口InterA中定義的抽象方法進(jìn)行實(shí)現(xiàn)!");
}
}
實(shí)現(xiàn)接口與繼承類相似,一樣可以獲得所實(shí)現(xiàn)接口里定義的常量field、抽象方法、內(nèi)部類和枚舉類定義。讓類實(shí)現(xiàn)接口需要在類定義后面增加implements部分,當(dāng)需要實(shí)現(xiàn)多個(gè)接口時(shí),多個(gè)接口之間以英文逗號(hào)(,)隔開。一個(gè)類可以繼承一個(gè)父類并同時(shí)實(shí)現(xiàn)多個(gè)接口,implements部分必須放在extends部分之后。
示例代碼:
public interface DBobjectType {
public static final int ROOT =0;
public static final int DATABASE =1;
int TABLE=2;
int COLUMN=3;
int INDEX=4;
}
public interface DataConnection{
/**
*定義獲取數(shù)據(jù)庫連接的方法
*/
public abstract void getConnection();
/**
*定義關(guān)閉數(shù)據(jù)庫連接的方法,在接口中是否使用publicabstract意義相同
*/
void close();
}
public class ConnectionImpl implements
DBobjectType,DataConnection {
@Override
public void getConnection() {
System.out.println("獲取一個(gè)連接對(duì)象!");
}
@Override
public void close() {
System.out.println("將連接進(jìn)行關(guān)閉!");
}
public static void main(String[]args){
ConnectionImpl impl=new ConnectionImpl();
//直接使用從DBobjectType繼承過來的成員變量定義
System.out.println("數(shù)據(jù)對(duì)象類型:"+ConnectionImpl.ROOT);
impl.getConnection();
}
}
一個(gè)類實(shí)現(xiàn)了一個(gè)或多個(gè)接口之后,這個(gè)類必須完全實(shí)現(xiàn)這些接口里所定義的全部抽象方法,否則該類將保留從父接口那里繼承到的抽象方法,該類也必須定義成抽象類。
接口與抽象類的差異
1、接口和抽象類都不能進(jìn)行實(shí)例化,它們都位于繼承樹的頂端,用于被其他類實(shí)現(xiàn)和繼承。
2、接口和抽象類都可以包含抽象方法,實(shí)現(xiàn)接口或繼承抽象類的普通子類都必須實(shí)現(xiàn)這些抽象方法。
接口作為系統(tǒng)與外界交互的窗口,接口體現(xiàn)的是一種規(guī)范。對(duì)于接口的實(shí)現(xiàn)者而言,接口規(guī)定了實(shí)現(xiàn)者必須向外提供哪些服務(wù)。對(duì)于接口的調(diào)用者而言,接口規(guī)定了調(diào)用者可以調(diào)用哪些服務(wù)。當(dāng)在一個(gè)程序中使用接口時(shí),接口是多個(gè)模塊間的耦合標(biāo)準(zhǔn),當(dāng)在多個(gè)應(yīng)用程序之間使用接口時(shí),接口是多個(gè)程序之間的通信標(biāo)準(zhǔn)。
接口類似于系統(tǒng)的總綱,一旦接口發(fā)生變化,對(duì)于整個(gè)系統(tǒng)是輻射式的,所有實(shí)現(xiàn)這個(gè)接口的普通類都要進(jìn)行改寫。
分析:JDBC編程是后面需要給大家講到的數(shù)據(jù)庫編程,在此示例中不涉及到具體代碼,只看結(jié)構(gòu)圖。Java程序不可能為行業(yè)內(nèi)使用個(gè)各種數(shù)據(jù)庫都提供一套連接方式。它只會(huì)提供一套標(biāo)準(zhǔn)的接口,告訴數(shù)據(jù)庫生產(chǎn)廠商應(yīng)該提供哪些實(shí)現(xiàn)。所以不同的數(shù)據(jù)庫生產(chǎn)廠商需要將Java提出的接口進(jìn)行底層的實(shí)現(xiàn),當(dāng)我們需要進(jìn)行JDBC編程時(shí),只需要將不同數(shù)據(jù)庫生產(chǎn)廠商提供的JAR包導(dǎo)入進(jìn)來,按照接口的方式進(jìn)行編程即可
抽象類則不一樣,抽象類作為系統(tǒng)中多個(gè)子類的共同父類,它所體現(xiàn)的是一種模版式設(shè)計(jì)。抽象類作為多個(gè)子類的抽象父類,可以被當(dāng)成系統(tǒng)實(shí)現(xiàn)過程中的中間產(chǎn)品。這個(gè)中間產(chǎn)品已經(jīng)實(shí)現(xiàn)了系統(tǒng)的部分功能,但這個(gè)類不能稱為最終產(chǎn)品,必須有更進(jìn)一步的完善,這種完善可能有幾種不同的方式來實(shí)現(xiàn)。
接口與抽象類在用法上也存在如下差異:
- 接口里只能包含抽象方法,不包含已經(jīng)提供實(shí)現(xiàn)的方法,抽象類則完全可以包含普通方法。
- 接口和抽象類里都可以定義靜態(tài)方法。
- 接口里只能定義靜態(tài)常量Field,不能定義普通的Field,抽象類里則都可以。
- 接口里不包含構(gòu)造器,抽象類里可以包含構(gòu)造器,抽象類里的構(gòu)造器并不是用來創(chuàng)建對(duì)象,而是讓其子類調(diào)用這些構(gòu)造器完成屬于抽象類的初始化操作。
- 接口里不能包含初始化塊,但抽象類則完全可以包含初始化塊。
- 一個(gè)類最多只有一個(gè)父類,包括抽象類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
面向接口編程
接口體現(xiàn)的是一種規(guī)范和實(shí)現(xiàn)分離的設(shè)計(jì)模式,充分利用接口可以很好降低程序各模塊之間的耦合,從而提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。
基于這種原則,軟件架構(gòu)設(shè)計(jì)理論都倡導(dǎo)“面向接口”編程,而不是面向?qū)崿F(xiàn)類編程,希望通過面向接口編程來降低程序的耦合。下面使用數(shù)據(jù)庫編程這種場景來示范面向接口編程的優(yōu)勢。
//定義接口規(guī)范
public interface DataConnection{
/**
*定義獲取數(shù)據(jù)庫連接的方法*/
public abstract void getConnection();
/**
*定義關(guān)閉數(shù)據(jù)庫連接的方法
*/
public abstract void close();
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類MySql
public class MySqlConnection implements DataConnection {
@Override
public void getConnection() {
System.out.println("獲取MySql數(shù)據(jù)庫的連接。。。");
}
@Override
public void close() {
System.out.println("關(guān)閉MySql數(shù)據(jù)庫的連接。。。");
}
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類Oracle
public class OracleConnection implements DataConnection {
@Override
public void getConnection(){
System.out.println("獲取Oracle數(shù)據(jù)庫的連接。。。");
}
@Override
public void close() {
System.out.println("關(guān)閉Oracle數(shù)據(jù)庫的連接。。。");
}
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類SqlServer
public class SqlServerConnection implements DataConnection {
@Override
public void getConnection() {
System.out.println("獲取SqlServer數(shù)據(jù)庫的連接。。。");
}
@Override
public void close() {
System.out.println("關(guān)閉SqlServer數(shù)據(jù)庫的連接。。。");
}
}
內(nèi)部類
在定義類的時(shí)候,我們一般把類定義成一個(gè)獨(dú)立的程序單元。但是在某些情況下,我們會(huì)把一個(gè)類放在另一個(gè)類的內(nèi)部定義,這個(gè)定義在其他類內(nèi)部的類就被稱為內(nèi)部類,也可以稱為嵌套類。包含內(nèi)部類的類也被稱為外部類,也可以稱為宿主類。Java從JDK1.1開始引入內(nèi)部類,內(nèi)部類的主要作用如下:
- 內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中其他類訪問該類。
- 內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因?yàn)閮?nèi)部類被當(dāng)成外部類的成員,同一個(gè)類成員之間可以相互訪問。
- 匿名內(nèi)部類適合用于創(chuàng)建那些僅需要一次使用的類。
非靜態(tài)內(nèi)部類
定義內(nèi)部類非常簡單,只要把一個(gè)類放在另一個(gè)類內(nèi)部定義即可。此處的“內(nèi)部類”包括類中的任何位置,甚至在方法中也可以定義內(nèi)部類,在方法中定義的內(nèi)部類叫做局部內(nèi)部類。
通常情況下,內(nèi)部類都被作為成員內(nèi)部類定義,而不是作為局部內(nèi)部類。成員內(nèi)部類是一種與成員field、成員方法、構(gòu)造方法和初始化塊相同級(jí)別的類成員。
成員內(nèi)部類分為:靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類兩種,使用static修飾的成員內(nèi)部類就是靜態(tài)內(nèi)部類,沒有使用static修飾的成員內(nèi)部類就是非靜態(tài)內(nèi)部類。
因?yàn)閮?nèi)部類作為其外部類的成員,所以可以使用任意訪問控制符:private、protected、public修飾的Field成員。
示例代碼:
public class DiningRoom {
private String egg="雞蛋";
class Cook {
public void makeFood() {
//使用了外部類DiningRoom中定義的私有成員egg
System.out.println("廚師使用"+egg+",做了一份炒雞蛋!");
}
}
/**
*DiningRoom類對(duì)外提供的做炒雞蛋的功能*實(shí)際該功能是由內(nèi)部類Cook來執(zhí)行的
*/
public void fireEgg(){
new Cook().makeFood();
}
}
代碼優(yōu)化
假設(shè)內(nèi)部類Cook提供了多個(gè)方法,而外部類中定義的多個(gè)方法又多次用到了Cook中提供的方法,那么類似上述示例中的調(diào)用方式,就會(huì)每次調(diào)用都會(huì)創(chuàng)建一個(gè)Cook的對(duì)象,用完即丟棄了,造成了程序上性能的降低。像這種情況我們就可以在父類DiningRoom中定義Cook的成員變量即可。
public class DiningRoom {
private String egg="雞蛋";
private Cook cook=new Cook();
class Cook {
public void makeFood() {
//使用了外部類DiningRoom中定義的私有成員egg
System.out.println("廚師使用"+egg+",做了一份炒雞蛋!");
}
}
/**
*DiningRoom類對(duì)外提供的做炒雞蛋的功能*實(shí)際該功能是由內(nèi)部類Cook來執(zhí)行的
*/
public void fireEgg(){
this.cook.makeFood();
}
}
分析:通過代碼的改寫,那么即使父類DiningRoom中的多個(gè)方法多次調(diào)用Cook類中定義的方法時(shí),也只會(huì)創(chuàng)建Cook的一個(gè)對(duì)象,而不是多個(gè)對(duì)象。
靜態(tài)內(nèi)部類
使用static修飾符來修飾內(nèi)部類就稱為靜態(tài)內(nèi)部類,則這個(gè)內(nèi)部類就屬于外部類本身,而不屬于外部類的某個(gè)對(duì)象。因此使用static修飾的內(nèi)部類被稱為靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員。根據(jù)靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,靜態(tài)內(nèi)部類不能訪問外部類的實(shí)例成員,只能訪問外部類的類成員。即使是靜態(tài)內(nèi)部類的實(shí)例方法也不能訪問外部類的實(shí)例成員,只能訪問外部類的靜態(tài)成員。
示例代碼:
public class Factory {
public static String noodle="面條";
public static String dumplings="水餃";
private String chicken="雞肉";
public void madamFood(String food){
System.out.println("廠長吃的是自己夫人做的飯!"+food);
}
public static void diningFood(String food){
System.out.println("工人吃的是食堂做的飯!"+food);
}
static class DiningRoom {
public static void eat(){
diningFood(Factory.noodle);
}
public void managerEat() {
//編譯報(bào)錯(cuò),在靜態(tài)內(nèi)部類中,即使是非靜態(tài)的成員
//也不能訪問外部類的非靜態(tài)的成員
madamFood("abc");
}
}
}
分析:在上述示例中,靜態(tài)內(nèi)部類DiningRoom在進(jìn)行編譯時(shí)報(bào)錯(cuò),提示對(duì)象的實(shí)例上調(diào)用了不在范圍內(nèi)的數(shù)據(jù)信息。因?yàn)殪o態(tài)內(nèi)部類會(huì)跟隨外部類的靜態(tài)的信息同時(shí)存在,此時(shí)可以創(chuàng)建靜態(tài)內(nèi)部類的實(shí)例對(duì)象,但是并不一定會(huì)創(chuàng)建外部類的實(shí)例對(duì)象,那么去訪問外部類實(shí)例對(duì)象的成員就會(huì)出問題,因?yàn)閷?duì)象都沒有,怎么訪問對(duì)象上的成員呢?
局部內(nèi)部類
如果把一個(gè)內(nèi)部類定義在方法里面定義,則這個(gè)內(nèi)部類就是一個(gè)局部內(nèi)部類。
示例代碼:
public void run() {
//定義一個(gè)局部內(nèi)部類,作用范圍更小,在方法外根本無法訪問
class InnerTest {
public int num2=5;
public void run(){
System.out.println(num2);
}
}
InnerTest it=new InnerTest();
it.run();
}
匿名內(nèi)部類
匿名內(nèi)部類的語法有些特別,創(chuàng)建匿名內(nèi)部類時(shí)會(huì)立即創(chuàng)建一個(gè)該類的實(shí)例,這個(gè)類定義立即消失,匿名內(nèi)部類不能重復(fù)使用。因此匿名內(nèi)部類適合創(chuàng)建那種只需要一次使用的類。
語法格式:
new 父類構(gòu)造器|實(shí)現(xiàn)接口 (){
//匿名內(nèi)部類的類體部分
}
匿名內(nèi)部類必須繼承一個(gè)父類,或?qū)崿F(xiàn)一個(gè)接口,但最多只能繼承一個(gè)父類,實(shí)現(xiàn)一個(gè)接口。
- 匿名內(nèi)部類不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類時(shí),會(huì)立即創(chuàng)建匿名內(nèi)部類的對(duì)象。
- 匿名內(nèi)部類不能定義構(gòu)造器,因?yàn)槟涿麅?nèi)部類沒有類名,也就無法定義構(gòu)造器,但是匿名內(nèi)部類可以定義實(shí)例初始化塊,通過初始化塊來完成初始化操作。
在Java的類庫中,有很多非常有用的工具類提供了大量的底層操作,可以讓程序開發(fā)人員能夠快速的進(jìn)行軟件的業(yè)務(wù)邏輯開發(fā),而不用去關(guān)注底層的實(shí)現(xiàn)。但是有些方法確實(shí)需要接收一些參數(shù)的,而這些參數(shù)都是接口類型,當(dāng)程序開發(fā)人員調(diào)用此方法時(shí),就必須要提供該接口的一個(gè)實(shí)現(xiàn)類,再去創(chuàng)建該實(shí)現(xiàn)類的對(duì)象才能去調(diào)用那些方法。
如果僅僅是為了調(diào)用某個(gè)方法,就為此去創(chuàng)建一個(gè)新的類就有點(diǎn)得不償失了。因此Java提供了匿名內(nèi)部類的方式可以非常有效的解決此類問題。
示例代碼:
public class Test {
public static void main(String[]args) {
Integer [] nums={1,3,10,21,14,5,27};
//sort方法需要接收一個(gè)Comparator排序器對(duì)象,Comparator是接口類型
Arrays.sort (nums,new Comparator <Integer>(){
@Override
public int compare (Integer int1,Integer int2){
if(int1>int2){
return-1;
}else {
return1;
}
}
});
System.out.println(Arrays.toString(nums));
}
}
代碼分析:Comparator<T>是一個(gè)排序器接口,用于進(jìn)行兩個(gè)數(shù)據(jù)之間的比較,數(shù)據(jù)類型需要通過<>這種方式在其中定義出來,compare就是接口中定義的方法,如果大于返回1,小于返回1,等于返回0。就是普通的升序排序,而如果反過來就是降序排序。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解
這篇文章主要介紹了IDEA調(diào)試小技巧之Evaluate調(diào)試工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例
這篇文章主要為大家介紹了RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-08-08
Spring?Boot?4.0對(duì)于Java開發(fā)的影響和前景
探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來可能性!別錯(cuò)過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?2024-02-02
springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能
本文分步驟給大家介紹springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09
使用Java反射模擬實(shí)現(xiàn)Spring的IoC容器的操作
這篇文章主要介紹了使用Java反射模擬實(shí)現(xiàn)Spring的IoC容器的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
使用Swagger2實(shí)現(xiàn)自動(dòng)生成RESTful?API文檔
在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動(dòng)生成?RESTful?API?文檔,需要的可以參考一下2023-06-06
SpringBoot項(xiàng)目加載配置文件的6種方式小結(jié)
這篇文章給大家總結(jié)了六種SpringBoot項(xiàng)目加載配置文件的方式,通過@value注入,通過@ConfigurationProperties注入,通過框架自帶對(duì)象Environment實(shí)現(xiàn)屬性動(dòng)態(tài)注入,通過@PropertySource注解,yml外部文件,Java原生態(tài)方式注入這六種,需要的朋友可以參考下2023-09-09

