最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java干貨知識(shí)深入理解內(nèi)部類

 更新時(shí)間:2019年06月19日 14:52:57   作者:dengchengchao_  
這篇文章主要介紹了Java干貨知識(shí)深入理解內(nèi)部類,定義在另一個(gè)類或方法中的類就叫做內(nèi)部類,需要的朋友可以參考下

前言

說起內(nèi)部類,大家并不陌生,并且會(huì)經(jīng)常在實(shí)例化容器的時(shí)候使用到它。但是內(nèi)部類的具體細(xì)節(jié)語法,原理以及實(shí)現(xiàn)是什么樣的可以不少人都還挺陌生,這里作一篇總結(jié),希望通過這篇總結(jié)提高對(duì)內(nèi)部類的認(rèn)識(shí)。

內(nèi)部類是什么?

由文章開頭可知,內(nèi)部類的定義為:定義在另一個(gè)類或方法中的類。而根據(jù)使用場(chǎng)景的不同,內(nèi)部類還可以分為四種:成員內(nèi)部類,局部內(nèi)部類,匿名內(nèi)部類和靜態(tài)內(nèi)部類。每一種的特性和注意事項(xiàng)都不同,下面我們一一說明。

成員內(nèi)部類

顧名思義,成員內(nèi)部類是定義在類內(nèi)部,作為類的成員的類。如下:

public class Outer {
public class Inner{
}
}

特點(diǎn)如下:

  • 成員內(nèi)部類可以被權(quán)限修飾符(eg. public,private等)所修飾
  • 成員內(nèi)部類可以訪問外部類的所有成員,(包括private)成員
  • 成員內(nèi)部類是默認(rèn)包含了一個(gè)指向外部類對(duì)象的引用
  • 如同使用this一樣,當(dāng)成員名或方法名發(fā)生覆蓋時(shí),可以使用外部類的名字加.this指定訪問外部類成員。如:Outer.this.name
  • 成員內(nèi)部類不可以定義static成員
  • 成員內(nèi)部類創(chuàng)建語法:
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();

局部內(nèi)部類

局部內(nèi)部類是定義在方法或者作用域中類,它和成員內(nèi)部類的區(qū)別僅在于訪問權(quán)限的不同。

public class Outer{
public void test(){
class Inner{
}
}
}

特點(diǎn)如下:

  • 局部內(nèi)部類不能有訪問權(quán)限修飾符
  • 局部內(nèi)部類不能被定義為static
  • 局部內(nèi)部類不能定義static成員
  • 局部內(nèi)部類默認(rèn)包含了外部類對(duì)象的引用
  • 局部內(nèi)部類也可以使用Outer.this語法制定訪問外部類成員
  • 局部內(nèi)部類想要使用方法或域中的變量,該變量必須是final的

在JDK1.8 以后,沒有final修飾,effectively final的即可。什么意思呢?就是沒有final修飾,但是如果加上final編譯器也不會(huì)報(bào)錯(cuò)即可。

匿名內(nèi)部類

匿名內(nèi)部類是與繼承合并在一起的沒有名字的內(nèi)部類

public class Outer{
public List<String> list=new ArrayList<String>(){
{
add("test");
}
};
}

這是我們平時(shí)最常用的語法。

匿名內(nèi)部類的特點(diǎn)如下:

  • 匿名內(nèi)部類使用單獨(dú)的塊表示初始化塊{}
  • 匿名內(nèi)部類想要使用方法或域中的變量,該變量必須是final修飾的,JDK1.8之后effectively final也可以
  • 匿名內(nèi)部類默認(rèn)包含了外部類對(duì)象的引用
  • 匿名內(nèi)部類表示繼承所依賴的類

嵌套類

嵌套類是用static修飾的成員內(nèi)部類

public class Outer {
public static class Inner{
}
}

特點(diǎn)如下:

  • 嵌套類是四種類中唯一一個(gè)不包含對(duì)外部類對(duì)象的引用的內(nèi)部類
  • 嵌套類可以定義static成員
  • 嵌套類能訪問外部類任何靜態(tài)數(shù)據(jù)成員與方法。

