(1) 靜態(tài)導(dǎo)入
導(dǎo)入技術(shù)其實在java中是為了方便的使用其他人寫好的類。
import java.lang.*|類名
在原來的導(dǎo)包語句中發(fā)現(xiàn)只能導(dǎo)入類。如果需要導(dǎo)入的是一些靜態(tài)的方法或者屬性那么就無能為力。
舉例1:求一個任意半徑的圓形的面積?
// 求一個任意半徑的圓形的面積
public static void getArea(){
// 1. 求一個隨機的半徑
double r = Math.ceil(Math.random()*10);
// 2. 計算面積
double area = 0.0;
area = Math.PI*r*r;
// 3. 打印面積
System.out. } 發(fā)現(xiàn)以上的代碼中大量的出現(xiàn)了一些靜態(tài)的成員。 那么可以使用靜態(tài)導(dǎo)入的方式簡化代碼的書寫。 語法: import static java.lang.*|靜態(tài)成員 實戰(zhàn): importstatic java.lang.Math.PI; importstatic java.lang.System.out; importstatic java.lang.Math.random; importstatic java.lang.Math.ceil; public class Demo4 { // 求一個任意半徑的圓形的面積 public static void getArea(){ // 1. 求一個隨機的半徑 double r = ceil(random()*10); // 2. 計算面積 double area = 0.0; area = PI*r*r; // 3. 打印面積 out.println("半徑是"+r+"的圓形的面積是:"+area); } } 如果代碼中使用到了一個類的多個靜態(tài)成員那么可以直接使用* 進行全部的導(dǎo)入。 import static java.lang.Math.*; (2) 可變參數(shù) 思考:如果開發(fā)者現(xiàn)在要定義一個函數(shù)(方法),那么不知道參數(shù)的個數(shù)的時候應(yīng)該如何指定形參。 語法:定義函數(shù)的語法 修飾符 返回值類型 方法名(參數(shù)類型… 變量名 ) 異常的聲明{ // 函數(shù)體 return; } 注:學(xué)習(xí)可變參數(shù)的本質(zhì) 舉例1:求任意個整數(shù)的累加和? // 求任意個整數(shù)的累加和? public static long getSum(int... is){ long sum = 0; for (int i = 0; i < is.length; i++) { sum +=is[i]; } return sum; } 舉例2:SUN的API中用的可變參數(shù)。 static <T> List<T> asList(T... a) 返回一個受指定數(shù)組支持的固定大小的列表。 u 包裝類 其實在java中有四型八種的基本數(shù)據(jù)類型。如果所有的基本數(shù)據(jù)類型不是對象的話那么java 語言就不是正真的OOP語言。 Wrapper Class即包裝類。在包裝類中SUN封轉(zhuǎn)了開發(fā)者常用的一些屬性和方法,可以進行快速的編程。
包裝類 | 基本數(shù)據(jù)類型 |
Byte | byte |
Short | short |
Integer | int |
Long | long |
Boolean | boolean |
Character | char |
Float | float |
Double | double |
舉例1:體驗Integer類提供的屬性。
// 體驗Integr類的屬性
public static void getField() {
System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Integer.MAX_VALUE); // 2147483647
}
閱讀以下的代碼,分析代碼的錯誤原因:
long date = 12345678910; // 報錯
12345678910
2147483647
舉例2:體驗Integer類提供的方法。
主要學(xué)習(xí)的是整數(shù)到字符串之間的轉(zhuǎn)換的方法。
// 體驗Integr類的方法
public static void getMethod() {
// 創(chuàng)建類對象
Integer in1 = new Integer(123);
int i1 = in1.intValue();
System.out.println(i1+1);
// 轉(zhuǎn)換為字符串
String str1 = in1.toString();
System.out.println(str1+1);
}
其實在這里沒有必要轉(zhuǎn)型為String的時候進行基本的toString()調(diào)用。
簡化以上的代碼:
// 體驗Integr類的方法
public static void getMethod2() {
// 創(chuàng)建類對象
Integer in1 = new Integer(123);
int i1 = in1; // 自動拆箱
System.out.println(i1+1);
// 轉(zhuǎn)換為字符串
System.out.println(in1+""+1);
}
(3)什么是自動拆箱和自動裝箱?
自動裝箱: 如果將基本類型傳遞給包裝類型。 Integer in1 = 12;
自動拆箱: 如果將包裝類型傳遞給基本類型。 int i1 = in1
在泛型的時候比較有用:
集合:主要的用途是進行對象的存儲。
list.add(1); //自動裝箱
思考:String str = “hello”;
u 增強for循環(huán)
如果要遍歷一個指定的數(shù),那么我們一般要使用傳統(tǒng)的的for循環(huán)。
語法:
for( 條件的初始化語句; 條件表達式; 循環(huán)的增量 ){
// 循環(huán)體 break或continue
}
這樣寫的話每次都會遇到一個下標越界的一個異常。
因此可以使用增強for循環(huán)進行快速的遍歷(數(shù)組、集合以及實現(xiàn)了Iterable接口的類)。
語法:
for(數(shù)據(jù)類型 變量名:需要遍歷的集合){
// 循環(huán)體
}
舉例1:遍歷一個普通的數(shù)組。
// 遍歷一個數(shù)組
public static void printArray(int [] a){
for(int temp:a){
System.out.println(temp);
}
}
舉例2:遍歷一個List集合。
// 遍歷一個list
public static void printList(List<String> list){
for (String string : list) {
System.out.println(string);
}
}
舉例3:遍歷一個Map集合。
// 遍歷一個Map集合
public static void printMap(Map<Integer,String> map){
// 想將其轉(zhuǎn)換為實現(xiàn)了Iterable接口的Set類
Set<Map.Entry<Integer, String>> set = map.entrySet();
// 遍歷set集合
for(Map.Entry<Integer, String> entry:set){
// 獲取entry對象的key和value值
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value+",");
}
}
思考:如果以上的集合沒有使用泛型,那么在使用for循環(huán)的時候應(yīng)該使用什么類型接收集合數(shù)據(jù)? Object
問題1:使用增強for循環(huán)是否可以改變集合中數(shù)據(jù)?
因為for循環(huán)在遍歷的時候使用的是將值拷貝一份給臨時變量。因此改變臨時變量不會改變集合中的數(shù)據(jù)值。
問題2:使用增強for循環(huán)遍歷集合的時候操作集合的問題?
// 遍歷一個list
public static void printList(List<String> list){
for (String string : list) {
list.add("eeee"); // 運行錯誤
System.out.println(string);
}
System.out.println("遍歷中: "+list);
}
異常信息如下:
Exception in thread "main" java.util.ConcurrentModificationException
模擬基礎(chǔ)班看過的場景:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");
Iterator<String> it = list.iterator();
while(it.hasNext()){
list.add("yyyy");
String str = it.next();
System.out.println(str);
}
}
運行異常:
Exception in thread "main" java.util.ConcurrentModificationException
總結(jié);
在使用增強for循環(huán)進行集合的迭代的時候其實默認使用的是迭代器,因此在循環(huán)中不能使用集合的引用變量直接操作集合,避免導(dǎo)致多線程并發(fā)訪問的安全性異常。
u 安全的枚舉類
在實際的項目的開發(fā)中我們經(jīng)常需要一類數(shù)據(jù),這一類數(shù)據(jù)的值是特定范圍的一組值。如:
性別:[男、女]
交通燈:[紅、黃、綠]
星期幾:[一~七]
以上的一組值可以定義為枚舉數(shù)據(jù)類型。
語法:
修飾符 enum 枚舉類名{
// 定義枚舉的一組值,多個值之間使用逗號進行分隔
}
實現(xiàn):
public enum Gender {
MALE,FEMALE;
}
問題:枚舉的本質(zhì)是什么?
既然枚舉是一個普通類,那么我們開發(fā)人員就可以在類中定義類的成員(屬性、構(gòu)造函數(shù)、函數(shù))。
舉例1:在枚舉中定義屬性。
public enum TrafficLight {
// 定義枚舉值
RED,GREEN,YELLOW;
// 定義成員屬性
public String info = "交通燈信息";
public static void main(String[] args) {
System.out.println(TrafficLight.GREEN.info);
}
}
舉例2::在枚舉中定義構(gòu)造函數(shù)。
public enum TrafficLight {
// 定義枚舉值
RED("紅燈"),GREEN("綠燈"),YELLOW("黃燈");
// 定義成員屬性
public String info = "交通燈信息";
// 提供構(gòu)造函數(shù)進行屬性的初始化
private TrafficLight(String info){
this.info = info;
}
public static void main(String[] args) {
System.out.println(TrafficLight.GREEN.info);
System.out.println(TrafficLight.RED.info);
System.out.println(TrafficLight.YELLOW.info);
}
}
切記的是為了保證枚舉是單例的那么構(gòu)造函數(shù)全部要私有。
舉例3:在枚舉中定義函數(shù)。
public enum TrafficLight {
// 定義枚舉值
RED("紅燈") {
@Override
public void showMessage() {
System.out.println("紅燈停!");
}
},
GREEN("綠燈") {
@Override
public void showMessage() {
System.out.println("綠燈行!");
}
},
YELLOW("黃燈") {
@Override
public void showMessage() {
System.out.println("你自己看著辦!");
}
};
// 定義成員屬性
public String info = "交通燈信息";
// 提供構(gòu)造函數(shù)進行屬性的初始化
private TrafficLight(String info) {
this.info = info;
}
// 提供一個表明燈的信息的方法
public abstract void showMessage();
public static void main(String[] args) {
System.out.println(TrafficLight.GREEN.info);
System.out.println(TrafficLight.RED.info);
System.out.println(TrafficLight.YELLOW.info);
TrafficLight.RED.showMessage();
}
}
以上的代碼可見在枚舉類中可以定義抽象方法,但是不能將枚舉類聲明為抽象類,只能在聲明枚舉值的時候?qū)崿F(xiàn)所有的抽象方法即(匿名內(nèi)部類)。
在實際的枚舉中其實自定義的枚舉類默認繼承Enum類,那么我們的枚舉類中就會有Enum類中的定義好的屬性和方法。
常用方法 | 方法的描述 |
String name() | 獲取枚舉值的名稱 |
int ordinal() | 返回枚舉值定義的序號 |
valueOf(Class<T> enumType, String name) | 通過反射查找指定的類中的指定名的枚舉值 |
values() | 該方法在API中不可見但是可用 |
舉例3:使用Enum類中常用的方法。
// 常用的方法體驗
System.out.println(TrafficLight.YELLOW.name()); // YELLOW
System.out.println(TrafficLight.RED.ordinal()); // 0
System.out.println(TrafficLight.valueOf(TrafficLight.class,"GREEN"));
以上的方法都是在API中可見的方法,但是有一些方法是API中不可見但是內(nèi)部其實定義了的方法。
舉例4:遍歷枚舉值。
// 遍歷枚舉值
TrafficLight [] trans = TrafficLight.values();
for(TrafficLight temp:trans){
System.out.println(temp);
}
新聞熱點
疑難解答