類的抽象是指將類的實現和類的使用分離開。
實現的細節被封裝并且對用戶隱藏 , 這被稱為類的封裝 。
面向過程的范式重點在于設計方法 。 面向對象的范式將數據和方法耦合在一起構成對象 。
- 類的關系:關聯 、 聚合 、 組合以及繼承 。
- 關聯
- 聚集和組合
示例學習:設計棧
用數組實現:
/**
* 用數組實現一個棧
*/
public class StackOfIntegers {
//定義了棧的數組
private int[] elements;
//size表示棧內元素大小,size-1就是目前的棧頂元素
private int size;
//設置默認的數組大小
private static final int DEFAULT_CAPACITY=16;
public StackOfIntegers(){
elements=new int[DEFAULT_CAPACITY];
}
//入棧
public void push(int value){
if(size>=elements.length) {
//如果size>=數組的大小,就將數組的大小擴容
int[] temp = new int[elements.length * 2];
System.arraycopy(elements,0,temp,0,elements.length);
elements=temp;
}
elements[size]=value;
size++;
}
//出棧
public int pop(){
//要彈出的元素目前在棧頂,size是共有的元素長度,下標是size-1
int number= elements[size-1];
//彈出后,size長度減少一個
size--;
return number;
}
//判棧空
public boolean empty(){
return size==0;
}
public static void main(String[] args){
StackOfIntegers stackOfIntegers=new StackOfIntegers();
for(int i=0;i<10;i++)
stackOfIntegers.push(i);
while (!stackOfIntegers.empty())
System.out.print(stackOfIntegers.pop()+" ");
}
}
2.數值包裝類
出于對性能的考慮 , 在 Java 中基本數據類型不作為對象使用 。 因為處理對象需要額外的系統開銷 , 所以 , 如果將基本數據類型當作對象 , 就會給語言性能帶來負面影響 。 然而 ,Java 中的許多方法需要將對象作為參數 。 Java 提供了一個方便的辦法 , 即將基本數據類型并入對象或包裝成對象 ( 例如 , 將 int 包裝成 Integer 類 , 將 double 包裝成 Double 類 , 將char 包裝成 Character 類 ) 。 通過使用包裝類 , 可以將基本數據類型值作為對象處理 。 Java為基本數據類型提供了 Boolean 、 Character 、 Double 、 Float 、 Byte 、 Short 、 Integer ? 和Long 等包裝類 。 這些包裝類都打包在 java . lang 包里 。
-
數值包裝類有一個有用的靜態方法 valueOf(String s ) 。 該方法創建一個新對象 , 并將它初始化為指定字符串表示的值 。 例如 ,
- Integer 類中的 parselnt 方法將一個數值字符串轉換為一個 int 值 ,而且使用過 Double 類中的 parseDouble 方法將一個數值字符串轉變為一個 double 值 。 每個數值包裝類都有兩個重載的方法 , 將數值字符串轉換為正確的以 10 ( 十進制 ) 或指定值為基數 ( 例如 , 2 為二進制 , 8 為八進制 , 16 為十六進制 ) 的數值 。
3.基本類型和包裝類類型之間的自動轉換
將基本類型值轉換為包裝類對象的過程稱為裝箱 ( boxing ) , 相反的轉換過程稱為開箱 Java 允許基本類型和包裝類類型之間進行自動轉換 。 如果一個基本類型值出現在需要對象的環境中 , 編譯器會將基本類型值進行自動裝箱 ; 如果一個對象出現在需要基本類型值的環境中 , 編譯器會將對象進行自動開箱 。
4.String類
1)不可變字符串
String 對象是不可變的 , 它的內容是不能改變的。
String s=“Java”;
s=“HTML”;
第一條語句創建了一個內容為 java的 String 對象 , 并將其引用賦值給S,第二條語句創建了一個內容為 " HTML " 的新 String 對象 , 并將其引用賦值給 s 。 陚值后第一個 String 對象仍然存在 , 但是不能再訪問它 , 因為變量 s 現在指向了新的對象 。
2)限定字符串
因為字符串在程序設計中是不可變的 , 但同時又會頻繁地使用 , 所以 Java 虛擬機為了提高效率并節約內存 , 對具有相同字符序列的字符串直接量使用同一個實例 。 這樣的實例稱為限定的 ( interned ) 字符串 。
3)字符串的替換和分離
4)正則表達式
- 匹配字符串使用String類中的maches方法
" Java is fun " . matches ( " Java . * " ) - 正則表達式的語法
例1:社會安全號的模式是 XXX - XX - XXX , 其中 X 是一位數字。
[\d]{3}-[\d]{2}-[\d]{3}
解析:[\d]表示數字,{3}表示前面的模式出現次數,在這里就是3個數字。例2:偶數以數字 0 、 2 、 4 、 6 或者 8 結尾
[\d][02468]
解析:[\d]表示可以有0到多個數字,[02468]表示0或2或4或6或8例3:電話號碼的模式是 ( XXX ) XXX - XXXX , 這里 X 是一位數字 , 并且第一位數字不能為 0
\([1-9][//d]{2}\)[\d]{3}-[\d]{4}例4:假定姓由最多 25 個字母組成 , 并且第一個字母為大寫形式
[A-Z][//d]{1,24}例5:Java 標識符必須以字母 、 下劃線 ( - ) , 或者美元符號 ( $ ) 開始,不能以數字開頭 。
標識符是一個由字母 、 數字 、 下劃線 ( - ) 和美元符號組成的字符序列 。
[a-zA-Z_$][\w]*替換和分割字符串
System . out . println ( " Java Java Java " .replaceAll(" v \\ w " , " wi " ) );
Jawi Jawi Jawi
System . out . println ( " Java Java Java " . replaceFirst( '' v\\w " , " wi " ) ) ;
Jawi Java Java
5)字符串與數組之間的轉換
- 為了將字符串轉換成一個字符數組 , 可以使用 toCharArray() 方法
char [ ] chars = " Java " . toCharArray (); -
使用方法 getChars ( int srcBegin . int srcEnd , char [ ] dst , int dstBegin ) 將下標從 srcBegin 到 srcEnd - 1 的子串復制到字符數組 dst 中下標從 dstBegin 開始的位置。
- 為了將一個字符數組轉換成一個字符串 , 應該使用構造方法 String ( Char [] ) 或者方法valueof ( char [ ] )
String str=new String(new char[]{'J','a','v','a'});
String str=String.valueOf(new char[]{'J','a','v','a'});
6)將字符和數值轉換成字符串
- 可以使用 Double . parseDouble ( str ) 或者 Integer.parselnt ( str ) 將一個字符串轉換為一個 double 值或者一個 int 值。
- 為了將 double 值 5 . 44 轉換成字符串 , 可以使用 String . valueof ( 5 . 44 ) 。
5.StringBuilder 和 StringBuffer 類
— 般來說 , 只要使用字符串的地方 , 都可以使用 StringBuilder / StringBuffer類 。StringBuilder/StringBuffer類比 String 類更靈活 。 可以給一個 StringBuilder或 StringBuffer 中添加 、 插入或追加新的內容 , 但是 String 對象一旦創建 , 它的值就確定了 。
StringBuilder:線程非安全的
StringBuffer:線程安全的。
如果是多任務并發訪問 ,就使用 StringBuffer。
- 示例學習
判斷回文串時忽略既非字母又非數字的字符。
package java_04_基礎習題練習.第十章_面向對象的思考;
import java.util.Scanner;
/**
* 判斷回文串時忽略既非字母又非數字的字符
*/
public class HuiwenIgnoreNonwd {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
String s=input.nextLine();
System.out.print("忽略非字母又非數字的字符后"+s+"是回文串嗎?"+isHuiWen(s));
}
private static boolean isHuiWen(String s) {
//調用過濾方法返回新串
String filters=filter(s);
return filters.equals(reverse(filters));
}
private static String filter(String s) {
StringBuilder stringBuilder=new StringBuilder();
for(int i=0;i<s.length();i++){
//如果字母是數字或字符
char c=s.charAt(i);
if(Character.isLetterOrDigit(c))
stringBuilder.append(c);
}
return stringBuilder.toString();
}
private static String reverse(String s){
StringBuilder stringBuilder=new StringBuilder(s);
return stringBuilder.reverse().toString();
}
}