日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

黑马程序员——Java基础知识——泛型、枚举

發布時間:2023/12/9 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 黑马程序员——Java基础知识——泛型、枚举 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!

一、泛型

? ? ? ?泛型(Generic):JDK1.5以后出現的新特性,用于解決安全問題,是一個類型安全機制。泛型的出現將運行時期出現的問題如ClassCastException轉移到了編譯時期,方便于程序員解決問題,讓運行時問題減少、安全;還避免了強制轉換的麻煩。

? ? ? ?泛型格式:通過<>來定義要操作的引用數據類型。如:ArrayList<String> al=new ArrayList<String>();該集合只能加入String類型的元素。泛型的應用在集合框架中很常見,見到<>就要定義泛型。當使用集合時,將集合中要存儲的數據類型作為參數傳遞給<>中,<>就是用來接收數據類型的。如下:

public static void main(String[] args) {//定義集合,并加入泛型,只能傳入字符串ArrayList<String> al = new ArrayList<String>();//添加元素al.add("xiaoming");al.add("haha");al.add("nihao");//迭代器也加入泛型Iterator<String> it = al.iterator();while(it.hasNext()){String s = it.next();System.out.println(s);}}
?
從上面這個程序可以看出,集合加入了泛型之后,可以不用再對元素進行類型的強制轉換。

? ? ? ? 泛型類:當類中要操作的引用數據類型不確定的時候,早期定義Object來完成擴展,現在可以定義泛型來完成拓展。泛型類定義的泛型在整個類中有效,如果被方法使用,當泛型類的對象明確要操作的具體類型后,所有要操作的類型就已經固定了。要注意這里的具體類型都是引用類型,不能是基本類型。通過一段小代碼進行演示:

class Demo {public static void main(String[]args){//創建對象,明確要操作的數據類型為String User<String>user=new User<String>();//方法操作的參數類型只能是String user.setObject("你好");} }//定義一個泛型類 class User<AA>{private AA a;public void setObject(AA a){this.a=a;}public AA getTool(){return a;} }
? ? ?如果一個泛型類中的方法,在創建了該類對象后,還想操作不同類型的參數,而且參數的類型還不確定,這時就可以把泛型定義在方法上。定義在方法上的泛型可以與類的泛型不同,可以調用類的泛型數據和其他泛型數據。泛型定義在方法上時,要放在返回值類型的前面,修飾符的后面。如下面這個程序:

class Demo {public static void main(String[]args){//創建對象,明確要操作的數據類型為String Tool<String> tool=new Tool<String>();//get方法操作的參數類型只能是String tool.get("你好");//print方法在方法上定義了泛型,可以調用與類泛型不同的參數tool.print("再見");tool.print(12);//向上提升為Integer類型。} }//定義一個泛型類 class Tool<T>{public void get(T t){System.out.println(t);}public<S> void print(S s){System.out.println(s);} }? ? ? 當一個泛型類中有靜態方法時,靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的數據類型不確定,可以將泛型定義在方法上。

? ? ?通配符:用?表示,又叫占位符,當傳入的類型不確定時,使用通配符。使用通配符的好處是可以不用明確傳入的類型,在使用泛型類或泛型方法時,提高了擴展性。定義的通配符主要做引用,可以調用與參數化無關的方法,不能調用與參數化有關的方法。即不能調用對象特有的方法。下面這個程序就應用了通配符,提高了擴展性。

public static void main(String[] args) {//定義一個字符串類型的ArrayList集合ArrayList<String> a1 = new ArrayList<String>();a1.add("abc1");a1.add("abc2");a1.add("abc3");//定義一個I整數型的ArrayList集合ArrayList<Integer> a2 = new ArrayList<Integer>();a2.add(4);a2.add(7);a2.add(1);//調用迭代方法print(a1);print(a2);//使用了通配符,可以傳入任意參數類型的ArrayList集合 public static void printColl(ArrayList<?> al){Iterator<?> it = al.iterator();while(it.hasNext()){System.out.println(it.next().toString());}}
? ? ?泛型的限定:對于一個范圍內的一類事物,可以通過泛型限定的方式來定義。

? ? ? 第一種設定上限:?extends E:可以接收E類型或者E的子類型。如:ArrayList<? extends Number> al=new ArrayList<Integer>();

? ? ?第二種設定下限:? super E: 可以接收E類型或者E的父類型。 ? 如:ArrayList<? super Integer> al=new ArrayList<Number>();?

? ? ?通過應用泛型限定,可以讓具有繼承關系或處在同一個繼承體系中的對象,能夠實現方法的共用,提高代碼的復用性。如下面這個程序:

/**定義學生類、工人類,他們都有年齡屬性。建立他們的具體對象,并放在TreeSet集合中。按照姓名的自然順序排序。 */class GenericDemo7 {public static void main(String[] args) {//建立存儲學生對象的TreeSet集合,按照傳入的比較器排序TreeSet<Student> ts = new TreeSet<Student>(new Comp());ts.add(new Student("孫明"));ts.add(new Student("小新"));ts.add(new Student("陳光"));ts.add(new Student("阿亮"));Iterator<Student> it = ts.iterator();//獲取每個學生while(it.hasNext()){System.out.println(it.next().getName());}//建立存儲工人對象的TreeSet集合,按照傳入的比較器排序TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());ts1.add(new Worker("王猛"));ts1.add(new Worker("李霞"));ts1.add(new Worker("孫一"));ts1.add(new Worker("霍東"));Iterator<Worker> it1 = ts1.iterator();while(it1.hasNext()){System.out.println(it1.next().getName());}} }//定義比較器,定義泛型為Person class Comp implements Comparator<Person> {public int compare(Person p1,Person p2){return p2.getName().compareTo(p1.getName());} }//定義Person類 class Person {private String name;Person(String name){this.name = name;}public String getName(){return name;}public String toString(){return "person :"+name;} } //定義學生類,繼承Person class Student extends Person {Student(String name){super(name);}} //定義工人類,繼承Person類 class Worker extends Person {Worker(String name){super(name);} }? ? ? Comparator接口傳入參數類型是<? super T>,當我們傳入的是工人和學生共同的子類Person時,存儲兩者的集合都可以調用這個比較器,提高了代碼的復用性,簡化了代碼。

? ?二、枚舉

? ? ? ? 就是讓一個類對應的引用型變量的取值為若干個固定的值中的一個。例如星期對應的值只能是星期一到星期日。否則編譯無法通過。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。下面就通過一個普通類來實現枚舉的功能,如下:

<pre name="code" class="java">public abstract class WeekDay{//構造函數私有private WeekDay(){}//定義變量,表示周日public final static WeekDay SUN = new WeekDay(){public WeekDay nextDay() {return MON;}};//定義變量。表示周一public final static WeekDay MON = new WeekDay(){public WeekDay nextDay() {return SUN;}}; //定義抽象方法,表示下一天public abstract WeekDay nextDay();//返回字符串表現形式public String toString(){return this==SUN?"SUN":"MON";} }

該類的對象的值只能是固定的SUN、MON。 ?該類創建時,首先將構造函數私有,所以外部無法創建該類的對象。每一個同類型成員變量用公有靜態修飾,其實就是該類的一個實例對象。類中可以定義共有方法或抽象方法,成員變量對象中要復寫抽象方法。

? ? ? 枚舉類:通過enum關鍵字表示,枚舉類中每個元素都是類靜態常量,都是該類的一個實例對象。枚舉類定義的值就是該類中定義的元素。若不是,編譯失敗。枚舉類的構造函數稱為構造器,必須私有,保證外部無法創建枚舉類的實例。在構造枚舉值時被調用。可以定義多個構造器,調用哪個即初始化對應的值。下面通過一段程序演示枚舉類及其特有的方法。

public class Demo {public static void main(String[] args) {//獲取表示周一的對象WeekDay weekDay = WeekDay.MON;//獲取表示周五的對象WeekDay weekDay2 = WeekDay.FRI;//打印枚舉常量名System.out.println(weekDay2);//打印枚舉常量名System.out.println(weekDay2.name());//打印枚舉常量的次序System.out.println(weekDay2.ordinal()); //將字符串轉為枚舉常量System.out.println(WeekDay.valueOf("SUN"));//獲取所有枚舉常量System.out.println(WeekDay.values());}//定義一個內部枚舉類public enum WeekDay{//定義枚舉常量SUN(1),MON(),TUE,WED,THI,FRI,SAT;private WeekDay(){}//定義有參數的構造方法private WeekDay(int day){}}} ? ? ? ? ?要注意的是枚舉中元素必須位于枚舉類的最上方,如果后面還有其他成員要用分號隔開。否則編譯失敗。枚舉和普通的類一樣,類中也可以有普通成員變量、成員方法等。當枚舉類中多個構造方法時,元素需指定構造方法。若選擇有參數的構造方法,需要傳入參數,否則還是默認的構造方法。枚舉也內部類的形式存在比較常見。枚舉類中方法返回的類型一般都是本類類型。當枚舉類中只有一個成員時,可以看成是一種單例設計模式的體現。下面再通過一個表示交通燈的枚舉類,學習內容更豐富的枚舉類。如下:

//定義表示交通燈的枚舉類public enum WeekDay{SUN(1),MON(),TUE,WED,THI,FRI,SAT;private WeekDay(){System.out.println("first");}private WeekDay(int day){System.out.println("second");}}public enum TrafficLamp{//表示紅燈,復寫換燈方法RED(30){public TrafficLamp nextLamp(){return GREEN;}},//表示綠燈,復寫換燈方法GREEN(45){public TrafficLamp nextLamp(){return YELLOW;} },//表示黃燈,復寫換燈方法YELLOW(5){public TrafficLamp nextLamp(){return RED;} };//定義表示換燈的抽象方法public abstract TrafficLamp nextLamp();//定義變量,表示亮燈時間private int time;//定義構造函數,初始化產生亮燈時間private TrafficLamp(int time){this.time = time;}} }




?-------------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

總結

以上是生活随笔為你收集整理的黑马程序员——Java基础知识——泛型、枚举的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。