JavaSE學(xué)習(xí)之內(nèi)部類及常用API
1.內(nèi)部類
1.1 內(nèi)部類概述
內(nèi)部類:就是在一個(gè)類中定義一個(gè)類。例如:在一個(gè)類A內(nèi)部定義一個(gè)類B,類B就被稱為內(nèi)部類
格式:public class 類名{修飾符 class 類名{}}
范例
public class Outer{ public class Inter{//內(nèi)部類 } }
內(nèi)部類的訪問(wèn)特點(diǎn)
1. 內(nèi)部類可以直接訪問(wèn)外部類成員,包括私有
2. 外部類如果想訪問(wèn)內(nèi)部類就要?jiǎng)?chuàng)建對(duì)象
舉例
public class Outer {//創(chuàng)建外部類 private int age=9; public class Inter{//創(chuàng)建內(nèi)部類 //內(nèi)部類創(chuàng)建方法 public void show(){ //內(nèi)部類可直接訪問(wèn)外部類 System.out.println(age); } } public void method(){ //這里是外部類的調(diào)用,那么不能直接像下面一樣調(diào)用show()方法, //不然就會(huì)報(bào)錯(cuò),不能直接訪問(wèn) //show();不能這樣 //應(yīng)改為創(chuàng)建內(nèi)部類對(duì)象,通過(guò)對(duì)象進(jìn)行訪問(wèn) Inter i=new Inter(); i.show(); } }
1.2 成員內(nèi)部類
按照內(nèi)部類在類中的位置不同,可以分為兩種形式
- 在類的成員位置:成員內(nèi)部類
- 在類的局部位置:局部?jī)?nèi)部類
//類 public class Outer {//創(chuàng)建外部類 private int age=9; public class Inter{//創(chuàng)建內(nèi)部類 //內(nèi)部類創(chuàng)建方法 public void show(){ //內(nèi)部類可直接訪問(wèn)外部類 System.out.println(age); } } }
//測(cè)試類
那么怎么不讓它報(bào)錯(cuò)呢?如何創(chuàng)建呢
外部類.內(nèi)部類 對(duì)象名=new 外部類.new內(nèi)部類();
Outer.Inter oi=new Outer().new Inter();
//測(cè)試類 public class Main { public static void main(String[] args) { Outer.Inter oi=new Outer().new Inter();//構(gòu)造內(nèi)部類對(duì)象 oi.show(); } }
但是,一般情況下,為了安全性不會(huì)將內(nèi)部類定義為公有,會(huì)設(shè)置為私有,上面的Outer.Inter oi=new Outer().new Inter();
就不能這樣構(gòu)造內(nèi)部類的對(duì)象了,否則就會(huì)報(bào)錯(cuò),那么該如何創(chuàng)建呢?
很簡(jiǎn)單,因?yàn)橥獠款惪梢酝ㄟ^(guò)創(chuàng)建內(nèi)部類的對(duì)象進(jìn)行訪問(wèn)內(nèi)部類,那么就可以在測(cè)試類中寫外部類的方法,從而進(jìn)行間接訪問(wèn)。
//類 public class Outer {//創(chuàng)建外部類 private int age=9; private class Inter{//創(chuàng)建內(nèi)部私有類 //內(nèi)部類創(chuàng)建方法 public void show(){ //內(nèi)部類可直接訪問(wèn)外部類 System.out.println(age); } } public void method(){ Inter i=new Inter();//創(chuàng)建內(nèi)部類對(duì)象間接訪問(wèn) i.show(); //調(diào)用方法 } }
這樣就可以輸出內(nèi)部類的值了
運(yùn)行結(jié)果
9
1.3 局部?jī)?nèi)部類
局部?jī)?nèi)部類是在方法中定義的類,所以外界是無(wú)法訪問(wèn)的,需要在方法內(nèi)部創(chuàng)建對(duì)象并使用該類可以直接訪問(wèn)外部類的成員,也可以訪問(wèn)方法內(nèi)部的局部變量
//類 public class Outer {//創(chuàng)建外部類 private int age = 9; public void method() { //在方法中局部創(chuàng)建內(nèi)部類 class Inter {//創(chuàng)建內(nèi)部類 private int age2 = 2;//局部變量也可以 public void show() { System.out.println(age); System.out.println(age2); } } Inter i = new Inter();//創(chuàng)建內(nèi)部類對(duì)象間接訪問(wèn) i.show(); //調(diào)用方法 } }
public class Main { public static void main(String[] args) { Outer o=new Outer(); o.method();//間接調(diào)用方法 } }
1.4 匿名內(nèi)部類
- 前提:存在一個(gè)類或者接口,這里的類可以是具體類,也可以是抽象類
- 格式:
new 類名或者接口名(){重寫方法}
- 范例:
new Inter(){public void show(){}};
- 解釋: new Inter()是匿對(duì)象,繼承了這個(gè)類,或?qū)崿F(xiàn)了這個(gè)接口
- 本質(zhì): 是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象,
匿名內(nèi)部類是局部?jī)?nèi)部類的一種形式,寫的時(shí)候也應(yīng)該在方法中
//前提:一個(gè)類或者接口 public interface Inter {//寫接口 void show();//寫抽象方法 }
那么既然是對(duì)象,就可以通過(guò)對(duì)象調(diào)用方法
public class Outer {//創(chuàng)建外部類 public void method() { new Inter() {//這個(gè)是對(duì)象 @Override//重寫方法 public void show() { System.out.println("匿名內(nèi)部類"); } }.show();//通過(guò)對(duì)象調(diào)用方法 } }
這塊是重點(diǎn):new Inter() {//這個(gè)是對(duì)象 @Override//重寫方法 public void show() { System.out.println("匿名內(nèi)部類"); } }.show();//通過(guò)對(duì)象調(diào)用方法,這里采用了對(duì)象調(diào)用方法,上面整體是對(duì)象,然后.show()
調(diào)用方法
//測(cè)試類 public class Main { public static void main(String[] args) { Outer o=new Outer(); o.method();//調(diào)用方法 } }
接下來(lái),有個(gè)疑問(wèn),你會(huì)說(shuō),如果我想多次調(diào)用方法,是不是要寫很多次這個(gè)方法呢?答案是否定的,既然是內(nèi)部類,那么就可以通過(guò)多態(tài)形式進(jìn)行,即:Inter i=new Inter(){};
然后通過(guò)i來(lái)調(diào)用show()方法
public class Outer {//創(chuàng)建外部類 public void method() { Inter i =new Inter() {//多態(tài)形式,左面接口名,右面對(duì)象 @Override//重寫方法 public void show() { System.out.println("匿名內(nèi)部類"); } }; i.show();//遵循編譯看左面,執(zhí)行看右面 i.show(); } }
1.5 匿名內(nèi)部類在開發(fā)中的使用
學(xué)完了匿名內(nèi)部類之后,那么它在開發(fā)中有哪些運(yùn)用呢?
在開發(fā)時(shí),如果要實(shí)現(xiàn)一個(gè)接口方法時(shí),不需要再創(chuàng)建類,比如之前寫的貓?zhí)吡耍绻雽懝诽吡诉€要重建一個(gè)類,這樣顯得太過(guò)于繁瑣,而且占用空間,既然內(nèi)部類本質(zhì)是類的對(duì)象,那么直接使用就會(huì)大量降低代碼的低效性
//接口 public interface Jummping { void jump();//抽象類 }
//操作類 public class JumppingOperator { public void useOperator(Jummping j){//接口名作為形參,new Jumpping(){} j.jump();//內(nèi)部類對(duì)象調(diào)用方法 }
public class Jumpping { public static void main(String[] args) { JumppingOperator j = new JumppingOperator();//創(chuàng)建操作類對(duì)象 j.useOperator(new Jummping() { @Override public void jump() { System.out.println("貓?zhí)吡?); } });//用匿名內(nèi)部類實(shí)現(xiàn) //重復(fù)使用,就不用再創(chuàng)建Cat類或者Dog類了 j.useOperator(new Jummping() { @Override public void jump() { System.out.println("狗跳墻了"); } }); } }
2.常用API
2.1Math
public final class Math extends Object被final修飾,是最終類,詳細(xì)內(nèi)容見(jiàn)APi手冊(cè)
通過(guò)幫助文檔知道,它沒(méi)有構(gòu)造方法,那么如何使用類中的成員呢?
這時(shí)候就需要看成員是否都是靜態(tài)的,如果是,通過(guò)類名就可以直接調(diào)用
常用方法
public class Main {
public static void main(String[] args) {
//絕對(duì)值
System.out.println(Math.abs(-88));
System.out.println(Math.abs(88));
System.out.println("----------");
//返回大于或者等于參數(shù)的double值為一個(gè)整數(shù),(向上取整)
System.out.println(Math.ceil(1.12));
System.out.println("----------");
//返回0小于或者等于參數(shù)的double值為一個(gè)整數(shù),(向下取整)
System.out.println(Math.floor(1.21));
System.out.println("----------");
//返回最大值
System.out.println(Math.max(1,2));
System.out.println("----------");
//返回最小值
System.out.println(Math.min(2,6));
System.out.println("----------");
//返回a的b次冪
System.out.println(Math.pow(2,2));
System.out.println("----------");
//返回四舍五入的整數(shù)值
System.out.println(Math.round(1.51));
System.out.println("---------");
//返回隨機(jī)值,[0-1.0)
System.out.println(Math.random());
//返回1-100整數(shù)隨機(jī)值
System.out.println((int)(Math.random()*100)+1);
}
}
運(yùn)行結(jié)果
88
88
----------
2.0
----------
1.0
----------
2
----------
2
----------
4.0
----------
2
---------
0.6041376042702374
78
2.2 System
不能實(shí)例化,不能創(chuàng)建對(duì)象,靜態(tài)修飾
常用方法
public class Main {
public static void main(String[] args) {
System.out.println("start");
System.exit(0);
//java虛擬機(jī)已經(jīng)停止運(yùn)行,無(wú)法在進(jìn)行執(zhí)下面的語(yǔ)句
System.out.println("end");
}
}
運(yùn)行結(jié)果
start
public class Main { public static void main(String[] args) { System.out.println(System.currentTimeMillis()*1.0/1000/60/60/24/365+"年"); System.out.println("開始計(jì)算下面程序執(zhí)行的時(shí)間"); long start=System.currentTimeMillis();//用lang定義,因?yàn)閿?shù)字太大 for(int i = 0; i <10000;i++){ System.out.println(i); } long end=System.currentTimeMillis();//用lang定義 System.out.println("程序運(yùn)行時(shí)間為:"+(end-start)+"毫秒"); } }
2.3 Object
概述
Object是類層次結(jié)構(gòu)的根,每個(gè)類都可以將Object作為超類。所有類都直接或者間接的繼承自該類
構(gòu)造方法: public Object()
回想面向?qū)ο笾?,為什么說(shuō)子類的構(gòu)造方法默認(rèn)訪問(wèn)的是父類的無(wú)參構(gòu)造方法?
因?yàn)樗鼈兊捻敿?jí)父類只有無(wú)參構(gòu)造方法心
toString()方法的使用
可以使得單獨(dú)的多個(gè)屬性變得有聯(lián)系,讓人一眼就能夠看明白什么意思,例如我們?cè)谇懊嬷v到的創(chuàng)建學(xué)生實(shí)體類時(shí),在測(cè)試類輸出時(shí)還要用getXxx()+setXxx
才能進(jìn)行輸出,有了這種方法,我們就可直接進(jìn)行使用了,這個(gè)方法建議所有子類進(jìn)行重寫使用,在使用時(shí)可以直接使用方法,快捷鍵還是Alt+Inster
下面可以看到toString()方法
下面進(jìn)行舉例:
public class Student {//其實(shí)這里繼承了Object,所以Student這個(gè)類理論上是子類, //所以可以使用toString()方法,但要重寫 private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() {//重寫方法 return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
//測(cè)試類
public class Main {
public static void main(String[] args) {
Student s=new Student("張三",18);//采用有參構(gòu)造
System.out.println(s);//因?yàn)槭褂昧藅oString()方法,
// 就不用再用getName(),getAge()輸出了,直接輸出s
}
}
運(yùn)行結(jié)果
Student{name='張三', age=18}
這樣就可以讓他們之間建立一種聯(lián)系
equal()方法
比較的是內(nèi)容值,當(dāng)然,如果按照上面的方法進(jìn)行比較姓名,年齡,它返回的的地址,因?yàn)榈刂凡煌敲淳蜁?huì)返回false,這個(gè)還需要在子類中重寫方法,快捷鍵依然是那個(gè)
然后一直點(diǎn)下一步
再刪掉這部分即可
//測(cè)試類 public class Main { public static void main(String[] args) { Student s1=new Student("張三",18);//采用有參構(gòu)造 System.out.println(s1); Student s2=new Student("張三",18);//采用有參構(gòu)造 System.out.println(s2); System.out.println(s1.equals(s2)); //這里因?yàn)槭莕ew出來(lái)的,所以比較地址就會(huì)返回false,那么只有重寫了方法才會(huì) } }
//學(xué)生類 public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } }
這是對(duì)equals()方法代碼內(nèi)容的解釋
2.4 Array的排序
對(duì)于封裝好的排序方法,不用豈不是太可惜,但是用之前我們也要思考自己能否寫出一個(gè)高效的算法排序的方法。
下面進(jìn)行介紹Arrays類的使用,由于APi中方法太多,詳細(xì)內(nèi)容還請(qǐng)到API中自行查看,這里講述兩種常用的方法:
工具類的設(shè)計(jì)思想:
1. 構(gòu)造方法用private修飾:為了防止外界創(chuàng)建對(duì)象
2. 成員用public static修飾:使用類名來(lái)訪問(wèn)該成員變量
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int []arr={2,7,3,4,9,5};
System.out.println("排序前: "+Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后: "+Arrays.toString(arr));
}
}
運(yùn)行結(jié)果:
排序前: [2, 7, 3, 4, 9, 5]
排序后: [2, 3, 4, 5, 7, 9]
現(xiàn)要求從鍵盤錄入數(shù)字,要求數(shù)組是動(dòng)態(tài)的,對(duì)數(shù)據(jù)進(jìn)行排序
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("請(qǐng)你輸入一個(gè)數(shù)n:");
int []arr=new int[sc.nextInt()];//動(dòng)態(tài)數(shù)組
for(int i=0;i< arr.length; i++){
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
}
錄入:
5
1 5 3 7 9
運(yùn)行結(jié)果:
[1, 3, 5, 7, 9]
以上就是JavaSE學(xué)習(xí)之內(nèi)部類及常用API的詳細(xì)內(nèi)容,更多關(guān)于JavaSE內(nèi)部類 API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解讀CommandLineRunner或者ApplicationRunner接口
這篇文章主要介紹了解讀CommandLineRunner或者ApplicationRunner接口的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12SpringBoot2整合ElasticJob框架過(guò)程詳解
這篇文章主要介紹了SpringBoot2整合ElasticJob框架過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03關(guān)于Java中配置ElasticSearch集群環(huán)境賬號(hào)密碼的問(wèn)題
這篇文章主要介紹了Java中配置ElasticSearch集群環(huán)境賬號(hào)密碼的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04