常用類
內部類
分類
- 成員內部類
- 靜態內部類 static
- 區域性內部類
- 匿名內部類
概念:在一個類的內部再定義一個完整的類
class Outer{
class Inner{
}
}
特點:
- 編譯之後可生成獨立的位元組碼檔案 (.class)
- 內部類可直接訪問外部類的私有成員,而不破壞封裝
- 可為外部類提供必要的內部功能元件
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Body {
private String body = "身體";
class Header{
public void show(){
System.out.println(body);
}
}
}
成員內部類
-
在類的內部定義,與例項變數,例項方法同級別的類
-
內部類是外部類的一個例項部分,建立內部類時,必須依賴外部類物件
Outer out = new Outer(); Inner in = out.new Inner();
-
當外部類、內部類存在重名屬性時,會優先訪問內部類屬性
-
成員內部類不能定義靜態成員(屬性),但能包含靜態常量
package OOP.commonClass;
import OOP.commonClass.Outer.Inner;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Test {
public static void main(String[] args) {
//1、建立外部類物件
Outer body = new Outer();
//2、建立內部類物件
Inner inner = body.new Inner();
//一步到位
Inner inner1 = new Outer().new Inner();
inner.show();
inner1.show();
}
}
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
//外部類
public class Outer {
private String body = "身體";
private int length = 100;
//成員內部類
class Inner{
private int age = 18;
private final int high = 11;
//屬性和外部類屬性名字相同
private int length = 50;
public void show(){
//訪問外部類成員
System.out.println(body);
//內部類和外部類屬性重名,使用 外部類名.this.屬性 來訪問
System.out.println(Outer.this.length);
//訪問內部類成員
System.out.println(age);
System.out.println(length);
}
}
}
靜態內部類
- 不依賴外部物件,可直接建立或提供類名訪問,可宣告靜態成員
- 只有內部類才能用static修飾
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
//外部類
public class Outer {
private String body = "身體";
private int length = 100;
//靜態內部類,級別和外部類相同
static class Inner{
private int age = 18;
//靜態成員
private static int count = 10000;
public void show(){
//訪問外部類成員
//1、先建立外部類物件
Outer out = new Outer();
//2、呼叫外部類物件屬性
System.out.println(out.body);
System.out.println(out.length);
//訪問內部類成員
System.out.println(age);
//呼叫靜態內部類的靜態屬性
System.out.println(Inner.count);
}
}
}
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Test {
public static void main(String[] args) {
//直接建立靜態內部類物件
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
區域性內部類
- 定義在外部類方法中,作用範圍和建立物件範圍僅限於當前方法
- 區域性內部類訪問外部類當前方法中的區域性變數時,因無法保障變數的生命週期與自身相同,變數必須修飾為final
- 限制類的使用範圍
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
//外部類
public class Outer {
private String body = "身體";
private int length = 100;
//若為靜態方法,則不能訪問外部類屬性
public void show(){
//定義區域性變數
String address = "桂林";
//不能有靜態變數,但能有靜態常量final
//private static int count = 10000;
private final static int count = 10000;
//區域性內部類:注意不能加任何訪問修飾符
class Inner{
//區域性內部類屬性
public String phone = "111111";
private int id = 111;
public void print(){
//訪問外部類的屬性
System.out.println(Outer.this.body);
System.out.println(Outer.this.length);
//訪問內部類的屬性
System.out.println(phone);
System.out.println(id);
//訪問區域性變數,jdk1.7要求:變數必須是常量final jdk1.8自動新增final
System.out.println(address/*相當於直接列印 "桂林" */);
// 等價於 System.out.println("桂林");
}
}
//需要在方法裡 建立內部類物件,呼叫內部類物件的方法
Inner inner = new Inner();
inner.print();
}
}
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Test {
public static void main(String[] args) {
//建立外部類物件
Outer outer = new Outer();
outer.show();
}
}
匿名內部類
- 沒有類名的區域性內部類(一切特徵都與區域性內部類相同)
- 必須繼承一個父類或實現一個介面
- 定義類、實現類、建立物件的語法合併,只能建立一個該類的物件
- 優點:減少程式碼量
- 缺點:可讀性差
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Test {
public static void main(String[] args) {
//建立介面型別的變數
/*UserService user = new User();
user.service();*/
//區域性內部類
/*class User1 implements UserService{
@Override
public void service() {
System.out.println("實現使用者1服務介面");
}
}
UserService user = new User1();
user.service();*/
//匿名內部類最佳化(相當於建立了一個區域性內部類)可再最佳化為lambda表示式
UserService user = new UserService() {
@Override
public void service() {
System.out.println("實現使用者2服務介面");
}
};
user.service();
//lambda
UserService user =()->{ System.out.println("實現使用者3服務介面");};
user.service();
}
}
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public interface UserService {
//服務
void service();
}
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class User implements UserService{
@Override
public void service() {
System.out.println("實現使用者服務介面");
}
}
Object類
- 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層
- 任何類,如沒有書寫extends顯示繼承某個類,都預設直接繼承0bject類,否則為間接繼承
- Object類中所定義的方法,是所有物件都具備的方法
- Object型別可以儲存任何物件
- 作為引數,可接受任何物件
- 作為返回值,可返回任何物件
包裝類
- 基本資料型別所對應的引用資料型別
- Object可同意所有資料,包裝類的預設值是null
基本資料型別 | 包裝型別 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
型別轉換與裝箱、拆箱
- 基本型別 --->引用型別 裝箱
- 引用型別 --->基本型別 拆箱
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
//型別轉換:裝箱,基本型別轉換成引用型別的過程
//基本型別
int num1 = 100;
//使用Integer類建立物件
Integer integer1 = new Integer(num1);
Integer integer2 = Integer.valueOf(num1);
System.out.println("裝箱");
System.out.println(integer1);
System.out.println(integer2);
//型別轉換:拆箱,引用型別轉換成基本型別
Integer integer3 = new Integer(200);
int num2 = integer3.intValue();
System.out.println("拆箱");
System.out.println(num2);
//JDK1.5後,提供自動裝箱和拆箱
int num3 = 50;
//自動裝箱
Integer integer4 = num3;
System.out.println("自動裝箱"+ integer4);
//自動拆箱
int num4 = integer4;
System.out.println("自動拆箱"+ num4);
}
}
-
8種包裝類提供不同型別間的轉換方式:
- Number父類中提供的6個共性方法
- parseXXX()靜態方法
注意:需保證型別相容,否則丟擲NumberFormatException異常
//基本型別和字串之間轉換
//1 基本型別轉字串
int n1 = 188;
//1.1 使用+號
String s1 = n1 + "";
//1.2 使用Integer中的toString()方法
String s2 = Integer.toString(n1);
//toString過載 轉換進位制
String s3 = Integer.toString(n1,16);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
//2字串轉基本型別
String str = "166";
//使用Integer.parseXXX();
int n2 = Integer.parseInt(str);
System.out.println(n2);
//boolean字串形式轉基本型別 "true"--->true 非"true"---> false
String str2 = "true";
String str3 = "t";
boolean b1 = Boolean.parseBoolean(str2);
boolean b2 = Boolean.parseBoolean(str3);
System.out.println(b1);
System.out.println(b2);
整數緩衝區
- Java預先建立了256個常用的整數包裝型別物件
- 在實際應用中,對已建立的物件進行復用
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
//比較的是i1和i2指向的地址,不是數值
System.out.println(i1 == i2);//false
Integer i3 = Integer.valueOf(100);
Integer i4 = 100;
//實際上自動裝箱成 Integer i3 = Integer.valueOf(100);
// valueOf建立物件 會判斷數值大小,在-128 -- 127之間,會使用預先建立的包裝型別物件,進行復用
// 本例中i3 和 i4 都是100,都會指向 整數緩衝區中值100的那個物件
System.out.println(i3 == i4);//true
Integer i5 = 200;
Integer i6 = 200;
//數值為200,超過127,所以建立了新的物件,不是複用整數緩衝區的物件
System.out.println(i5 == i6);//false
}
}
String類
- 字串是常量,建立後不可改變
- 字串字面值儲存在字串池(在方法區中)中,可以共享
- String s = "hello"; 產生一個物件,字串池中儲存
- String s = new String("hello"); 產生兩個物件,堆和池各儲存一個
package OOP.commonClass;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
String name = "hello";//儲存在字串池中
name = "zhangsan";//“zhangsan” 賦值給name變數,給字串賦值時,沒有修改資料,
// 而是在開闢一個空間存放“zhangsan”,並且name指向“zhangsan”
String name2 = "zhangsan";//如果字串池中有“zhangsan”,則直接指向它
//另一種建立方式, new String();
String str = new String("java");//建立兩個物件,一個在字串池,一個在堆,
//堆中的物件指向字串池的物件
String str2 = new String("java");
System.out.println(str == str2);//false
System.out.println(str.equals(str2));//true
}
}
常用方法
- public int length():返回字串的長度
- public char charAt(int index):根據下標獲取字元
- public boolean contains(String str):判斷當前字串中是否包含str
- public char[] toCharArray():將字串轉換成陣列
- public int indexOf(String str):查詢str首次出現的下標,存在,則返回該下標;不存在,則返回-1
- public int lastIndexOf(String str):查詢字串在當前字串中最後一次出現的下標索引
- public String trim():去掉字串前後的空格
- public String toUpperCase():將小寫轉成大寫
- public boolean endWith(String str):判斷字串是否以str結尾
- public String replace(char oldChar,char newChar):將舊字串替換成新字串
- public String[] split(String str):根據str做拆分
- equals():比較內容是否相同
- equalsIgnoreCase():比較時忽略大小寫
- compareTo():比較字元在字典裡的位置
案例:
package OOP.commonClass;
import java.util.Arrays;
import java.util.Locale;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
String str = "this is a text";
//1
String[] arr = str.split(" ");
for (String s : arr) {
System.out.println(s);
}
//2
String replace = str.replace("text", "practice");
System.out.println(replace);
//3
str.replace("text", "easy text");
//4
String str1 ="";
for (String s : arr) {
char first = s.charAt(0);
char upperCase = Character.toUpperCase(first);
//substring(下標);獲得從下標開始的後面的字串
str1 = str1 + upperCase + s.substring(1)+ " ";
}
System.out.println(str1);
}
}
可變字串
- StringBuffer:可變長字串,JDK1.0提供,執行效率慢、執行緒安全
- StringBuilder:可變長字串,JDK5.0提供,執行效率快、執行緒不安全
和String的區別:
- 效率比String高
- 比String省記憶體
package OOP.commonClass;
import java.util.Arrays;
import java.util.Locale;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
//StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
//1 append(); 追加
sb.append("Hello World");
System.out.println(sb.toString());
sb.append("Hello java");
System.out.println(sb.toString());
//2 insert(); 新增
sb.insert(0,"I am first");
System.out.println(sb.toString());
//3 replace(); 替換
sb.replace(0,10,"I am second");
System.out.println(sb.toString());
//4 delete();
sb.delete(0,5);
System.out.println(sb.toString());
//5 清空
sb.delete(0,sb.length());
System.out.println(sb.length());
}
}
BigDecimal類
-
位置:java.math包
-
作用:精確計算浮點數
-
建立方式:BigDecimal bd = new BigDecimal("1.0");
-
方法:
-
BigDecimal add (BigDecimal bd) 加
-
BigDecimal subtract(BigDecimal bd) 減
-
BigDecimal multiply(BigDecimal bd) 乘
-
BigDecimal divide(BigDecimal bd) 除
除不盡時使用:
- 除法: divide (BigDecimal bd, int scal, RoundingMode mode)
- 引數scal :指定精確到小數點後幾位
- 引數mode :
- 指定小數部分的取捨模式,通常採用四捨五入的模式
- 取值為 BigDecimal.ROUND_HALF_UP
-
package OOP.commonClass;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Locale;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//減法
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1);
//加法
BigDecimal r2 = bd1.add(bd2);
System.out.println(r2);
//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3);
//除法
BigDecimal r4 = new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r4);
//除不盡 ROUND_HALF_UP 四捨五入
BigDecimal r6 = new BigDecimal("10").divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(r6);
}
}
Date類
- Date表示特定的瞬間,精確到毫秒。Date類中的大部分方法都已經被Calendar類中的方法所取代
- 時間單位
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微秒=1000納秒
Calendar類
- Calendar提供了獲取或設定各種日曆欄位的方法
- 構造方法
- protected Calendar(): 由於修飾符時protected,所以無法直接建立該物件
package OOP.commonClass;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Locale;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
//1 建立Calendar物件
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
//2 獲取時間資訊
//Year
int year = calendar.get(Calendar.YEAR);
//month 從0-11 實際的要加上1
int month = calendar.get(Calendar.MONTH);
//day
int day = calendar.get(Calendar.DAY_OF_MONTH);
//hour
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//minute
int minute = calendar.get(Calendar.MINUTE);
//second
int second = calendar.get(Calendar.SECOND);
System.out.println(year + "年" + (month + 1) + "月" + day + "日" + hour + ":" + minute + ":" + second);
//修改時間
Calendar calendar1 = Calendar.getInstance();
calendar1.set(Calendar.DAY_OF_MONTH,5);
System.out.println(calendar1.getTime().toLocaleString());
//add方法修改時間
calendar1.add(Calendar.HOUR,1);
System.out.println(calendar1.getTime().toLocaleString());
//補充 獲得最大和最小日期
int maximum = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(maximum);
int minimum = calendar1.getMinimum(Calendar.DAY_OF_MONTH);
System.out.println(minimum);
}
}
SimpleDateFormat類
-
SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類
-
進行格式化(日期 ->文字)、解析(文字 ->日期)
-
常用的時間模式字母
package OOP.commonClass;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) throws ParseException {
//1 建立SimpleDateFormat物件 y 年 M 月 d 日 H 小時 m 分 s 秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.CHINA);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
//建立Date
Date date = new Date();
//格式化Date
String str = sdf.format(date);
System.out.println(str);
//解析 字串 -> 日期
//parse()裡格式要和上面規定的對應 不對應的話就報錯
//如下面這一句就會報錯
Date parse = sdf.parse("1990年6月8日");
//這句不會報錯
Date parse1 = sdf1.parse("1990年6月8日");
System.out.println(parse.toLocaleString());
System.out.println(parse1.toLocaleString());
}
}
System類
- System系統類,主要用於獲取系統的屬性資料和其他操作,構造方法私有的
package OOP.commonClass;
import java.util.Arrays;
/**
* @version: java version 1.8
* @Author: 14
*/
public class Demo {
public static void main(String[] args) {
//複製
//src:源陣列
//srcPos:從哪個位置開始複製 0
//dest:目標陣列
//destPos:目標陣列的位置
//length:複製的長度
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int[] dest = new int[10];
System.arraycopy(arr,0,dest,0,arr.length);
//Arrays.copyOf(Original,newLength)也是呼叫System.arraycopy()
System.out.println(Arrays.toString(dest));
//獲取時間
long r = 0;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
for (int j = 0; j < 1000000000; j++) {
r = i+j;
}
}
System.out.println(r);
long endTime = System.currentTimeMillis();
System.out.println("用時:" + (endTime - startTime)+"ms");
//System.gc(); 告訴垃圾回收器回收
new Student(18,"aaa");
new Student(19,"bbb");
new Student(20,"ccc");
System.gc();
//退出jvm
System.exit(0);
}
}
總結
- 內部類:
- 在一個類的內部再定義一個完整的類
- 成員內部類、靜態內部類、區域性內部類、匿名內部類
- Object類:
- 所有類的直接或間接父類,可儲存任何物件
- 包裝類:
- 基本資料型別所對應的引用資料型別,可以使0bject統一所有資料
- String類:
- 字串是常量,建立之後不可改變,字面值儲存在字串池中,可以共享
- BigDecimal類:
- 可精確計算浮點數
- Date類
- 特定時間
- Calendar類
- 日曆
- SimpleDateFormat類
- 格式時間
- System
- 系統類