構(gòu)造函數(shù)可以看作靜態(tài)方法,因此可以訪問。

為什么要有內(nèi)部類?

從上面可以看出,內(nèi)部類的特性和類方差不多,但是內(nèi)部類有許多繁瑣的細(xì)節(jié)語法。既然內(nèi)部類有這么多的細(xì)節(jié)要注意,那為什么Java還要支持內(nèi)部類呢?
1. 完善多重繼承

1.在早期C++作為面向?qū)ο缶幊陶Z言的時(shí)候,最難處理的也就是多重繼承,多重繼承對(duì)于代碼耦合度,代碼使用人員的理解來說,并不怎么友好,并且還要比較出名的死亡菱形的多重繼承問題。因此Java并不支持多繼承。

2.后來,Java設(shè)計(jì)者發(fā)現(xiàn),沒有多繼承,一些代碼友好的設(shè)計(jì)與編程問題變得十分難以解決。于是便產(chǎn)生了內(nèi)部類。內(nèi)部類具有:隱式包含外部類對(duì)象并且能夠與之通信的特點(diǎn),完美的解決了多重繼承的問題。

2. 解決多次實(shí)現(xiàn)/繼承問題

1.有時(shí)候在一個(gè)類中,需要多次通過不同的方式實(shí)現(xiàn)同一個(gè)接口,如果沒有內(nèi)部類,必須多次定義不同數(shù)量的類,但是使用內(nèi)部類可以很好的解決這個(gè)問題,每個(gè)內(nèi)部類都可以實(shí)現(xiàn)同一個(gè)接口,即實(shí)現(xiàn)了代碼的封裝,又實(shí)現(xiàn)了同一接口不同的實(shí)現(xiàn)。

2.內(nèi)部類可以將組合的實(shí)現(xiàn)封裝在內(nèi)部中。

為什么內(nèi)部類的語法這么繁雜

這一點(diǎn)是本文的重點(diǎn)。內(nèi)部類語法之所以這么繁雜,是因?yàn)樗切聰?shù)據(jù)類型加語法糖的結(jié)合。想要理解內(nèi)部類,還得從本質(zhì)上出發(fā).

內(nèi)部類根據(jù)應(yīng)用場(chǎng)景的不同分為4種。其應(yīng)用場(chǎng)景完全可以和類方法對(duì)比起來。
下面我們通過類方法對(duì)比的模式一一解答為什么內(nèi)部類會(huì)有這樣的特點(diǎn)

成員內(nèi)部類——>成員方法

成員內(nèi)部類的設(shè)計(jì)完全和成員方法一樣。

調(diào)用成員方法:outer.getName()

新建內(nèi)部類對(duì)象:outer.new Inner()

它們都是要依賴對(duì)象而被調(diào)用。

正如《Thinking in Java》所說,outer.getName()正真的形似是Outer.getName(outer),也就是將調(diào)用對(duì)象作為參數(shù)傳遞給方法。

新建一個(gè)內(nèi)部類也是這樣:Outer.new Inner(outer)
下面,我們用實(shí)際情況證明:

新建一個(gè)包含內(nèi)部類的類:

public class Outer {
private int m = 1;
public class Inner {
private void test() {
//訪問外部類private成員
System.out.println(m);
}
}
}

編譯,會(huì)發(fā)現(xiàn)會(huì)在編譯目標(biāo)目錄生成兩個(gè).class文件:Outer.class和Outer$Inner.class。

PS:不知道為什么Java總是和過不去,就連變量命名規(guī)則都要比C++多一個(gè)能由組成 :)

將Outer$Inner.class放入IDEA中打開,會(huì)自動(dòng)反編譯,查看結(jié)果:

public class Outer$Inner {
public Outer$Inner(Outer this$0) {
this.this$0 = this$0;
}
private void test() {
System.out.println(Outer.access$000(this.this$0));
}
}

可以看見,編譯器已經(jīng)自動(dòng)生成了一個(gè)默認(rèn)構(gòu)造器,這個(gè)默認(rèn)構(gòu)造器是一個(gè)帶有外部類型引用的參數(shù)構(gòu)造器。

可以看到外部類成員對(duì)象的引用:Outer是由final修飾的。

因此:

  1. 成員內(nèi)部類作為類級(jí)成員,因此能被訪問修飾符所修飾
  2. 成員內(nèi)部類中包含創(chuàng)建內(nèi)部類時(shí)對(duì)外部類對(duì)象的引用,所以成員內(nèi)部類能訪問外部類的所有成員。
  3. 語法規(guī)定:因?yàn)樗鳛橥獠款惖囊徊糠殖蓡T,所以即使private的對(duì)象,內(nèi)部類也能訪問。。通過Outer.access$ 指令訪問
  4. 如同非靜態(tài)方法不能訪問靜態(tài)成員一樣,非靜態(tài)內(nèi)部類也被設(shè)計(jì)的不能擁有靜態(tài)變量,因此內(nèi)部類不能定義static對(duì)象和方法。

但是可以定義static final變量,這并不沖突,因?yàn)樗x的final字段必須是編譯時(shí)確定的,而且在編譯類時(shí)會(huì)將對(duì)應(yīng)的變量替換為具體的值,所以在JVM看來,并沒有訪問內(nèi)部類。

局部內(nèi)部類——> 局部代碼塊

局部內(nèi)部類可以和局部代碼塊相理解。它最大的特點(diǎn)就是只能訪問外部的final變量。
先別著急問為什么。

定義一個(gè)局部內(nèi)部類:

public class Outer {
private void test() {
int m= 3;
class Inner {
private void print() {
System.out.println(m);
}
}
}
}

編譯,發(fā)現(xiàn)生成兩個(gè).class文件Outer.class和Outer$1Inner.class
將Outer$1Inner.class放入IDEA中反編譯:

class Outer$1Inner {
Outer$1Inner(Outer this$0, int var2) {
this.this$0 = this$0;
this.val$m = var2;
}
private void print() {
System.out.println(this.val$m);
}
}

可以看見,編譯器自動(dòng)生成了帶有兩個(gè)參數(shù)的默認(rèn)構(gòu)造器。

看到這里,也許應(yīng)該能明了:我們將代碼轉(zhuǎn)換下:

public class Outer {
private void test() {
int m= 3;
Inner inner=new Outer$1Inner(this,m);
inner.print();
}
}
}

也就是在Inner中,其實(shí)是將m的值,拷貝到內(nèi)部類中的。print()方法只是輸出了m,如果我們寫出了這樣的代碼:

private void test() {
int m= 3;
class Inner {
private void print() {
m=4;
}
}
System.out.println(m); 
}

在我們看來,m的值應(yīng)該被修改為4,但是它真正的效果是:

private void test(){
int m = 3;
print(m);
System.out.println(m);
}
private void print(int m){
m=4;
}

m被作為參數(shù)拷貝進(jìn)了方法中。因此修改它的值其實(shí)沒有任何效果,所以為了不讓程序員隨意修改m而卻沒達(dá)到任何效果而迷惑,m必須被final修飾。
繞了這么大一圈,為什么編譯器要生成這樣的效果呢?

其實(shí),了解閉包的概念的人應(yīng)該都知道原因。而Java中各種詭異的語法一般都是由生命周期帶來的影響。上面的程序中,m是一個(gè)局部變量,它被定義在棧上,而new Outer$1Inner(this,m);所生成的對(duì)象,是定義在堆上的。如果不將m作為成員變量拷貝進(jìn)對(duì)象中,那么離開m的作用域,Inner對(duì)象所指向的便是一個(gè)無效的地址。因此,編譯器會(huì)自動(dòng)將局部類所使用的所有參數(shù)自動(dòng)生成成員。

為什么其他語言沒有這種現(xiàn)象呢?

這又回到了一個(gè)經(jīng)典的問題上:Java是值傳遞還是引用傳遞。由于Java always pass-by-value,對(duì)于真正的引用,Java是無法傳遞過去的。而上面的問題核心就在與m如果被改變了,那么其它的m的副本是無法感知到的。而其他語言都通過其他的途徑解決了這個(gè)問題。

