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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类

發(fā)布時間:2024/4/24 java 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1.Date類:getTime(),SimpleDateFormat
  • 2.Calendar類:只有子類對象才能向上轉(zhuǎn)型
  • 3.System類:System.exit(0)
  • 4.Math類:ceil
  • 5.基本類型包裝類:工具類,Integer.parseInt(str),緩存池,深淺拷貝
  • 6.集合:單/雙例,Arrays.toString(array)
  • 7.泛型:類/接口/方法,運行看右邊
  • 8.泛型通配符:Fu,Zi,Sun是類/數(shù)據(jù)類型,extends
  • 9.練習(xí):map.keySet(),map.values(),map.entrySet()
  • 10.內(nèi)部類:.class文件,局部內(nèi)部類(定義在一個方法里的類,只能當(dāng)前方法內(nèi)使用,其他方法不能使用)
  • 11.匿名內(nèi)部類:=接口實現(xiàn)類,打印對象
  • 12.練習(xí):接口的匿名內(nèi)部類,沒有子類名


1.Date類:getTime(),SimpleDateFormat

package com.itheima02.date; import java.util.Date; /* * Date: 日期: 構(gòu)造方法 * 1. Date() : 獲取電腦系統(tǒng)當(dāng)前時間 * 2. Date(long time) : 時間原點 + time (毫秒) * 時間原點: 1970年1月1號 0時0分0秒 (unix 操作系統(tǒng))(0經(jīng)度線) * 地理: 東八區(qū) + 8個小時 * 普通方法:long getTime(); 獲取當(dāng)前時間-時間原點 (毫秒值) */ public class DateDemo {public static void main(String[] args) {Date date = new Date();//引用類型直接打印,理論打印地址值,但重寫toString方法如上System.out.println(date); //Fri Sep 25 21:06:39 CST 2020//new Date(0) //Thu Jan 01 08:00:00 CST 1970 默認(rèn)已經(jīng)加了8小時 Date date1 = new Date(-1000); System.out.println(date1); //Thu Jan 01 07:59:59 CST 1970 long time = date.getTime();System.out.println(time); //156.....秒System.out.println(time/1000/3600/24/365); //49年} //秒 小時 天 年 } package com.itheima02.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* * DateFormat : 日期格式化 * 1. 子類 * SimpleDateFormat(String pattern) : 用給定的模式和默認(rèn)語言環(huán)境的日期格式符號構(gòu)造 SimpleDateFormat。模式字母: 讓SimpleDateFormat知道 日期里的每個時間字段應(yīng)該填充到模板哪個位置:y,M,d(個數(shù)不重要,自動填充)...2. 方法1. String format(Date date) : 將一個 Date 格式化為日期/時間字符串。2. Date parse(String source) : 從給定字符串的開始解析文本,以生成一個日期(上面的反向方法) */ public class DateFormatDemo {public static void main(String[] args) throws ParseException {Date date = new Date();System.out.println(date); //Fri Sep 25 21:15:31 CST 2020SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");String format = sdf.format(date); System.out.println(format); //2020年09月25日 21時15分31秒String msg = "1995-02-25";SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");Date parse = sdf2.parse(msg);System.out.println(parse); // Sat Feb 25 00:00:00 CST 1995} } package com.itheima02.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; // 案例: 你活了多少天?公式: 當(dāng)前時間 - 你出生時間 (轉(zhuǎn)換成毫秒) public class LiveDemo {public static void main(String[] args) throws ParseException {// 1. 當(dāng)前時間Date date = new Date();long currentTime = date.getTime();// 2. 出生日期System.out.println("請輸入你的生日(yyyy-MM-dd)");Scanner sc = new Scanner(System.in);String timeStr = sc.nextLine();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date birthDate = sdf.parse(timeStr);//將字符串轉(zhuǎn)換成Datelong birthTime = birthDate.getTime();long liveDay = (currentTime - birthTime) / 1000 / 3600 / 24;System.out.println("恭喜你,活了" + liveDay + "天了");} }

2.Calendar類:只有子類對象才能向上轉(zhuǎn)型

package com.itheima02.date; import java.util.Calendar; import java.util.Date; /* * Calendar: 日歷類(取代Date類)是抽象類,不能實例化 * 1. static Calendar getInstance()使用默認(rèn)時區(qū)和語言環(huán)境獲得一個日歷。(包含系統(tǒng)當(dāng)前時間),是復(fù)雜版的new Date()GregorianCalendar 格里高利歷 (公歷): 歐洲 羅馬歷(儒略歷)。日本有自己歷法問題: 直接去創(chuàng)建 GregorianCalendar子類 , 這個日歷不適用日本這樣的國家,代碼不夠國際化2. 方法1. int get(int field) :返回給定日歷字段/屬性field的值。2. void set(int field, int value) :將給定的日歷字段設(shè)置為給定值。3. void add(int field, int amount) :根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時間量。4. Date getTime() :返回一個表示此Calendar時間值(從歷元到現(xiàn)在的毫秒偏移量)的Date對象 */ public class CalendarDemo {public static void main(String[] args) { // method01(); // get(); // set();//.getInstance()是一個靜態(tài)方法,源碼里面肯定創(chuàng)建了子類對象//為什么這樣設(shè)計?以前直接new子類對象,因為兼容日本等國Calendar c = Calendar.getInstance(); //這一行代碼在中國電腦跑公歷,在日本跑日本歷System.out.println(c); //一大段字母:java.util.GregorianCalendar[...] c.add(Calendar.DAY_OF_MONTH,-30); System.out.println(c); //一大段字母:java.util.GregorianCalendar[...] Date time = c.getTime(); //將日歷轉(zhuǎn)換為DateSystem.out.println(time); //Wed Aug 26 21:31:24 CST 2020} private static void set() {//重置時間: 2008-08-08Calendar c = Calendar.getInstance();c.set(Calendar.YEAR,2008);c.set(Calendar.MONTH,7);c.set(Calendar.DAY_OF_MONTH,8);System.out.println(c);} private static void get() {Calendar c = Calendar.getInstance();int year = c.get(Calendar.YEAR); //2019,靜態(tài)屬性可用類名.調(diào)用 // int year = c.get(1); //2019int month = c.get(Calendar.MONTH) + 1; //9 //幾月int day = c.get(Calendar.DAY_OF_MONTH); //7 //幾號System.out.println(year + "-" + month + "-" + day);} private static void method01() {//Calendar c = Calendar子類對象 (向上轉(zhuǎn)型)Calendar c = Calendar.getInstance();System.out.println(c);} }

3.System類:System.exit(0)

package com.itheima03.system; /* * System : 系統(tǒng)類很重要不讓隨便修改,java.lang.System。 * 1. System類用final修飾不能被繼承【final修飾的類不能被繼承但能new,如String】。 * 2. 因為構(gòu)造方法是private,所以不能實例化。 * 3. 屬性和方法全靜態(tài)(灰色方片),外部才能訪問 */ public class SystemDemo {public static void main(String[] args) { /* String s = new String("abc"); //一般String s = "abc"String uc = s.toUpperCase();int length = uc.length();System.out.println(length);*/ //打印出3 //鏈?zhǔn)骄幊? 某個環(huán)節(jié)的屬性和方法是屬于誰的, 只要看上一個環(huán)節(jié)方法返回值和屬性類型int length = new String("abc").toUpperCase().length(); System.out.println(length); //3String xx = Person.name;Person.name.length(); //.length()看name類型是string就不報錯System.out.println(xx.length()); //3System.out.println(Person.name.length()); //3/** System : 類* out : 靜態(tài)屬性(因為類名.調(diào)用)* println() : 屬于out的方法(out是PrintStream類型)* out方法定義在System.java中,println方法定義在PrintStream.java中*/System.out.println("abc");} } class Person{static String name = "abc"; } package com.itheima03.system; import java.util.Arrays; import java.util.Date; /* * System類方法:1. static long currentTimeMills(); 獲取系統(tǒng)當(dāng)前時間毫秒值 * 2. exit(0); 退出JVM,意味著程序中止運行 (0表示正常退出, 非0異常退出) * 3. arrayCopy() : 將A數(shù)組的元素賦值到B數(shù)組,源碼里才會看到 */ public class SystemDemo2 {public static void main(String[] args) {// method01();/* System.arraycopy看源碼,參數(shù)如下* @param src the source array. 源數(shù)組* @param srcPos starting position in the source array. 源數(shù)組的開始位置* @param dest the destination array. 目標(biāo)數(shù)組* @param destPos starting position in the destination data. 目標(biāo)數(shù)組的開始位置* @param length the number of array elements to be copied. 將要被拷貝的數(shù)組元素個數(shù)* 數(shù)組: 長度不可變* ArrayList : 底層是數(shù)組, 但長度可變。因為底層原理和arraycopy方法有關(guān)*/int[] src = {1,2,3,4,5};int[] dest = {6,7,8,9,0};System.arraycopy(src,2,dest,0,3);String str = Arrays.toString(dest); //[6,7,8,9,0]System.out.println(str);//[3,4,5,9,0]}private static void method01() {long time = System.currentTimeMillis(); //節(jié)省內(nèi)存:少創(chuàng)建new對象System.out.println(time);//150000...long time1 = new Date().getTime();System.out.println(time1);//同上while(true){System.out.println("xx");System.exit(0); //終止死循環(huán)}} }

4.Math類:ceil

package com.itheima04.math; /* //Math類 里面方法基本是靜態(tài)的。方法涉及兩數(shù)相加并且和對象里所有屬性沒有關(guān)聯(lián),可以把這方法設(shè)計為靜態(tài)方法,用類名調(diào)用方便,不用創(chuàng)建無用對象浪費內(nèi)存1. public static int abs(int a) 返回參數(shù)的絕對值 (absolute) 2. public static double ceil(double a) 返回大于或等于參數(shù)的最小double值,等于一個整數(shù)天花板 向上取整3. public static double floor(double a) 返回小于或等于參數(shù)的最大double值,等于一個整數(shù)地板 向下取整4. public static int round(float a) 按照四舍五入返回最接近參數(shù)的int5. public static int max(int a,int b) 返回兩個int值中的較大值6. public static int min(int a,int b) 返回兩個int值中的較小值7. public static double pow (double a,double b) 返回a的b次冪的值。a底數(shù) b是指數(shù)8. public static double random() 返回值為double的正值,[0.0,1.0) 偽隨機數(shù) */ public class MathDemo {public static void main(String[] args) {int abs = Math.abs(0);System.out.println(abs); //0double d = 1.51; long round = Math.round(d); //四舍五入,底層取余數(shù)System.out.println(round); // 2double d2 = -2.1;double ceil = Math.ceil(d2); //向上取整,底層取余再+0.5再四舍五入System.out.println(ceil); // -2.0double floor = Math.floor(d2); //向下取整System.out.println(floor); // -3.0int a = 2;int b = 3;int max = Math.max(a, b);// 底層return a > b ? a : b;System.out.println(max); //3int min = Math.min(a, b);System.out.println(min); //2double pow = Math.pow(2, 10);System.out.println(pow); //1024double random = Math.random();System.out.println(random); // 0-1之間} }

5.基本類型包裝類:工具類,Integer.parseInt(str),緩存池,深淺拷貝

package com.itheima00.question; /*I love javame 2 */ public class ToStringTest {static int i = 1;public static void main(String args[]) {System.out.println("love " + new ToStringTest()); // string + object.toString() = string //解釋上行,先走toString()打印出"I" //終極規(guī)則:string + object = string// love + java //因為new ToStringTest()返回toString()(下面有寫)即"java "ToStringTest a = new ToStringTest();a.i++; // 2 (靜態(tài)變量i被該類所有對象所共享)System.out.println("me " + ToStringTest.i); //類名.i} public String toString() {System.out.print("I ");return "java ";} }

如下三個工具類有個特點即方法都靜態(tài)。

package com.itheima01.pack; import java.util.Scanner; /*場景: 控制臺/網(wǎng)頁 輸入的所有內(nèi)容 對java程序都是字符串面向?qū)ο? 解決問題,找到對象,然后調(diào)用方法來解決問題我/貓 打開 門打開行為 屬于 門* 基本類型包裝類 * 1. 需求: 類型轉(zhuǎn)換 : String - > int * 2. 問題: int 基本類型 (沒有屬性和方法即沒有打開行為),預(yù)定義在jvm虛擬機中,連包都沒有 * 3. Integer 引用類型,這樣可以面向?qū)ο笤O(shè)置一些方法parseInt(),將類型轉(zhuǎn)換方法設(shè)置到Integer中 * * 基本: byte short int long float double char boolean * 引用: Byte Short Integer Long Float Double Character Boolean (只有int,char不對應(yīng)) * 目的: 提供 string 轉(zhuǎn)化成相應(yīng)基本類型的方法。Integer:static int parseInt(String str) : 將字符串解析成int */ public class PackDemo {public static void main(String[] args) {// method01();String str = "100";int count = Integer.parseInt(str);//Integer是類即引用類型,parseInt靜態(tài)方法,參數(shù)是字符串,返回int// long l = Long.parseLong(str); // parse解析System.out.println(count + 1); //101}private static void method01() {System.out.println("請輸入你的余額:");Scanner sc = new Scanner(System.in); // String str = sc.next(); // int s = Integer.parseInt(str); //String->int ,別的類型轉(zhuǎn)為我自己int類型,方法設(shè)在int上int s = sc.nextInt(); //nextInt()底層就是上面兩行System.out.println(s + 1);//101} } package com.itheima01.pack; /* * JDK1.5特性: 自動拆箱 : 在運算過程, Integer -> int * 自動裝箱 : 在賦值過程, int -> Integer */ public class PackDemo02 {public static void main(String[] args) { // method01();Integer i1 = new Integer(200);Integer i2 = new Integer(200);System.out.println(i1 == i2);//false new出來:比的是地址System.out.println(i1.equals(i2)); //true,Integer重寫了equalsInteger i3 = 200; // 自動裝箱 int ->Integer(Integer是引用數(shù)據(jù)類型有地址)Integer i4 = 200; // 同上,這樣i4可以調(diào)用toString,compareTo,intValue(很少用,用自動拆箱)等方法System.out.println(i3 == i4); //falseSystem.out.println(i3.equals(i4)); //true /** Integer內(nèi)部緩存池: cache* -128 ~ 127(byte取值范圍) 最常用(6種數(shù)據(jù)類型都包含這范圍)* 1. 如果創(chuàng)建一個Integer對象,那么先去緩存池中看看,有沒有這個對象* 2. 如果沒有,就創(chuàng)建這個對象。如果有, 就直接返回這個對象*/Integer i5 = 100; // 0x0001 緩存池Integer i6 = 100; // 0x0001,i6.valueof點進源碼可看見 System.out.println(i5 == i6);//true i5和i6的地址是一樣System.out.println(i5.equals(i6));//true}private static void method01() {//Integer i = new Integer(200); //Integer作為一個引用類型應(yīng)該要去newInteger i = 200;// 自動裝箱,等于上行,200基本類型自動變?yōu)閷ο蠹匆妙愋?/span>int y = i + 1; // 自動拆箱System.out.println(y);//201} }

Integer i = 10; //裝箱 int n = i; //拆箱

// return在無返回值方法的特殊使用 public void f5(int a) {if (a > 10) {return;//表示結(jié)束所在方法 (f5方法)的執(zhí)行,下方的輸出語句不會執(zhí)行}System.out.println(a); }

6.集合:單/雙例,Arrays.toString(array)

package com.itheima02.container; import java.util.ArrayList; // java容器:1. 數(shù)組 2. 集合(變,只對,不) public class ContainerDemo {public static void main(String[] args) {int[] array = {1,2,3};Person[] array2 = {new Person(),new Person()};String[] array3 = {"abc","bcd"};Object[] array4 = {"abc",new Person()}; //多態(tài): 向上轉(zhuǎn)型,都轉(zhuǎn)為Object類型ArrayList<Integer> list = new ArrayList<>(); //ArrayList<Integer>泛型里不可寫<int>基本數(shù)據(jù)類型list.add(1);list.add(2); // 自動裝箱成引用數(shù)據(jù)類型} } class Person{ }


package com.itheima03.collection; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; /*collection(東西收集在一起就是集合)常用方法 (不帶索引),以下方法是所有集合都具備1. add1. 添加元素,返回值boolean,成功為true2. list中元素可重復(fù),故恒為true。set中元素不可重復(fù),有可能為false2. clear1. 清空集合中的所有元素。集合容器本身不會改變,繼續(xù)使用3. remove1. 移除集合中的單個實例(參數(shù)obj),移除成功返回true4. isEmpty1. 判斷當(dāng)前集合的元素個數(shù)是否為05. contains1. 包含某個元素,如果有返回true,區(qū)分大小寫6. size1. 獲取大小7. toArray1. 集合中的元素,變成數(shù)組。集合存儲的數(shù)據(jù)類型不確定,返回的數(shù)組只能是Object */ public class CollectionDemo {public static void main(String[] args) {// method01(); //如下把Collection改為ArrayList,則coll.set就會有ArrayList特有的方法,Collection沒有Collection<String> coll = new ArrayList<>();//Collection是接口,不能實例化,所以只能創(chuàng)建子類對象coll.add("張三");coll.add("李四");coll.add("王五");//將集合中所有的元素放到數(shù)組中,數(shù)組有索引Object[] objects = coll.toArray();for (int i = 0; i < objects.length; i++) {Object element = objects[i];System.out.println(element);}}private static void method01() {//如下行編譯看左邊: 父類無法調(diào)用子類特有的方法(可調(diào)用子類重寫的方法)。所以把學(xué)習(xí)的方法限制于Collection集合內(nèi),不會用到ArrayList特有的方法Collection<String> coll = new ArrayList<>(); //ArrayList改為HashSet,則若加add兩個張三則報錯coll.add("張三");coll.add("李四");coll.add("王五");boolean result = coll.add("馬六"); //添加成功返回true,失敗為false(基本沒用)System.out.println(result);System.out.println(coll);//[張三,李四...]引用類型打印不是內(nèi)存地址必然重寫了toString方法//coll.clear(); //清空集合中所有的元素//System.out.println(coll); //[] 空籃子//System.out.println(coll == null); // false 籃子還在boolean result2 = coll.remove("馬六"); //移除成功返回true(基本沒用)System.out.println(result2);System.out.println(coll);System.out.println(coll.size()); // 3System.out.println(coll.isEmpty()); //false//如果集合中包含某個元素,就返回trueboolean result3 = coll.contains("李四");System.out.println(result3);} }

hasNext()返回true就調(diào)用next(),迭代器不斷運行直到返回false。

package com.itheima04.iterator; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * 遍歷: 全部經(jīng)歷 * 迭代: 相同的動作不斷執(zhí)行。版本迭代:開發(fā) -> 測試 -> 上線 1.0。開發(fā) -> 測試 -> 上線 2.0 ... * * 迭代器 : 不斷循環(huán)的機器 iterator * 1. boolean hasNext(); 判斷是否有下一個元素,如果有,就返回true * 2. 元素 next(); 向后移動一位,并獲取當(dāng)前元素 * * Collection方法,如下E是泛型返回值 * Iterator<E> iterator() : 返回在此collection的元素上進行迭代的迭代器。 * 以前for循環(huán)基于索引,Collection沒有索引,但有迭代器好用 */ public class IteratorDemo {public static void main(String[] args) { // method01();Collection<String> coll = new ArrayList<>();coll.add("張三");coll.add("李四");coll.add("王五");Iterator<String> it = coll.iterator();while(it.hasNext()){ //while取代下面的幾次if循環(huán)String name = it.next();System.out.println(name);}}private static void method01() {Collection<String> coll = new ArrayList<>();coll.add("張三");coll.add("李四");coll.add("王五");//獲取collection集合的迭代器(相當(dāng)于指針)Iterator<String> it = coll.iterator();//第一次迭代if (it.hasNext()){String name = it.next(); System.out.println(name); //張三}//第二次迭代if (it.hasNext()){String name = it.next(); System.out.println(name);//李四}//第三次迭代if (it.hasNext()){String name = it.next();System.out.println(name); //王五}//第四次迭代,it.hasNext()返回falseif (it.hasNext()){String name = it.next();System.out.println(name);}} }

s1地址先賦給s2,s2地址后又改變了。

package com.itheima05.foreach; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; /* * 增強for循環(huán): * 1. 前置 * 1. 普通for循環(huán) : fori快捷鍵 * for (int i = 0; i < 10; i++) {list.set(i,"馬六"); //可以修改}2. 語法糖(syntax sugar) : 原理相同,但是更為簡練的語法2. for...each 快捷鍵array.for1. 集合 : 作為迭代器的語法糖collecition支持增強for循環(huán)語法:for(元素類型 變量名 : 被遍歷的集合){}代價: 只適合用來查 (不適合用來修改集合內(nèi)容)2. 數(shù)組 : 作為普通for循環(huán)的語法糖 */ public class ForeachDemo {public static void main(String[] args) {// method01();int[] array = {1, 2, 3};/* for (int i = 0; i < array.length; i++) {int element = array[i];element = 10;System.out.println(element); //10array[i] = 10;System.out.println(array.toString()); //[I@14ae5a5System.out.println(Arrays.toString(array)); // [10, 2, 3],[10, 10, 3],[10, 10, 10]}System.out.println(Arrays.toString(array)); //[10, 10, 10] */for (int element : array) { //1System.out.println(element); //2} //3 System.out.println(Arrays.toString(array)); //[1,2,3]}private static void method01() {Collection<String> coll = new ArrayList<>();coll.add("張三");coll.add("李四");coll.add("王五"); /* Iterator<String> it = coll.iterator();while(it.hasNext()){String name = it.next(); //這行相當(dāng)于get方法name = "馬六";System.out.println(name); //馬六 馬六 馬六}System.out.println(coll); //依然還是[張三,李四,王五] */ //下面代碼稱為上面代碼語法糖,匿名內(nèi)部類也是語法糖,將定義類和創(chuàng)建對象合二為一。for(String name : coll){ //name會被coll里面的每一個元素循環(huán)賦值//System.out.println(name);name = "馬六";}System.out.println(coll); //依然還是[張三,李四,王五]} }

7.泛型:類/接口/方法,運行看右邊


如下不用泛型。

如下沒有泛型存在安全問題,泛型就和overwrite注解一樣,要不要無所謂,要就檢查。

/* * 1. 為什么要使用泛型? * 1. 一般的需求, 一個集合都是用來同一種類型的數(shù)據(jù) , 早期是沒有泛型的, 意味著集合可以存任意引用類型 * 2. 這樣就帶來一個問題: 但凡需要用來子類特有方法, 集合類型為Object,都需要向下轉(zhuǎn)型(強轉(zhuǎn)) * -> 風(fēng)險: 類型轉(zhuǎn)換異常 (運行的時候) * 3. 泛型: 給集合設(shè)置泛型, 那么這個集合就會在編譯時候發(fā)現(xiàn)運行時期才發(fā)現(xiàn)的問題 * 先編譯 后運行。泛型: 安全預(yù)警機制, 不是強制使用, 一般都會用 * * 2. java里的泛型 是 偽泛型 :java泛型只存在編譯時期(泛型擦除), 不存在運行時期 */


如下ArrayList < Object > 類型是ArrayList < String > 的父類嗎?不是,因為放動物(Object)籠子不能說是放狗(String)籠子的爸爸,本質(zhì)都是籠子(ArrayList),但可以說動物是狗的父類。

package com.itheima06.generic; import java.util.ArrayList;public class GenericClassDemo {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(100); Integer integer = list.get(0); //0為int index //如上add,get只能是Integer,原因如下://對mc來說, 在創(chuàng)建對象時, T=StringMyClass<String> mc = new MyClass<>();mc.add("abc"); //對mc2來說, 在創(chuàng)建對象時, T=IntegerMyClass<Integer> mc2 = new MyClass<>();mc2.add(1);} } /* * 泛型類: 1. class 類名<泛型變量>{ } * 泛型變量 一般為單個大寫字母 * 2. 泛型T 變量 , 只能賦值引用類型 String,Integer... * 3. 創(chuàng)建對象的時候,對T 進行賦值 * 4. 某個泛型類對象 T賦值為String,那么這個對象中所有的T=String */ class MyClass<T>{ public void add(T str){ //str隨便寫 } } package com.itheima06.generic; import java.util.ArrayList; import java.util.Properties; /* * 泛型接口: interface 接口名<泛型變量>{ } * 類實現(xiàn)泛型接口:1.繼續(xù)向下傳遞泛型 2.直接對泛型進行賦值,不再向下傳遞 */ public class GenericInterfaceDemo {public static void main(String[] args) {new Properties(); //ctrl+左鍵進去看源碼 //Properties類是Properties文件和程序的中間橋梁,不論是從properties文件讀信息還是寫信息到properties文件都要經(jīng)由Properties類} } interface MyInter<Q>{void add(Q q); } class MyClass01<Q> implements MyInter<Q>{ //繼續(xù)向下傳遞泛型 //eg: ArrayList類@Overridepublic void add(Q q) { //一個類實現(xiàn)接口必須重新給方法} } class MyClass02 implements MyInter<String>{ //Q賦值為String //eg: Property類@Overridepublic void add(String s) {} } package com.itheima06.generic; import java.util.ArrayList; /* * 泛型方法: 修飾符 <泛型變量> 返回值 方法名(參數(shù)列表){ * } * 1. 泛型變量在調(diào)用此方法的時候進行賦值 * 2. 泛型變量只可本方法內(nèi)部 * 需求: 請你設(shè)計一個方法 既能接收list1,又能接收list2 */ public class GenericMethodDemo {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>();ArrayList<Integer> list2 = new ArrayList<>();MyClass03.method00(list1); // P = StringMyClass03.method00(list2); // P = Integer} } class MyClass03{public static <P>void method00(ArrayList<P> list){ //寫成ArrayList<Object> list不行,藍子間沒繼承關(guān)系。//ArrayList<Object>類型不是ArrayList<Integer>類型的父類,運行擦除泛型可以通過但在編譯一開始就不能通過。} }

8.泛型通配符:Fu,Zi,Sun是類/數(shù)據(jù)類型,extends

如下區(qū)分biglist和list。由于addAll(object類型的list),list是object,導(dǎo)致Fu fu報紅。但不應(yīng)該為Fu fu報紅,應(yīng)該addAll(list)報紅,所以紅色橫線用泛型通配符。


package com.itheima06.generic; import java.util.ArrayList; /* * 泛型通配符 : ?(表示一個范圍) * 1. ? extends Fu : Fu及其子類 (上限) * 2. ? super XX : XX及其父類 (下限) */ public class GenericSymbolDemo {public static void main(String[] args) {ArrayList<Fu> fuList = new ArrayList<>();ArrayList<Zi> ziList = new ArrayList<>();ArrayList<Sun> sunList = new ArrayList<>();ArrayList<Object> objList = new ArrayList<>();addAll(fuList);addAll(ziList);addAll(sunList);//addAll(objList); //編譯不通過,放不進}/** 方法: 內(nèi)部有個內(nèi)部有個bigList, 想要把參數(shù)(集合)中的所有元素都吸納* 內(nèi)部有個bigList : ArrayList<Fu> : 吸納 : Fu 及其子類 的元素類型集合*/private static void addAll(ArrayList<? extends Fu> list) {ArrayList<Fu> bigList = new ArrayList<>(); // bigList.add(new Fu()); // bigList.add(new Zi()); //向上轉(zhuǎn)型 // bigList.add(new Sun()); //向上轉(zhuǎn)型for (Fu fu : list) {bigList.add(fu);}} } class Fu{ } class Zi extends Fu{ } class Sun extends Zi{ }

9.練習(xí):map.keySet(),map.values(),map.entrySet()

public class TestGeneric { @Testpublic void test1(){ ArrayList list = new ArrayList(); //存本組學(xué)員的姓名,String對象list.add("張三");list.add("李四");list.add("王五");list.add(1); for (Object object : list) { //使用時,不知道我這里面是String類型,統(tǒng)統(tǒng)按照Object//每次使用元素時,可能需要強轉(zhuǎn),很麻煩,好比每次打開瓶子,你需要聞一下String name = (String) object;//強轉(zhuǎn)有風(fēng)險System.out.println("名字的長度:" + name.length());}} } package com.atguigu.test02; import java.util.ArrayList; import org.junit.Test; //泛型的好處:(1)安全(2)避免類型轉(zhuǎn)換 public class TestGood {@Testpublic void test1(){ArrayList<String> list = new ArrayList<String>();list.add("張三");list.add("李四");list.add("王五"); // list.add(1);//編譯報錯,因為我告訴ArrayList,我的元素類型是String,所以Integer對象進不去 //此時不需要用Object處理了,因為它知道里面的元素是Stringfor (String name : list) {System.out.println("名字的字?jǐn)?shù):" +name.length());}} } package com.atguigu.test03; import java.util.ArrayList; import java.util.Iterator; //把本組學(xué)員的姓名,存儲到ArrayList集合中,并且指定泛型,并且要使用foreach和Iterator分別迭代,也要正確指定泛型 public class TestExer1 {public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); //姓名,泛型指定為String list.add("楊洪強");list.add("蘇海波");list.add("甄玉祿");System.out.println("foreach迭代");for (String name : list) {System.out.println(name);}System.out.println("Iterator迭代"); //Iterator<E>這個E代表你要迭代的集合的元素類型Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String name = iterator.next();System.out.println(name);}} }

package com.atguigu.test03; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; /** 把本組學(xué)員的組長姓名作為key,組員的姓名作為value,多個組員用ArrayList裝起來, 放到HashMap中,正確指定泛型,并且遍歷。當(dāng)如果出現(xiàn)泛型的嵌套,那么從外到內(nèi)分析*/ public class TestExer2 {public static void main(String[] args) { //HashMap<K,V>:K代表key的類型,V代表value的類型 //組長姓名作為key,說明K是String。組員的姓名作為value,多個組員用ArrayList裝起來,說明V是ArrayList類型 //因為ArrayList也是泛型類,ArrayList中裝的是組員的姓名,所以是String類型HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); ArrayList<String> group1 = new ArrayList<String>();group1.add("楊洪強");group1.add("蘇海波"); map.put("楊洪強", group1); //組長:楊洪強ArrayList<String> group8 = new ArrayList<String>();group8.add("崔志恒");group8.add("甄玉祿");group8.add("杜冠軍"); map.put("崔志恒", group8); //組長:崔志恒System.out.println("遍歷所有的組長:");Set<String> keySet = map.keySet();for (String zuZhang : keySet) {System.out.println(zuZhang);}System.out.println("遍歷所有的學(xué)員:");Collection<ArrayList<String>> values = map.values();for (ArrayList<String> group : values) {System.out.println(group);}System.out.println("遍歷每一組的情況:");Set<Entry<String, ArrayList<String>>> entrySet = map.entrySet();for (Entry<String, ArrayList<String>> entry : entrySet) {System.out.println(entry);}} }

10.內(nèi)部類:.class文件,局部內(nèi)部類(定義在一個方法里的類,只能當(dāng)前方法內(nèi)使用,其他方法不能使用)

package com.itheima05.innerclass; /* * 1. 定義在一個類A內(nèi)部的另外一個類B, 那么A稱之為外部類, B稱之為內(nèi)部類 * 內(nèi)部類: 訪問受限(要通過外部來訪問內(nèi)部) * * 2. 成員內(nèi)部類: 定義一個類成員位置的類 (少見) * 1. 語法:外部類名.內(nèi)部類名(聲明) 變量名 = 外部類對象.new 內(nèi)部類(); * 2. 編譯:多了一個:OuterClass$InnerClass.class * * 3. */ public class InnerDemo { //有.class文件public static void main(String[] args) {class MethodClass{ //定義在main方法里稱為局部內(nèi)部類 int methodField;void method(){}} MethodClass mc = new MethodClass(); //上面的類mc.methodField = 1;mc.method();}public static void method01(){OuterClass oc = new OuterClass(); //main方法外面即下面的類oc.outerField = 1; //屬性oc.outerMethod(); //方法OuterClass.InnerClass ic = oc.new InnerClass(); //main方法外面即下面的類ic.innerFiled = 2;ic.innerMethod(); // MethodClass mc = new MethodClass(); //錯誤,不能訪問} }class OuterClass{ //外部類 //有.class文件int outerField; //成員void outerMethod(){ } class InnerClass{ //成員內(nèi)部類 //有.class文件int innerFiled;void innerMethod(){}} }

11.匿名內(nèi)部類:=接口實現(xiàn)類,打印對象

package com.itheima05.innerclass; /* * 1. 匿名內(nèi)部類 屬于 方法/局部內(nèi)部類 的一種 * 2. 匿名內(nèi)部類 沒有 類名 * 3. 目的 : 簡化代碼編寫 * new 父類/父接口() { //class body 即類體 * 如果有抽象方法,必須重寫 * } * 創(chuàng)建出來的是父類/父接口的子類對象 * 原理: 定義類+創(chuàng)建對象 合二為一 */ public class InnerDemo02 {public static void main(String[] args) {Dog twoHa = new Dog(); //Animal twoHa = new Dog();也可以即多態(tài)voice(twoHa); //汪汪叫//11111111111111111111111111111111111111111111111111111111111111111111111111111 //InnerDemo02$Wolf.class //第一個內(nèi)部類有名字Wolf class Wolf implements Animal{ //以前這類寫在main方法外 //定義類@Overridepublic void shout() {System.out.println("嗷嗷叫");}}Wolf greyTai = new Wolf(); //創(chuàng)建對象voice(greyTai); //嗷嗷叫//111111111111111111111111111111111111111111111111111111111111111111111111111111111/** 類名如dog,wolf其實在某些場景下一定都不重要,重要的類體(重寫shout方法)* 語法: 多了個類體,但是把類名隱藏掉了叫匿名* 省略: 1. 以前: 定義類 然后 創(chuàng)建對象* 2. 現(xiàn)在: 創(chuàng)建對象+定義類 合二為一*/// Animal a = new Animal(); //接口不能實例化,如下加方法體 // 父接口 變量 = 父接口子類對象 (向上轉(zhuǎn)型)Animal a = new Animal(){ //多了一個大括號,InnerDemo02$1.class 第二個內(nèi)部類也是第一個匿名內(nèi)部類用1@Overridepublic void shout() {System.out.println("嘎嘎叫"); }};voice(a); //嘎嘎叫//111111111111111111111111111111111111111111111111111111111111111111111111111111111// InnerDemo02$2.class //第三個內(nèi)部類也是第二個匿名內(nèi)部類用2Animal b = new Dog(){ //這樣寫也可以,同上@Overridepublic void shout() {System.out.println("呱呱叫");}};b.shout(); // 呱呱叫//1111111111111111111111111111111111111111111111111111111111111111111111111111111//匿名內(nèi)部類的匿名對象,最簡潔 //InnerDemo02$3.classvoice(new Animal() {@Overridepublic void shout() {System.out.println("喵喵叫"); // 喵喵叫}});} private static void voice(Animal a) { //Animal接口, 接口不能實例化a.shout();} }//111111111111111111111111111111111111111111111111111111111111111111111111111 interface Animal{ //一般不用abstract Animalvoid shout(); //叫 } class Dog implements Animal{ //多態(tài)要寫,匿名內(nèi)部類不用@Overridepublic void shout() {System.out.println("汪汪叫");} }


如下這個類對象就用一次,沒必要取個名字,如果取名字還要單獨的.java文件。

12.練習(xí):接口的匿名內(nèi)部類,沒有子類名

子類特有方法不是子類重寫方法,如下2解決。

package com.atguigu.test10; /* (1)聲明一個抽象類Father,包含抽象方法:public abstract void method(); (2)用匿名內(nèi)部類繼承Father,并重寫抽象方法,打印“hello 孩子"。并調(diào)用子類對象的method方法 */ public class TestExer3 {public static void main(String[] args) {/*new Father(){public void method(){System.out.println("hello 孩子");}}.method();*/// 上下一樣Father f = new Father(){public void method(){System.out.println("hello 孩子");}};f.method(); //hello 孩子} } abstract class Father{public abstract void method(); }

接口、抽象類可理解成是模糊不定的東西,要使用它的特質(zhì)必須要實例化且實例化不能直接通過new。如下代碼不同于普通的實例化對象,而是通過new一個實現(xiàn)接口的匿名內(nèi)部類Runnable,使用{}具體實現(xiàn)接口。

package com.atguigu.test10; import java.util.Arrays; import java.util.Comparator;public class TestExer4 {@SuppressWarnings("all")public static void main(String[] args) {//(2)在測試類中創(chuàng)建Employee數(shù)組Employee[] all = new Employee[3];all[0] = new Employee(2, "張三", 10000);all[1] = new Employee(1, "李四", 30000);all[2] = new Employee(3, "王五", 20000); //(3)分別調(diào)用Arrays.sort(數(shù)組,Comparator),用匿名內(nèi)部類實現(xiàn)按照編號升序排列,接口一定要重寫方法Arrays.sort(all, new Comparator(){@Overridepublic int compare(Object o1, Object o2) {Employee e1 = (Employee) o1;Employee e2 = (Employee) o2;return e1.getId() - e2.getId();} });for (int i = 0; i < all.length; i++) {System.out.println(all[i]);}// (4)分別調(diào)用Arrays.sort(數(shù)組,Comparator),用匿名內(nèi)部類實現(xiàn)按照薪資升序排列Arrays.sort(all , new Comparator() {@Overridepublic int compare(Object o1, Object o2) {Employee e1 = (Employee) o1;Employee e2 = (Employee) o2; if(e1.getSalary() > e2.getSalary()){return 1;}else if(e1.getSalary() < e2.getSalary()){return -1;}return 0;}});for (int i = 0; i < all.length; i++) {System.out.println(all[i]);}} }//(1)聲明一個員工類Employee,有屬性:編號、姓名、薪資 class Employee{private int id;private String name;private double salary;public Employee(int id, String name, double salary) {super();this.id = id;this.name = name;this.salary = salary;}public Employee() {super();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}@Overridepublic String toString() {return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";} }


與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。