【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类
文章目錄
- 1.Date類:getTime(),SimpleDateFormat
- 2.Calendar類:只有子類對象才能向上轉型
- 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.練習:map.keySet(),map.values(),map.entrySet()
- 10.內部類:.class文件,局部內部類(定義在一個方法里的類,只能當前方法內使用,其他方法不能使用)
- 11.匿名內部類:=接口實現(xiàn)類,打印對象
- 12.練習:接口的匿名內部類,沒有子類名
1.Date類:getTime(),SimpleDateFormat
package com.itheima02.date; import java.util.Date; /* * Date: 日期: 構造方法 * 1. Date() : 獲取電腦系統(tǒng)當前時間 * 2. Date(long time) : 時間原點 + time (毫秒) * 時間原點: 1970年1月1號 0時0分0秒 (unix 操作系統(tǒng))(0經度線) * 地理: 東八區(qū) + 8個小時 * 普通方法:long getTime(); 獲取當前時間-時間原點 (毫秒值) */ 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 默認已經加了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) : 用給定的模式和默認語言環(huán)境的日期格式符號構造 SimpleDateFormat。模式字母: 讓SimpleDateFormat知道 日期里的每個時間字段應該填充到模板哪個位置: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; // 案例: 你活了多少天?公式: 當前時間 - 你出生時間 (轉換成毫秒) public class LiveDemo {public static void main(String[] args) throws ParseException {// 1. 當前時間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);//將字符串轉換成Datelong birthTime = birthDate.getTime();long liveDay = (currentTime - birthTime) / 1000 / 3600 / 24;System.out.println("恭喜你,活了" + liveDay + "天了");} }2.Calendar類:只有子類對象才能向上轉型
package com.itheima02.date; import java.util.Calendar; import java.util.Date; /* * Calendar: 日歷類(取代Date類)是抽象類,不能實例化 * 1. static Calendar getInstance()使用默認時區(qū)和語言環(huán)境獲得一個日歷。(包含系統(tǒng)當前時間),是復雜版的new Date()GregorianCalendar 格里高利歷 (公歷): 歐洲 羅馬歷(儒略歷)。日本有自己歷法問題: 直接去創(chuàng)建 GregorianCalendar子類 , 這個日歷不適用日本這樣的國家,代碼不夠國際化2. 方法1. int get(int field) :返回給定日歷字段/屬性field的值。2. void set(int field, int value) :將給定的日歷字段設置為給定值。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)建了子類對象//為什么這樣設計?以前直接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(); //將日歷轉換為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)屬性可用類名.調用 // 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子類對象 (向上轉型)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. 因為構造方法是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 //鏈式編程: 某個環(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)屬性(因為類名.調用)* 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)當前時間毫秒值 * 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. 目標數(shù)組* @param destPos starting position in the destination data. 目標數(shù)組的開始位置* @param length the number of array elements to be copied. 將要被拷貝的數(shù)組元素個數(shù)* 數(shù)組: 長度不可變* ArrayList : 底層是數(shù)組, 但長度可變。因為底層原理和arraycopy方法有關*/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é)省內存:少創(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ù)相加并且和對象里所有屬性沒有關聯(lián),可以把這方法設計為靜態(tài)方法,用類名調用方便,不用創(chuàng)建無用對象浪費內存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)。
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): 向上轉型,都轉為Object類型ArrayList<Integer> list = new ArrayList<>(); //ArrayList<Integer>泛型里不可寫<int>基本數(shù)據(jù)類型list.add(1);list.add(2); // 自動裝箱成引用數(shù)據(jù)類型} } class Person{ }
hasNext()返回true就調用next(),迭代器不斷運行直到返回false。
s1地址先賦給s2,s2地址后又改變了。
7.泛型:類/接口/方法,運行看右邊
如下不用泛型。
如下沒有泛型存在安全問題,泛型就和overwrite注解一樣,要不要無所謂,要就檢查。
如下ArrayList < Object > 類型是ArrayList < String > 的父類嗎?不是,因為放動物(Object)籠子不能說是放狗(String)籠子的爸爸,本質都是籠子(ArrayList),但可以說動物是狗的父類。
8.泛型通配符:Fu,Zi,Sun是類/數(shù)據(jù)類型,extends
如下區(qū)分biglist和list。由于addAll(object類型的list),list是object,導致Fu fu報紅。但不應該為Fu fu報紅,應該addAll(list)報紅,所以紅色橫線用泛型通配符。
9.練習:map.keySet(),map.values(),map.entrySet()
public class TestGeneric { @Testpublic void test1(){ ArrayList list = new ArrayList(); //存本組學員的姓名,String對象list.add("張三");list.add("李四");list.add("王五");list.add(1); for (Object object : list) { //使用時,不知道我這里面是String類型,統(tǒng)統(tǒng)按照Object//每次使用元素時,可能需要強轉,很麻煩,好比每次打開瓶子,你需要聞一下String name = (String) object;//強轉有風險System.out.println("名字的長度:" + name.length());}} } package com.atguigu.test02; import java.util.ArrayList; import org.junit.Test; //泛型的好處:(1)安全(2)避免類型轉換 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("名字的字數(shù):" +name.length());}} } package com.atguigu.test03; import java.util.ArrayList; import java.util.Iterator; //把本組學員的姓名,存儲到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; /** 把本組學員的組長姓名作為key,組員的姓名作為value,多個組員用ArrayList裝起來, 放到HashMap中,正確指定泛型,并且遍歷。當如果出現(xiàn)泛型的嵌套,那么從外到內分析*/ 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("遍歷所有的學員:");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.內部類:.class文件,局部內部類(定義在一個方法里的類,只能當前方法內使用,其他方法不能使用)
package com.itheima05.innerclass; /* * 1. 定義在一個類A內部的另外一個類B, 那么A稱之為外部類, B稱之為內部類 * 內部類: 訪問受限(要通過外部來訪問內部) * * 2. 成員內部類: 定義一個類成員位置的類 (少見) * 1. 語法:外部類名.內部類名(聲明) 變量名 = 外部類對象.new 內部類(); * 2. 編譯:多了一個:OuterClass$InnerClass.class * * 3. */ public class InnerDemo { //有.class文件public static void main(String[] args) {class MethodClass{ //定義在main方法里稱為局部內部類 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{ //成員內部類 //有.class文件int innerFiled;void innerMethod(){}} }11.匿名內部類:=接口實現(xiàn)類,打印對象
package com.itheima05.innerclass; /* * 1. 匿名內部類 屬于 方法/局部內部類 的一種 * 2. 匿名內部類 沒有 類名 * 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 //第一個內部類有名字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(); //接口不能實例化,如下加方法體 // 父接口 變量 = 父接口子類對象 (向上轉型)Animal a = new Animal(){ //多了一個大括號,InnerDemo02$1.class 第二個內部類也是第一個匿名內部類用1@Overridepublic void shout() {System.out.println("嘎嘎叫"); }};voice(a); //嘎嘎叫//111111111111111111111111111111111111111111111111111111111111111111111111111111111// InnerDemo02$2.class //第三個內部類也是第二個匿名內部類用2Animal b = new Dog(){ //這樣寫也可以,同上@Overridepublic void shout() {System.out.println("呱呱叫");}};b.shout(); // 呱呱叫//1111111111111111111111111111111111111111111111111111111111111111111111111111111//匿名內部類的匿名對象,最簡潔 //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)要寫,匿名內部類不用@Overridepublic void shout() {System.out.println("汪汪叫");} }
如下這個類對象就用一次,沒必要取個名字,如果取名字還要單獨的.java文件。
12.練習:接口的匿名內部類,沒有子類名
子類特有方法不是子類重寫方法,如下2解決。
接口、抽象類可理解成是模糊不定的東西,要使用它的特質必須要實例化且實例化不能直接通過new。如下代碼不同于普通的實例化對象,而是通過new一個實現(xiàn)接口的匿名內部類Runnable,使用{}具體實現(xiàn)接口。
總結
以上是生活随笔為你收集整理的【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java5】String类,Strin
- 下一篇: 【Java7】练习:选角色,挑苹果,员工