1. 程式人生 > >Java總結第八章

Java總結第八章

本章內容

1.基本資料型別的包裝類

2.String類,StringBuffer類,StringBuilder類

3.內部類

一.基本資料型別的包裝類

1.基本資料型別有時要轉成引用資料型別,所以java針對所有的基本資料型別都提供了對應的包裝類。但包裝類並不是用來取代基本型別的。

下面即對基本資料型別對應的包裝類:

基本資料型別

包裝類

byte(位元組)

java.lang.Byte

char(字元)

java.lang.Character

short(短整型)

java.lang.Short

int(整型)

java.lang.Integer

long(長整型)

java.lang.Long

float(浮點型)

java.lang.Float

double(雙精度)

java.lang.Double

boolean(布林)

java.lang.Boolean


2.包裝類和基本資料型別

基本資料型別轉換為包裝類的語法:

Integer intValue = new Integer(21);

包裝類轉換為基本資料型別的語法:

Integer integerId=new Integer(25);

int  intId=integerId.intValue();

3.自動裝箱、拆箱

JDK5.0中為基本資料型別提供了自動裝箱

(boxing)、拆箱(unboxing)功能:

裝箱:將基本資料型別包裝為對應的包裝類物件

拆箱:將包裝類物件轉換成對應的基本資料型別

下面就char型來詮釋自動裝箱拆箱

package boxing;

public class CharacterDemo {

	public static void main(String[] args) {
	    Character c='a';   // 自動裝箱
	    char x=c;  // 自動拆箱
	    System.out.println("變為大寫:"+Character.toUpperCase('a'));
	    System.out.println("變為小寫:"+Character.toLowerCase('Y'));

	}
	

}

執行截圖如下:


就int型來詮釋轉換為int包裝類,以及裝箱拆箱
package boxing;

public class IntegerDemo {

	public static void main(String[] args) {
		System.out.println("int的最大值:"+Integer.MAX_VALUE);
		System.out.println("int的最小值:"+Integer.MIN_VALUE);
		Integer a=100;   // 自動裝箱
		int b=a;   // 自動拆箱
		String str="123";
		int temp=Integer.parseInt(str);   // 將字串轉換為int
		System.out.println(temp+5);

	}

}

執行結果截圖如下:


二.字串相關類

1.String類

*  String代表字串型別,字串內容本身不可改變,字串儲存於“字串常量池“中。

補充:棧記憶體一般放區域性變數的基本資料型別。物件的引用型別。

靜態區放靜態,對所有例項化物件共享。

字串常量值其實也放在堆記憶體中,但單獨拿出來講就在字串常量池裡,常量池屬於堆記憶體。

*  String的兩種例項化方式:

a.直接賦值法(常用)

eg:  String str=“Hello”;


b.通過new操作符例項化

eg:String  str=new String(“hello”);


*  一個字串就是一個String類的匿名物件。所謂匿名物件,就是在堆記憶體中開闢了空間,但在棧記憶體中並沒有引用指向的物件。

例如:

package string.trap;

public class StringDemo {

	public static void main(String[] args) {
		String str="hello";
        change(str);
        System.out.println(str);
	}
	
	public static void change(String str){
		str="中國";
	}

}

在此時change裡的方法的字串並沒有被指向,這個部分是在堆記憶體中另開闢的空間,但在棧記憶體中沒有引用指向物件,故輸出結果依然是“hello”。

執行結果截圖為:

*  字串常用方法:

1.public String(byte[] bytes)

 使用平臺的預設字符集解碼,將位元組陣列轉換為字串

2.public String(byte[] bytes,Charset charset)

  使用指定字符集解碼,將位元組陣列轉換為字串

3.public char charAt(int index)

  根據索引位置獲取字串中的某個字元

4.public boolean contains(CharSequence s)

  判斷當前物件代表的字串是否包含引數字串內容

5.public boolean equals(Object anObject)

  判斷字串內容是否相同

6.public byte[] getBytes()

  將字串轉換為位元組陣列

7.public int indexOf(String str)

  返回引數字串在當前字串中的索引位置

8.public int lastIndexOf(String str)

  從後往前找引數字串,返回引數字串在當前字串中的索引位置

9.public int length()

   返回當前字串的長度

10.public String toLowerCase()

   將字串轉換為小寫

對以上常用方法進行驗證:

package string;

public class StringMethod {

	public static void main(String[] args) {
		String str="中華人民共和國";
		System.out.println(str.charAt(2));  // 根據索引位置獲取字串中的某個字元
        System.out.println(str.contains("人民"));   // 判斷當前物件代表的字串是否包含引數字串內容
        System.out.println(str.indexOf("民共和"));
        // 將"abcde"的d變為大寫
        String s1="abcdedx";
        System.out.println("從後往前找d:"+s1.lastIndexOf("d"));
        String s2="wxYz";
        System.out.println(s2.toUpperCase());
        System.out.println(s2.toLowerCase());
        System.out.println("中華人民共和國".substring(3));
        System.out.println("中華人民共和國".substring(3,6));
        String s3="   中     國     人  ";
        System.out.println("s3的長度:"+s3.length());
        System.out.println("刪除了前後空格後的長度:"+s3.trim().length());
        System.out.println("*************************************");
        String country="中國,美國,俄羅斯,義大利,瑞典";
        String[] array=country.split(",");
        System.out.println("遍歷拆分後的字串:");
        for(String cou:array){
        	System.out.print(cou+"  ");
        }
	}

}
實驗結果截圖:


2.StringBuffer類,StringBuilder類

