JavaSE學習之內部類及常用API
1.內部類
1.1 內部類概述
內部類:就是在一個類中定義一個類。例如:在一個類A內部定義一個類B,類B就被稱為內部類
格式:public class 類名{修飾符 class 類名{}}
范例
public class Outer{ public class Inter{//內部類 } }
內部類的訪問特點
1. 內部類可以直接訪問外部類成員,包括私有
2. 外部類如果想訪問內部類就要創建對象
舉例
public class Outer {//創建外部類 private int age=9; public class Inter{//創建內部類 //內部類創建方法 public void show(){ //內部類可直接訪問外部類 System.out.println(age); } } public void method(){ //這裡是外部類的調用,那麼不能直接像下面一樣調用show()方法, //不然就會報錯,不能直接訪問 //show();不能這樣 //應改為創建內部類對象,通過對象進行訪問 Inter i=new Inter(); i.show(); } }
1.2 成員內部類
按照內部類在類中的位置不同,可以分為兩種形式
- 在類的成員位置:成員內部類
- 在類的局部位置:局部內部類
//類 public class Outer {//創建外部類 private int age=9; public class Inter{//創建內部類 //內部類創建方法 public void show(){ //內部類可直接訪問外部類 System.out.println(age); } } }
//測試類
那麼怎麼不讓它報錯呢?如何創建呢
外部類.內部類 對象名=new 外部類.new內部類();
Outer.Inter oi=new Outer().new Inter();
//測試類 public class Main { public static void main(String[] args) { Outer.Inter oi=new Outer().new Inter();//構造內部類對象 oi.show(); } }
但是,一般情況下,為瞭安全性不會將內部類定義為公有,會設置為私有,上面的Outer.Inter oi=new Outer().new Inter();
就不能這樣構造內部類的對象瞭,否則就會報錯,那麼該如何創建呢?
很簡單,因為外部類可以通過創建內部類的對象進行訪問內部類,那麼就可以在測試類中寫外部類的方法,從而進行間接訪問。
//類 public class Outer {//創建外部類 private int age=9; private class Inter{//創建內部私有類 //內部類創建方法 public void show(){ //內部類可直接訪問外部類 System.out.println(age); } } public void method(){ Inter i=new Inter();//創建內部類對象間接訪問 i.show(); //調用方法 } }
這樣就可以輸出內部類的值瞭
運行結果
9
1.3 局部內部類
局部內部類是在方法中定義的類,所以外界是無法訪問的,需要在方法內部創建對象並使用該類可以直接訪問外部類的成員,也可以訪問方法內部的局部變量
//類 public class Outer {//創建外部類 private int age = 9; public void method() { //在方法中局部創建內部類 class Inter {//創建內部類 private int age2 = 2;//局部變量也可以 public void show() { System.out.println(age); System.out.println(age2); } } Inter i = new Inter();//創建內部類對象間接訪問 i.show(); //調用方法 } }
public class Main { public static void main(String[] args) { Outer o=new Outer(); o.method();//間接調用方法 } }
1.4 匿名內部類
- 前提:存在一個類或者接口,這裡的類可以是具體類,也可以是抽象類
- 格式:
new 類名或者接口名(){重寫方法}
- 范例:
new Inter(){public void show(){}};
- 解釋: new Inter()是匿對象,繼承瞭這個類,或實現瞭這個接口
- 本質: 是一個繼承瞭該類或者實現瞭該接口的子類匿名對象,
匿名內部類是局部內部類的一種形式,寫的時候也應該在方法中
//前提:一個類或者接口 public interface Inter {//寫接口 void show();//寫抽象方法 }
那麼既然是對象,就可以通過對象調用方法
public class Outer {//創建外部類 public void method() { new Inter() {//這個是對象 @Override//重寫方法 public void show() { System.out.println("匿名內部類"); } }.show();//通過對象調用方法 } }
這塊是重點:new Inter() {//這個是對象 @Override//重寫方法 public void show() { System.out.println(“匿名內部類”); } }.show();//通過對象調用方法,這裡采用瞭對象調用方法,上面整體是對象,然後.show()
調用方法
//測試類 public class Main { public static void main(String[] args) { Outer o=new Outer(); o.method();//調用方法 } }
接下來,有個疑問,你會說,如果我想多次調用方法,是不是要寫很多次這個方法呢?答案是否定的,既然是內部類,那麼就可以通過多態形式進行,即:Inter i=new Inter(){};
然後通過i來調用show()方法
public class Outer {//創建外部類 public void method() { Inter i =new Inter() {//多態形式,左面接口名,右面對象 @Override//重寫方法 public void show() { System.out.println("匿名內部類"); } }; i.show();//遵循編譯看左面,執行看右面 i.show(); } }
1.5 匿名內部類在開發中的使用
學完瞭匿名內部類之後,那麼它在開發中有哪些運用呢?
在開發時,如果要實現一個接口方法時,不需要再創建類,比如之前寫的貓跳高瞭,如果想寫狗跳高瞭還要重建一個類,這樣顯得太過於繁瑣,而且占用空間,既然內部類本質是類的對象,那麼直接使用就會大量降低代碼的低效性
//接口 public interface Jummping { void jump();//抽象類 }
//操作類 public class JumppingOperator { public void useOperator(Jummping j){//接口名作為形參,new Jumpping(){} j.jump();//內部類對象調用方法 }
public class Jumpping { public static void main(String[] args) { JumppingOperator j = new JumppingOperator();//創建操作類對象 j.useOperator(new Jummping() { @Override public void jump() { System.out.println("貓跳高瞭"); } });//用匿名內部類實現 //重復使用,就不用再創建Cat類或者Dog類瞭 j.useOperator(new Jummping() { @Override public void jump() { System.out.println("狗跳墻瞭"); } }); } }
2.常用API
2.1Math
public final class Math extends Object被final修飾,是最終類,詳細內容見APi手冊
通過幫助文檔知道,它沒有構造方法,那麼如何使用類中的成員呢?
這時候就需要看成員是否都是靜態的,如果是,通過類名就可以直接調用
常用方法
public class Main {
public static void main(String[] args) {
//絕對值
System.out.println(Math.abs(-88));
System.out.println(Math.abs(88));
System.out.println("----------");
//返回大於或者等於參數的double值為一個整數,(向上取整)
System.out.println(Math.ceil(1.12));
System.out.println("----------");
//返回0小於或者等於參數的double值為一個整數,(向下取整)
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("----------");
//返回四舍五入的整數值
System.out.println(Math.round(1.51));
System.out.println("---------");
//返回隨機值,[0-1.0)
System.out.println(Math.random());
//返回1-100整數隨機值
System.out.println((int)(Math.random()*100)+1);
}
}
運行結果
88
88
———-
2.0
———-
1.0
———-
2
———-
2
———-
4.0
———-
2
———
0.6041376042702374
78
2.2 System
不能實例化,不能創建對象,靜態修飾
常用方法
public class Main {
public static void main(String[] args) {
System.out.println("start");
System.exit(0);
//java虛擬機已經停止運行,無法在進行執下面的語句
System.out.println("end");
}
}
運行結果
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("開始計算下面程序執行的時間"); long start=System.currentTimeMillis();//用lang定義,因為數字太大 for(int i = 0; i <10000;i++){ System.out.println(i); } long end=System.currentTimeMillis();//用lang定義 System.out.println("程序運行時間為:"+(end-start)+"毫秒"); } }
2.3 Object
概述
Object是類層次結構的根,每個類都可以將Object作為超類。所有類都直接或者間接的繼承自該類
構造方法: public Object()
回想面向對象中,為什麼說子類的構造方法默認訪問的是父類的無參構造方法?
因為它們的頂級父類隻有無參構造方法心
toString()方法的使用
可以使得單獨的多個屬性變得有聯系,讓人一眼就能夠看明白什麼意思,例如我們在前面講到的創建學生實體類時,在測試類輸出時還要用getXxx()+setXxx
才能進行輸出,有瞭這種方法,我們就可直接進行使用瞭,這個方法建議所有子類進行重寫使用,在使用時可以直接使用方法,快捷鍵還是Alt+Inster
下面可以看到toString()方法
下面進行舉例:
public class Student {//其實這裡繼承瞭Object,所以Student這個類理論上是子類, //所以可以使用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 + '}'; } }
//測試類
public class Main {
public static void main(String[] args) {
Student s=new Student("張三",18);//采用有參構造
System.out.println(s);//因為使用瞭toString()方法,
// 就不用再用getName(),getAge()輸出瞭,直接輸出s
}
}
運行結果
Student{name=’張三’, age=18}
這樣就可以讓他們之間建立一種聯系
equal()方法
比較的是內容值,當然,如果按照上面的方法進行比較姓名,年齡,它返回的的地址,因為地址不同,那麼就會返回false,這個還需要在子類中重寫方法,快捷鍵依然是那個
然後一直點下一步
再刪掉這部分即可
//測試類 public class Main { public static void main(String[] args) { Student s1=new Student("張三",18);//采用有參構造 System.out.println(s1); Student s2=new Student("張三",18);//采用有參構造 System.out.println(s2); System.out.println(s1.equals(s2)); //這裡因為是new出來的,所以比較地址就會返回false,那麼隻有重寫瞭方法才會 } }
//學生類 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; } }
這是對equals()方法代碼內容的解釋
2.4 Array的排序
對於封裝好的排序方法,不用豈不是太可惜,但是用之前我們也要思考自己能否寫出一個高效的算法排序的方法。
下面進行介紹Arrays類的使用,由於APi中方法太多,詳細內容還請到API中自行查看,這裡講述兩種常用的方法:
工具類的設計思想:
1. 構造方法用private修飾:為瞭防止外界創建對象
2. 成員用public static修飾:使用類名來訪問該成員變量
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));
}
}
運行結果:
排序前: [2, 7, 3, 4, 9, 5]
排序後: [2, 3, 4, 5, 7, 9]
現要求從鍵盤錄入數字,要求數組是動態的,對數據進行排序
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("請你輸入一個數n:");
int []arr=new int[sc.nextInt()];//動態數組
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
運行結果:
[1, 3, 5, 7, 9]
以上就是JavaSE學習之內部類及常用API的詳細內容,更多關於JavaSE內部類 API的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- java中類和對象的詳細介紹
- 深入瞭解Java內部類的用法
- Java常用API類之Math System tostring用法詳解
- Java Object類和包裝類深入解讀
- Java基礎之Object類詳解