對(duì)于C++就是一個(gè)指針問題。

理解了真正的原因,便也能知道什么時(shí)候需要final,什么時(shí)候不需要final了。

public class Outer {
private void test() {
class Inner {
int m=3;
private void print() {
System.out.println(m);//作為參數(shù)傳遞,本身都已經(jīng) pass-by-value。不用final
int c=m+1; //直接使用m,需要加final
}
}
}
}

而在Java 8 中,已經(jīng)放寬政策,允許是effectively final的變量,實(shí)際上,就是編譯器在編譯的過程中,幫你加上final而已。而你應(yīng)該保證允許編譯器加上final后,程序不報(bào)錯(cuò)。

局部內(nèi)部類還有個(gè)特點(diǎn)就是不能有權(quán)限修飾符。就好像局部變量不能有訪問修飾符一樣

由上面可以看到,外部對(duì)象同樣是被傳入局部類中,因此局部類可以訪問外部對(duì)象

嵌套類——>靜態(tài)方法

嵌套類沒什么好說的,就好像靜態(tài)方法一樣,他可以被直接訪問,他也能定義靜態(tài)變量。同時(shí)不能訪問非靜態(tài)成員。
值得注意的是《Think in Java》中說過,可以將構(gòu)造函數(shù)看作為靜態(tài)方法,因此嵌套類可以訪問外部類的構(gòu)造方法。

匿名類——>局部方法+繼承的語法糖

匿名類可以看作是對(duì)前3種類的再次擴(kuò)展。具體來說匿名類根據(jù)應(yīng)用場(chǎng)景可以看作:

  • 成員內(nèi)部類+繼承
  • 局部內(nèi)部類+繼承
  • 嵌套內(nèi)部類+繼承

匿名類語法為:

new 繼承類名(){
//Override 重載的方法 
}

返回的結(jié)果會(huì)向上轉(zhuǎn)型為繼承類。

聲明一個(gè)匿名類:

public class Outer {
private List<String> list=new ArrayList<String>(){
{
add("test");
}
};
}

這便是一個(gè)經(jīng)典的匿名類用法。

同樣編譯上面代碼會(huì)看到生成了兩個(gè).class文件Outer.class,Outer$1.class

將Outer$1.class放入IDEA中反編譯:

class Outer$1 extends ArrayList<String> {
Outer$1(Outer this$0) {
this.this$0 = this$0;
this.add("1");
}
}

可以看到匿名類的完整語法便是繼承+內(nèi)部類。

由于匿名類可以申明為成員變量,局部變量,靜態(tài)成員變量,因此它的組合便是幾種內(nèi)部類加繼承的語法糖,這里不一一證明。

在這里值得注意的是匿名類由于沒有類名,因此不能通過語法糖像正常的類一樣聲明構(gòu)造函數(shù),但是編譯器可以識(shí)別{},并在編譯的時(shí)候?qū)⒋a放入構(gòu)造函數(shù)中。

{}可以有多個(gè),會(huì)在生成的構(gòu)造函數(shù)中按順序執(zhí)行。

怎么正確的使用內(nèi)部類

在第二小節(jié)中,我們已經(jīng)討論過內(nèi)部類的應(yīng)用場(chǎng)景,但是如何優(yōu)雅,并在正確的應(yīng)用場(chǎng)景使用它呢?本小節(jié)將會(huì)詳細(xì)討論。

1.注意內(nèi)存泄露

《Effective Java》第二十四小節(jié)明確提出過。優(yōu)先使用靜態(tài)內(nèi)部類。這是為什么呢?

由上面的分析我們可以知道,除了嵌套類,其他的內(nèi)部類都隱式包含了外部類對(duì)象。這便是Java內(nèi)存泄露的源頭??创a:

定義Outer:

public class Outer{
public List<String> getList(String item) {
return new ArrayList<String>() {
{
add(item);
}
};
}
}

使用Outer:

public class Test{
public static List<String> getOutersList(){
Outer outer=new Outer();
//do something
List<String> list=outer.getList("test");
return list; 
}
public static void main(String[] args){
List<String> list=getOutersList();
//do something with list
}
}

相信這樣的代碼一定有同學(xué)寫出來,這涉及到一個(gè)習(xí)慣的問題:

不涉及到類成員方法和成員變量的方法,最好定義為static

我們先研究上面的代碼,最大的問題便是帶來的內(nèi)存泄露:

在使用過程中,我們定義Outer對(duì)象完成一系列的動(dòng)作

  • 使用outer得到了一個(gè)ArraList對(duì)象
  • 將ArrayList作為結(jié)果返回出去。

正常來說,在getOutersList方法中,我們new出來了兩個(gè)對(duì)象:outer和list,而在離開此方法時(shí),我們只將list對(duì)象的引用傳遞出去,outer的引用隨著方法棧的退出而被銷毀。按道理來說,outer對(duì)象此時(shí)應(yīng)該沒有作用了,也應(yīng)該在下一次內(nèi)存回收中被銷毀。

然而,事實(shí)并不是這樣。按上面所說的,新建的list對(duì)象是默認(rèn)包含對(duì)outer對(duì)象的引用的,因此只要list不被銷毀,outer對(duì)象將會(huì)一直存在,然而我們并不需要outer對(duì)象,這便是內(nèi)存泄露。

怎么避免這種情況呢?

很簡單:不涉及到類成員方法和成員變量的方法,最好定義為static

public class Outer{
public static List<String> getList(String item) {
return new ArrayList<String>() {
{
add(item);
}
};
}
}

這樣定義出來的類便是嵌套類+繼承,并不包含對(duì)外部類的引用。

2.應(yīng)用于只實(shí)現(xiàn)一個(gè)接口的實(shí)現(xiàn)類

優(yōu)雅工廠方法模式

我們可以看到,在工廠方法模式中,每個(gè)實(shí)現(xiàn)都會(huì)需要實(shí)現(xiàn)一個(gè)Fractory來實(shí)現(xiàn)產(chǎn)生對(duì)象的接口,而這樣接口其實(shí)和原本的類關(guān)聯(lián)性很大的,因此我們可以將Fractory定義在具體的類中,作為內(nèi)部類存在

簡單的實(shí)現(xiàn)接口

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("test");
}
}
).start();
}

盡量不要直接使用Thread,這里只做演示使用Java 8 的話建議使用lambda代替此類應(yīng)用

同時(shí)實(shí)現(xiàn)多個(gè)接口

public class imple{
public static Eat getDogEat(){
return new EatDog();
}
public static Eat getCatEat(){
return new EatCat();
}
private static class EatDog implements Eat {
@Override
public void eat() {
System.out.println("dog eat");
}
}
private static class EatCat implements Eat{
@Override
public void eat() {
System.out.println("cat eat");
}
}
}

3.優(yōu)雅的單例類

public class Imple {
public static Imple getInstance(){
return ImpleHolder.INSTANCE;
}
private static class ImpleHolder{
private static final Imple INSTANCE=new Imple();
}
}

4.反序列化JSON接受的JavaBean

有時(shí)候需要反序列化嵌套JSON

{
"student":{
"name":"",
"age":""
}
}

類似這種。我們可以直接定義嵌套類進(jìn)行反序列化

public JsonStr{
private Student student;
public static Student{
private String name;
private String age;
//getter & setter
}
//getter & setter
}

但是注意,這里應(yīng)該使用嵌套類,因?yàn)槲覀儾恍枰屯獠款愡M(jìn)行數(shù)據(jù)交換。
核心思想:

  • 嵌套類能夠訪問外部類的構(gòu)造函數(shù)
  • 將第一次訪問內(nèi)部類放在方法中,這樣只有調(diào)用這個(gè)方法的時(shí)候才會(huì)第一次訪問內(nèi)部類,實(shí)現(xiàn)了懶加載

內(nèi)部類還有很多用法,這里不一一列舉。

總結(jié)

內(nèi)部類的理解可以按照方法來理解,但是內(nèi)部類很多特性都必須剝開語法糖和明白為什么需要這么做才能完全理解,明白內(nèi)部類的所有特性才能更好使用內(nèi)部類,在內(nèi)部類的使用過程中,一定記住:能使用嵌套類就使用嵌套類,如果內(nèi)部類需要和外部類聯(lián)系,才使用內(nèi)部類。最后不涉及到類成員方法和成員變量的方法,最好定義為static可以防止內(nèi)部類內(nèi)存泄露。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot任務(wù)調(diào)度器的實(shí)現(xiàn)代碼

    SpringBoot任務(wù)調(diào)度器的實(shí)現(xiàn)代碼

    SpringBoot自帶了任務(wù)調(diào)度器,通過注解的方式使用。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java泛型的使用限制實(shí)例分析

    Java泛型的使用限制實(shí)例分析

    這篇文章主要介紹了Java泛型的使用限制,結(jié)合實(shí)例形式分析了不能使用java泛型的情況以及泛型使用的相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • 深度對(duì)比與解析SpringBoot中的application.properties與application.yml

    深度對(duì)比與解析SpringBoot中的application.properties與application.yml

    在Springboot項(xiàng)目中,使用.properties和.yml配置是等效的,均可以正常識(shí)別并使用,本文將為大家深入對(duì)比與解析一下二者的使用與區(qū)別,希望對(duì)大家有一定的幫助
    2025-04-04
  • Java 將Excel轉(zhuǎn)為SVG的方法

    Java 將Excel轉(zhuǎn)為SVG的方法

    本文以Java示例展示如何將Excel文檔轉(zhuǎn)為SVG格式。通過本文中的方法,在將Excel轉(zhuǎn)為SVG時(shí),如果sheet工作表中手動(dòng)設(shè)置了分頁,則將每個(gè)分頁的內(nèi)容單獨(dú)保存為一個(gè)svg文件,如果sheet工作表中沒有設(shè)置分頁,則將Excel sheet表格中默認(rèn)的分頁范圍保存為svg。
    2021-05-05
  • Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能示例

    Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能,涉及java基于數(shù)組遍歷、運(yùn)算的矩陣操作技巧,需要的朋友可以參考下
    2018-01-01
  • 基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類的示例代碼

    基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類,從而實(shí)現(xiàn)減少參數(shù)長度的效果,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-02-02
  • java多線程數(shù)據(jù)分頁處理實(shí)例講解

    java多線程數(shù)據(jù)分頁處理實(shí)例講解

    在本篇內(nèi)容里小編給大家分享了一篇關(guān)于java多線程數(shù)據(jù)分頁處理實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • IDEA中Maven依賴包下載不了的問題解決方案匯總

    IDEA中Maven依賴包下載不了的問題解決方案匯總

    這篇文章主要介紹了IDEA中Maven依賴包下載不了的問題解決方案匯總,文中通過圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java獲取本機(jī)IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))

    Java獲取本機(jī)IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))

    在IT領(lǐng)域獲取本機(jī)IP地址是一項(xiàng)基礎(chǔ)但重要的任務(wù),特別是在網(wǎng)絡(luò)編程、遠(yuǎn)程協(xié)作和設(shè)備通信中,這篇文章主要給大家介紹了關(guān)于Java獲取本機(jī)IP地址的方法(內(nèi)網(wǎng)、公網(wǎng)),需要的朋友可以參考下
    2024-07-07
  • 教你怎么用IDEA快速生成注釋文檔

    教你怎么用IDEA快速生成注釋文檔

    這篇文章主要介紹了教你怎么用IDEA快速生成注釋文檔,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)IDEA操作的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

遂平县| 邳州市| 久治县| 万山特区| 丰台区| 旺苍县| 灌阳县| 赤水市| 特克斯县| 砚山县| 洛隆县| 阳城县| 浮梁县| 商河县| 新丰县| 宁都县| 政和县| 福安市| 洪洞县| 鄂托克旗| 尼玛县| 海南省| 隆德县| 高碑店市| 宿松县| 凌源市| 大连市| 台北县| 沾益县| 凤冈县| 贺州市| 阳西县| 光山县| 曲靖市| 明溪县| 左贡县| 玉田县| 恩平市| 会东县| 永宁县| 渭南市|