本系列為筆者學習Javase的課堂筆記,視頻資源為B站黑馬程序員出品的《黑馬程序員Java+AI智能輔助編程全套視頻教程,java零基礎入門到大牛一套通關》,章節分布參考視頻教程,為同樣學習Javase系列課程的同學們提供參考。
01 認識泛型
概念:定義類、接口、方法時,同時聲明了一個或者多個類型變量(如:<E>
) 稱為泛型類、泛型接口,泛型方法、它們統稱為泛型。
作用:泛型提供了在編譯階段約束所能操作的數據類型,并自動進行檢查的能力!
package generic;import java.util.ArrayList;public class GenericDemo1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>(); //泛型list.add("msc");list.add("zlg");list.add("phd");list.add("zqy");for(int i=0; i<list.size(); i++){String s = list.get(i);System.out.println(s);}}
}
02 泛型類
MyArrayList.java
//自定義泛型類
public class MyArrayList<E>{//換湯不換藥private ArrayList list = new ArrayList();public boolean add(E e){return list.add(e);}public boolean remove(){return list.remove(e);}@Overridepublic String toString(){return list.toString();}
}
03 泛型接口
Student.java
自定義類
public class Student {
}
Teacher.java
自定義類
public class Teacher {
}
Data.java
自定義接口
public interface Data<T> {void add(T t);void delete(T t);void update(T t);T find(int id);
}
StudentData.java
自定義接口實現類(傳遞Student
類)
public class StudentData implements Data<Student>{@Overridepublic void add(Student student) {}@Overridepublic void delete(Student student) {}@Overridepublic void update(Student student) {}@Overridepublic Student find(int id) {return null;}
}
TeacherData.java
自定義接口實現類(傳遞Teacher
類)
public class TeacherData implements Data<Teacher>{@Overridepublic void add(Teacher teacher) {}@Overridepublic void delete(Teacher teacher) {}@Overridepublic void update(Teacher teacher) {}@Overridepublic Teacher find(int id) {return null;}
}
GenericDemo3.java
public class GenericDemo3 {public static void main(String[] args) {//目標:自定義泛型接口StudentData stu = new StudentData();stu.add(new Student());stu.delete(new Student());Student stu2 = stu.find(1);}
}
04 泛型方法
public class GenericDemo4 {public static void main(String[] args) {String[] names = {"張三","李四","王五","趙六"};printArray(names);String max = getMax(names);Student[] stus = new Student[100];printArray(stus);Student max2 = getMax(stus);}public static <T> void printArray(T[] names){}public static <T> T getMax(T[] names){return null;}
}
05 通配符和上下限
通配符就是?
,可以在使用泛型的時候代表一切類型,ETKV
是在定義泛型的時候使用。
Car.java
public class Car {
}
Xiaomi.java
public class Xiaomi extends Car{
}
Weilai.java
public class Weilai extends Car{
}
GenericDemo5.java
import java.util.ArrayList;public class GenericDemo5 {public static void main(String[] args) {ArrayList<Xiaomi> xiaomis = new ArrayList<>();xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());ArrayList<Weilai> weilais = new ArrayList<>();weilais.add(new Weilai());weilais.add(new Weilai());weilais.add(new Weilai());}public static void go(ArrayList<? extends Car> cars){}
}
06 泛型支持的類型
泛型不支持基本數據類型,故產生了包裝類,包裝類就是把基本數據類型包裝成對象類型。
- 自動裝箱:基本數據類型可以自動轉換為包裝類型。
- 自動拆箱:包裝類型可以自動轉換為基本數據類型。
為了萬物皆對象,并且泛型和集合都不支持基本類型,我們支持包裝類!
package generic;import java.util.ArrayList;public class GenericDemo6 {public static void main(String[] args) {Integer it1 = Integer.valueOf(100); //不是數字100,而是對象100Integer it2 = Integer.valueOf(100); //it1 == it2//自動裝箱Integer it3 = 150;Integer it4 = 145;ArrayList<Integer> list = new ArrayList<>();list.add(138);//自動拆箱int i1 = it3;int i2 = list.get(138);System.out.println("-----------------------------------------");//重要作用:包裝類可以將字符串數值轉化為對應的基本數據類型String s1 = "98";int i = Integer.valueOf(s1);System.out.println(i + 2); //100String s2 = "3.14";double d = Double.valueOf(s2);System.out.println(d + 2); //5.14}
}