這兩個類功能幾乎一樣,代表可變的字元序列,稱為字串緩衝區,工作原理是:預先申請一塊記憶體,存放字元序列,如果字元序列滿了,會重新改變快取區的大小,以容納更多的字元序列。

StringBuffer,StringBuilder,String的區別:

StringBuffer和StringBuilder是可變物件,若連續操作String物件則會產生大量垃圾,而且“斷開------連線”很頻繁。

StringBuffer與StringBuilder相比,StringBuilder是執行緒不安全的。

就StringBuffer舉例:

package stringbuffer;

public class StringBufferMethod {

	public static void main(String[] args) {
		StringBuffer sb=new StringBuffer();
		sb.append("中國").append("香水").append("Java");
		System.out.println("反轉之前:");
		System.out.println(sb.toString());
		sb.reverse();   // 反轉緩衝區的內容
		System.out.println("反轉之後:");
		System.out.println(sb.toString());
		
		StringBuffer sb2=new StringBuffer();
		sb2.append(false).append(12.5).append("hello");
		sb2.insert(1,true);   // 在索引為1處插入true
		System.out.println(sb2);

	}

}

執行結果截圖:


三.內部類

1.在類的內部定義另一個類。如果在類Outer的內部再定義一個類Inner,此時Inner就稱為內部類,而Outer則稱為外部類。

2.內部類的定義格式

public class 外部類{

  //外部類成員

      public class 內部類{

           //內部類成員

      }

}

3.內部類在編譯完成後也會產生.class檔案,而檔名稱則是外部類名稱$內部類名稱.class”

**   什麼時候使用內部類?

類中有屬性或者方法不足以描述某個複雜的問題,但這個問題又包含在類中,這時就應該使用內部類。

使用內部類的好處:

1 可以方便地訪問外部類的私有屬性

2 減少了類檔案編譯後的產生的位元組碼檔案的大小

缺點:使程式結構不清楚

****  成員內部類

成員內部類中不能定義static變數

成員內部類持有外部類的引用

外部例項化成員內部類的格式:

 外部類.內部類  內部類物件=外部類例項.new 內部類();

如:

package inner.member;

public class Outer {
   private String name="中國人";
   
   // 成員內部類
   class MemberInner{
	   public void method(){
		   System.out.println("內部類可以訪問外部類的私有屬性:"+name);
	   }
   }
   
   public MemberInner getMemberInstance(){
	   return new MemberInner();
   }
}
package inner.member;

public class TestMember {

	public static void main(String[] args) {
		Outer out=new Outer();
		out.getMemberInstance().method();   // 通過在外部類中的成員方法中獲取內部類物件
        
		// 外部類.內部類  內部類物件=外部類例項.new 內部類();
		Outer.MemberInner in=out.new MemberInner();
		in.method();
	}

}
截圖如下:

**** 靜態內部類

如果一個內部類使用static宣告,則此內部類就稱為靜態內部類,其實也相當於外部類。可以通過外部類.內部類來訪問。

靜態內部類不會持有外部類的引用,建立時可以不用建立外部類物件

靜態內部類可以訪問外部的靜態變數,如果訪問外部類的非static成員變數必須通過外部類的例項訪問

外部例項化靜態內部類物件的格式:

外部類.內部類  內部類物件= new 外部類.內部類();

如:

package inner.staticdemo;

public class Outer {
   private String name="中國";
   private static int population=14;
   
   static class StaticInner{
	   public void method(){
		   System.out.println("靜態內部類直接訪問外部類的static屬性:"+population);
		   Outer out=new Outer();
		   System.out.println("在靜態內部類中通過外部類物件訪問非static屬性:"+out.name);
	   }
   }
   
   public static StaticInner getStaticInner(){
	   return new StaticInner();
   }
}
package inner.staticdemo;

public class TestStaticInner {

	public static void main(String[] args) {
		Outer.getStaticInner().method();
		System.out.println("************************");
        Outer.StaticInner in=new Outer.StaticInner();
        in.method();
	}

}


截圖如下:


*** 區域性內部類

局域內部類是定義在一個方法中的內嵌類,所以類的作用範圍僅限於該方法中,而類生成的物件也只能在該方法中使用。

局域內部類不能包含靜態成員

特別注意:局域內部類要想訪問包含其的方法中的引數,則方法中的引數前必須加上final關鍵字(JDK<=1.7)。

如:

package inner.local;

public class Outer {
   private  String name="中國";
   public void func(int x){
	    class LocalInner{
		   public void method(){
			   System.out.println("局域內部類訪問外部類的屬性:"+name);
			   System.out.println("局域內部類訪問包含其方法的引數"+x);
		   }
	   }
	    
	   new LocalInner().method();   // 在局域內部類所在的方法中例項化局域內部類物件,並呼叫其方法
   }
}

package inner.local;

public class TestLocal {

	public static void main(String[] args) {
		Outer out=new Outer();
		out.func(5);

	}

}
截圖如下:

*** 匿名內部類

如果一個內部類在整個操作中只使用一次的話,就可以定義為匿名內部類

沒有名字的內部類,這是java為了方便我們編寫程式而設計的一個機制,因為有時候有的內部類只需要建立一個它的物件就可以了,以後再不會用到這個類,這時候使用匿名內

部類就比較合適。

如:

package inner.anonymity;

public interface Jumping {
    public void jump();
}
package inner.anonymity;

public class TestAnonumity {

	public static void main(String[] args) {
		Jumping j=new Jumping(){

			@Override
			public void jump() {
				System.out.println("某人跳樓了...");
			}
			
		};
		j.jump();

	}

}
結果截圖: