- Object類 & System類
- 日期相關類
- 包裝類 & 正規表達式
Object類 & System類
1.1 Object類
1.1.1 概述
Object類是Java語言中的根類,即所有類的父類。它中描述的所有方法子類都可以使用。所有類在建立對象的時候,最終找的父類就是Object。
在Object類衆多方法中,我們先學習equals方法與toString方法,其他方法後面課程中會陸續學到。
1.1.2 擷取位元組碼對象的方式
1.通過Object類的getClass()方法擷取
2.通過類名調用屬性class來擷取
3. 通過Class類的靜态方法forName()來擷取
1.1.2.1 案例代碼一:
package com.gao_01;
public class Teacher {
private String name;
private int age;
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.itheima_01;
/*
* 擷取位元組碼對象的方式
*
* 反射
*/
public class ClassDemo {
public static void main(String[] args) throws ClassNotFoundException {
//方式1 通過Object類的getClass()方法擷取
Teacher t = new Teacher();
Class clazz = t.getClass();
//System.out.println(clazz);//包含了全路徑的類名
//方式2 通過類名調用屬性class來擷取
Class clazz2 = Teacher.class;
//方式3 通過Class類的靜态方法forName()來擷取
Class clazz3 = Class.forName("com.itheima_01.Teacher");
//System.out.println(clazz == clazz2);
//System.out.println(clazz == clazz3);
Teacher t2 = new Teacher();
System.out.println(t.getClass() == t2.getClass());
}
}
1.1.3 toString()方法
toString () 傳回該對象的字元串表示
由于toString方法傳回的結果是記憶體位址,而在開發中,經常需要按照對象的屬性得到相應的字元串表現形式,是以也需要重寫它。
1.1.3.1 案例代碼二:
package com.gao_01;
/*
* String toString() : 傳回該對象的字元串表示
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* getClass():傳回一個位元組碼對象
* Integer.toHexString():傳回指定參數的十六進制字元串形式
* hashCode():傳回該對象的哈希碼值(内部位址)
*
*
*
* boolean equals(Object obj)
*
*/
public class ObjectDemo {
public static void main(String[] args) {
Student s = new Student();
s.name = "zhangsan";
s.age = 18;
System.out.println(s.toString());//com.itheima_01.Student@737951b0
System.out.println(s);//說明我們輸出一個對象就是預設輸出這個對象的toString()方法
}
}
class Student extends Object {
String name;
int age;
/*
public String toString() {
return name + "@" + age;
}
*/
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
1.1.4 equals()方法
equals(Object obj) 訓示其他某個對象是否與此對象“相等”。
equals方法,用于比較兩個對象是否相同,它其實就是使用兩個對象的記憶體位址在比較。Object類中的equals方法内部使用的就是==比較運算符。
在開發中要比較兩個對象是否相同,經常會根據對象中的屬性值進行比較,也就是在開發經常需要子類重寫equals方法根據對象的屬性值進行比較。
1.1.4.1 案例代碼三:
package com.gao_01;
import java.util.ArrayList;
/*
* boolean equals(Object obj)
* 使用==來比較兩個對象是否相等,則比較位址值是否相等
*/
public class ObjectDemo2 {
public static void main(String[] args) {
Person p = new Person("zhangsan",18);
Person p2 = new Person("zhangsan",19);
//boolean flag = p.equals(p2);
boolean flag = p.equals(new ArrayList());
System.out.println(flag);
}
}
class Person {
String name;
int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
//提高效率
if (this == obj)
return true;
if (obj == null)
return false;
//提高健壯性
if (getClass() != obj.getClass())
return false;
//向下轉型
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
/*@Override
public boolean equals(Object o) {
//提高效率 目前對象和傳遞進來的對象位址值一樣,則不用比較成員
if(this == o) {
return true;
}
//提高代碼的健壯性
if(this.getClass() != o.getClass()) {
return false;
}
//向下轉型
Person other = (Person) o;
if(!this.name.equals(other.name)) {
return false;
}
if(this.age != other.age) {
return false;
}
return true;
}*/
}
1.2 System類
System 類包含一些有用的類字段和方法。它不能被執行個體化。
1.2.1 成員方法
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :
從src源數組的srcPos索引開始,複制length個元素
從destPost位置開始将這些元素放至到dest數組中
static long currentTimeMillis()
傳回以毫秒為機關的目前時間
static void exit(int status)
終止目前正在運作的 Java 虛拟機
1.2.2 案例代碼四:
package com.gao_02;
/*
* System:包含一些有用的類字段和方法。它不能被執行個體化。
* static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
* 複制數組
* static long currentTimeMillis()
* 傳回目前系統時間
* static void exit(int status)
* 終止虛拟機的運作
*
*
*
* 系統
*
*/
public class SystemDemo {
public static void main(String[] args) {
//method();
//method2();
//static void exit(int status)
for (int i = 0; i < 10000; i++) {
System.out.println(i);
if(i == 50) {
System.exit(0);
}
}
}
private static void method2() {
/*
* static long currentTimeMillis() :以毫秒值傳回目前系統時間(1970-1-1 0:0:0至今過了多少毫秒)
* 1000毫秒 = 1秒
* 相對于1970-1-1 0:0:0
* 如果系統時間1970-1-1 0:0:0 0
* 如果系統時間1970-1-1 0:0:1 1000
* 如果系統時間1970-1-1 0:1:0 1000 * 60
* 如果系統時間1970-1-1 1:1:0 1000 * 60 * 60 + 1000 * 60
*/
//long now = System.currentTimeMillis();
//System.out.println(now);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println("hello world");
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
private static void method() {
/*
* static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
* 資料源和目的地
*
* src:源數組
* srcPos:指定從哪個索引位置開始複制 1
* dest:目标數組
* destPos:指定目标數組接收元素的索引位置
* length:目标數組接收元素的個數
*/
//源數組
int[] src = {1,2,3,4,5};
//目标數組
int[] dest = new int[5];
System.arraycopy(src, 2, dest, 0, 3);
//周遊目标數組
for (int i = 0; i < dest.length; i++) {
System.out.print(dest[i]);
}
//00000 --- 12345
//00000 --- 12300
//00000 --- 34500
}
}
日期相關類
2.1 Date類
Date: 表示特定的瞬間,精确到毫秒,他可以通過方法來設定自己所表示的時間,可以表示任意的時間
2.1.2 案例代碼五:
package com.gao_03;
import java.util.Date;
/*
* Date: 表示特定的瞬間,精确到毫秒,他可以通過方法來設定自己所表示的時間,可以表示任意的時間
* System.currentTimeMillis():傳回的是目前系統時間,1970-1-1至今的毫秒數
*
* 構造方法:
* Date() :建立的是一個表示目前系統時間的Date對象
Date(long date) :根據"指定時間"建立Date對象
*/
public class DateDemo {
public static void main(String[] args) {
//Date()
//Date d = new Date();
//System.out.println(d);//Thu Aug 26 14:17:28 CST 2049
//System.out.println(d.toLocaleString());
//Date(long date)
Date d2 = new Date(1000 * 60 * 60 * 24);//時區 有時差
System.out.println(d2.toLocaleString());
}
}
2.1.3 Date類常用方法
void setTime(long time)
long getTime()
2.1.4 案例代碼六:
package com.gao_03;
import java.util.Date;
/*
* Date的常用用方法
毫秒值 --- Date
設定
傳回值是void,參數long
void setTime(long time)
Date(long date)
Date --- 毫秒值
擷取
傳回long,無參數
long getTime()
*/
public class DateDemo2 {
public static void main(String[] args) {
Date d = new Date();//預設目前系統時間
//d.setTime(1000 * 60 * 60 * 24 * 2);
System.out.println(d.toLocaleString());
System.out.println(d.getTime());//172800000
d.setTime(172800000L);
System.out.println(d.toLocaleString());
}
}
2.2 DateFormat類 & SimpleDateFormat
DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化并解析日期或時間。日期/時間格式化子類(如 SimpleDateFormat類)允許進行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标準化。
我們通過這個類可以幫我們完成日期和文本之間的轉換。
繼續閱讀API,DateFormat 可幫助進行格式化并解析任何語言環境的日期。對于月、星期,甚至月曆格式(陰曆和陽曆),其代碼可完全與語言環境的約定無關。
2.2.1 DateFormat&SimpleDateFormat的常用方法
要格式化一個目前語言環境下的日期也就是日期 -> 文本),要通過下面的方法來完成。DateFormat是抽象類,我們需要使用其子類SimpleDateFormat來建立對象。
A:SimpleDateFormat構造方法
SimpleDateFormat() 用預設的模式和預設語言環境的日期格式符号構造
SimpleDateFormat(String pattern)用給定的模式和預設語言環境的日期格式符号構造
B:DateFormat類方法
format(Date date) 将一個Date格式化為日期/時間字元串
parse(String source)從給定字元串的開始解析文本,以生成一個日期。
2.2.2 案例代碼七:
package com.gao_04;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* SimpleDateFormat:
* 格式化:
* Date --- String
* 2049-8-26 2049年8月26日
* String format(Date date)
* 解析:
* String --- Date
* "2049-8-26"
* Date parse(String source)
*
* 構造方法:
* SimpleDateFormat() :使用預設的模式進行對象的建構
* SimpleDateFormat(String pattern) :使用的指定的模式進行對象的建構
*
* 注意:Exception in thread "main" java.text.ParseException: Unparseable date: "49年9月26日 下午1:29"
* 解析的字元串,模式必須和建構對象的模式一樣
*
*/
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
//method();
//method2();
//使用指定的模式進行對象的建構
//1999年9月1日 10:10:10
//4個小姨2個大美眉和2個小弟弟
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//格式化
Date date = new Date();
String s = sdf.format(date);
System.out.println(s);//2049年08月26日 13:39:12
//解析
Date d = sdf.parse("2049年08月26日 13:39:12");
System.out.println(d.toLocaleString());
}
private static void method2() throws ParseException {
//使用指定的模式進行對象的建構
//1999年9月1日
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//格式化
Date date = new Date();
String s = sdf.format(date);
System.out.println(s);//2049年08月26日
//解析
Date d = sdf.parse("2049年08月26日");
System.out.println(d.toLocaleString());
}
private static void method() throws ParseException {
//使用預設模式進行對象的建構
SimpleDateFormat sdf = new SimpleDateFormat();
//建立日期對象
Date date = new Date();
//格式化 把日期對象轉換成字元串
String s = sdf.format(date);
System.out.println(s);//49-8-26 下午1:29
//解析 把字元串轉換成日期對象
Date d = sdf.parse("49年9月26日 下午1:29");
System.out.println(d.toLocaleString());
}
}
2.2.3 案例代碼八:
package com.gao_04;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* 需求:求出你來這個世界上多少天
*/
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
//出生日期
String birthday = "1998-01-01";
//今天日期
String now = "2000-01-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将字元串轉換成日期對象
Date d1 = sdf.parse(birthday);
Date d2 = sdf.parse(now);
//将日期對象轉換成long類型
long l = d1.getTime();
long l2 = d2.getTime();
System.out.println((l2 - l) / 1000 / 60 / 60 / 24);
}
}
2.3 Calendar類
2.3.1 Calendar類概述
Calendar是月曆類,在Date後出現,替換掉了許多Date的方法。該類将所有可能用到的時間資訊封裝為靜态成員變量,友善擷取。
Calendar為抽象類,由于語言敏感性,Calendar類在建立對象時并非直接建立,而是通過靜态方法建立,将語言敏感内容處理好,再傳回子類對象,如下:
Calendar類靜态方法
getInstance() 使用預設時區和語言環境獲得一個月曆。
Calendar c = Calendar.getInstance(); //傳回目前時間
2.3.2 Calendar 類常用方法
2.3.3 案例代碼九:
package com.gao_05;
import java.util.Calendar;
/*
* Calendar:月曆,提供了一些操作年月日時的方法
*
* 擷取
* 修改
* 添加
*
*
*/
public class CalendarDemo {
public static void main(String[] args) {
//static Calendar getInstance()
Calendar c = Calendar.getInstance();
//void set(int field, int value) :把指定的字段修改成指定的值
//c.set(Calendar.DAY_OF_MONTH, 20);
//void add(int field, int amount): 在指定的字段上加上指定的值
c.add(Calendar.DAY_OF_MONTH, -1);
//int get(int field) // 傳回給定月曆字段的值
//public static final int YEAR 1
//System.out.println(Calendar.YEAR);
//int year = c.get(1);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");
}
}
包裝類 & 正規表達式
3.1 包裝類
在實際程式使用中,程式界面上使用者輸入的資料都是以字元串類型進行存儲的。而程式開發中,我們需要把字元串資料,根據需求轉換成指定的基本資料類型,如年齡需要轉換成int類型,考試成績需要轉換成double類型等。那麼,想實作字元串與基本資料之間轉換怎麼辦呢?
Java中提供了相應的對象來解決該問題,基本資料類型對象包裝類:java将基本資料類型值封裝成了對象。封裝成對象有什麼好處?可以提供更多的操作基本數值的功能。
8種基本類型對應的包裝類如下:
其中需要注意int對應的是Integer,char對應的Character,其他6個都是基本類型首字母大寫即可。
3.2 包裝類的常用方法
3.2.1 案例代碼十:
package com.gao_06;
/*
* 需求:判斷一個數是否符合int類型的範圍
* 由于基本資料類型隻能做一些簡單的操作和運算,是以Java為我們封裝了基本資料類型,為每種基本資料類型提供了包裝類
* 包裝類就是封裝了基本資料類型的類,為我們提供了更多複雜的方法和一些變量
*
* byte Byte
* short Short
* char Character
* int Integer
* long Long
* float Float
* double Double
* boolean Boolean
*
* Integer:
* String --- int
* 方式1:int intValue()
* 方式2: static int parseInt(String s)
* int --- String
* 方式1: + ""
* 方式2:String toString()
*
* 構造方法:
* Integer(int value)
* Integer(String s)
*/
public class IntegerDemo {
public static void main(String[] args) {
/*int n = 10;
if(n >= Math.pow(-2, 31) && n <= Math.pow(2, 31) -1) {
System.out.println("符合");
}
else {
System.out.println("不符合");
}*/
Integer i = new Integer("10");
System.out.println(i);
int a = i.intValue();
System.out.println(a + 10 );
int b = Integer.parseInt("20");
System.out.println(b + 30);
Integer i2 = new Integer(40);
String s = i2.toString();
System.out.println(s);
String s2 = Integer.toString(50);
System.out.println(s2);
}
}
3.3 包裝類的自動裝箱與拆箱
在需要的情況下,基本類型與包裝類型可以通用。有些時候我們必須使用引用資料類型時,可以傳入基本資料類型。
比如:
基本類型可以使用運算符直接進行計算,但是引用類型不可以。而基本類型包裝類作為引用類型的一種卻可以計算,原因在于,Java”偷偷地”自動地進行了對象向基本資料類型的轉換。
相對應的,引用資料類型變量的值必須是new出來的記憶體空間位址值,而我們可以将一個基本類型的值指派給一個基本類型包裝類的引用。原因同樣在于Java又”偷偷地”自動地進行了基本資料類型向對象的轉換。
自動拆箱:對象轉成基本數值
自動裝箱:基本數值轉成對象
3.3.1 案例代碼十一:
package com.gao_06;
import java.util.ArrayList;
/*
* JDK1.5特性:自動裝箱和拆箱
*
*/
public class IntegerDemo2 {
public static void main(String[] args) {
//Integer i = new Integer(10);
//自動裝箱
//相當于: Integer i = new Integer(10);
//Integer i = 10;
//自動拆箱
//相當于 int a = i.intValue();
//Integer i = 10;
//int a = i;
Integer i = 10;
Integer i2 = 20;
Integer i3 = i + i2;
/*
* Integer i3 = new Integer(i.intValue() + i2.intValue());
*
*/
ArrayList list = new ArrayList();
list.add(1);//自動裝箱,list.add(new Integer(1));
}
}
3.4 正規表達式
3.4.1 正規表達式概述
正規表達式是專門解決字元串規則比對的工具。
正規表達式也是一個字元串,用來定義比對規則。
參照幫助文檔,在Pattern類中有簡單的規則定義,可以結合字元串類的方法使用。
3.4.2 正規表達式比對規則
參照幫助文檔,在Pattern類中有正規表達式的的規則定義,正規表達式中明确區分大小寫字母。我們來學習文法規則。
正規表達式的文法規則:
字元:x
含義:代表的是字元x
例如:比對規則為 "a",那麼需要比對的字元串内容就是 ”a”
字元:\\
含義:代表的是反斜線字元\'\\'
例如:比對規則為"\\" ,那麼需要比對的字元串内容就是 ”\”
字元類:[abc]
含義:代表的是字元a、b 或 c
例如:比對規則為"[abc]" ,那麼需要比對的内容就是字元a,或者字元b,或字元c的一個
字元類:[^abc]
含義:代表的是除了 a、b 或 c以外的任何字元
例如:比對規則為"[^abc]",那麼需要比對的内容就是不是字元a,或者不是字元b,或不是字元c的任意一個字元
字元類:[a-zA-Z]
含義:代表的是a 到 z 或 A 到 Z,兩頭的字母包括在内
例如:比對規則為"[a-zA-Z]",那麼需要比對的是一個大寫或者小寫字母
字元類:[0-9]
含義:代表的是 0到9數字,兩頭的數字包括在内
例如:比對規則為"[0-9]",那麼需要比對的是一個數字
字元類:[a-zA-Z_0-9]
含義:代表的字母或者數字或者下劃線(即單詞字元)
例如:比對規則為" [a-zA-Z_0-9] ",那麼需要比對的是一個字母或者是一個數字或一個下滑線
預定義字元類:.
含義:代表的是任何字元
例如:比對規則為" . ",那麼需要比對的是一個任意字元。如果,就想使用 . 的話,使用比對規則"\\."來實作
預定義字元類:\d [0-9]
含義:代表的是 0到9數字,兩頭的數字包括在内,相當于[0-9]
例如:比對規則為"\d ",那麼需要比對的是一個數字
預定義字元類:\w [a-zA-Z_0-9]
含義:代表的字母或者數字或者下劃線(即單詞字元),相當于[a-zA-Z_0-9]
例如:比對規則為"\w ",,那麼需要比對的是一個字母或者是一個數字或一個下滑線
數量詞:X?
含義:代表的是X出現一次或一次也沒有
例如:比對規則為"a?",那麼需要比對的内容是一個字元a,或者一個a都沒有
數量詞:X*
含義:代表的是X出現零次或多次
例如:比對規則為"a*" ,那麼需要比對的内容是多個字元a,或者一個a都沒有
數量詞:X+
含義:代表的是X出現一次或多次
例如:比對規則為"a+",那麼需要比對的内容是多個字元a,或者一個a
數量詞:X{n}
含義:代表的是X出現恰好 n 次
例如:比對規則為"a{5}",那麼需要比對的内容是5個字元a
數量詞:X{n,}
含義:代表的是X出現至少 n 次
例如:比對規則為"a{5, }",那麼需要比對的内容是最少有5個字元a
數量詞:X{n,m}
含義:代表的是X出現至少 n 次,但是不超過 m 次
例如:比對規則為"a{5,8}",那麼需要比對的内容是有5個字元a 到 8個字元a之間
3.4.3 案例代碼十二:
package com.gao_07;
/*
* 校驗qq号碼
* 要求必須是5-15位
* 0不能開頭
* 必須都是數字
正規表達式:就是一套規則,可以用于比對字元串
boolean matches(String regex) :判斷目前字元串是否比對指定的正規表達式,如果比對則傳回true,否則傳回false
*
*
*/
public class RegexDemo {
public static void main(String[] args) {
String qq = "12a345";
/*boolean flag = checkQQ(qq);
System.out.println(flag);*/
boolean flag = qq.matches("[1-9][0-9]{4,14}");
System.out.println(flag);
}
public static boolean checkQQ(String qq) {
int length = qq.length();
//要求必須是5-15位
if(length < 5 || length > 15) {
return false;
}
//0不能開頭
if(qq.startsWith("0")) {
return false;
}
//必須都是數字
for (int i = 0; i < length; i++) {
//得到參數的每一個字元
char c = qq.charAt(i);
if(c < \'0\' || c > \'9\') {
return false;
}
}
return true;//符合要求
}
}
3.4.4 案例代碼十三:
package com.gao_07;
/*
* 判斷字元串”qaq”中間的字元是否是元音
*
* aeiou
* AEIOU
*
*/
public class RegexDemo2 {
public static void main(String[] args) {
boolean flag = check2("qbq");
System.out.println(flag);
}
public static boolean check(String s) {
s = s.toLowerCase();
char ch = s.charAt(1);
/*if(ch == \'a\' || ch == \'e\' || ch == \'i\' || ch == \'o\' || ch == \'u\') {
return true;
}
return false;*/
String str = "aeiou";
return str.contains(ch + "");
}
public static boolean check2(String s) {
return s.matches("\\w[aeiouAEIOU]\\w");
}
}
3.5.4 案例代碼十四:
package com.gao_07;
/*
* 切割字元串"aa,bb,cc";
切割字元串"-1 99 4 23";
切割字元串"-1 99 4 23";
String[] split(String regex) 根據給定正規表達式的比對拆分此字元串。
*
*/
public class RegexDemo3 {
public static void main(String[] args) {
//method();
//method2();
String s = "-1 99 4 23";
String[] arr = s.split(" +");
print(arr);
}
private static void method2() {
String s = "-1 99 4 23";
String[] arr = s.split(" ");
print(arr);
}
private static void method() {
String s = "aa,bb,cc";
String[] arr = s.split(",");
print(arr);
}
public static void print(String[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}