1.内部類的詳解:(innerclass)
内部類是可以看成自己外部類的一個成員,他是可以通路外部類的私有的東西;
1.成員内部類(a.成員内部類b.靜态内部類c.局部内部類(定義在方法裡面,基本不用))
非靜态内部類必須寄存在一個外部類裡面,非靜态内部類對象單獨屬于外部類對象;(可以把他看成 成員變量,外部類對象存在他才能被調用)
靜态内部類他就相當于靜态成員,是以當他存在的時候外部類對象是可以不存在的,因為靜态成員是直接屬于方法區的類,而不是屬于堆的對象;
2.匿名内部類
定義和調用放在一起,一般隻用于監聽裝置;
package testInnerClass;
/**
* 測試内部類
* @author Wang
*
*/
public class innerClass {
public static void main(String[] args) {
Face f = new Face();
Face.Nose n = f.new Nose();//生成内部類對象要先建立一個外部類對象 然後在這樣建立一個内部類對象
n.breath();
Face.Ear e = new Face.Ear();//這個沒有使用外部類的對象來建
e.listen();
}
}
class Face{
String type = "外部類的type";
String shape = "瓜子臉";
static String color = "白裡透紅";
class Nose{
String type = "内部類的type";
void breath() {
System.out.println(shape);//當内部類沒有這個方法的時候可以直接調用外部類的屬性
System.out.println(Face.this.type);//當内外都有type時調用外部類的type要這樣調用
System.out.println("呼吸!");
System.out.println(color);//普通内部類它可以使用外部類的靜态屬性
}
}
static class Ear {//靜态内部類 他不能使用外部類的普通屬性但是它可以使用外部類的靜态屬性
void listen(){
System.out.println(color);//它可以使用外部類的靜态屬性
System.out.println("我在聽!");
}
}
}
總結:其實普通内部類與靜态内部類的使用方法和成員函數和靜态函數的方法是一樣的(普通的可以通路靜态的,靜态的不能通路普通的【普通的是造好的汽車(它屬于對象在堆裡),靜态的是汽車的圖紙(他屬于類在方法區);意思就是靜态的(圖紙)存在,非靜态的(汽車)不一定存在,汽車存在則圖紙一定存在】;
2.String類的詳解
package testString;
/**
* 測試String類的用法
* @author HP
*
*/
public class testString01 {
public static void main(String[] args) {
String str = new String("abcd");//注意這裡隻是建立了一個String類的對象 你别錯看成是建立一個String的數組
//String[] str1 = new String[10];//這裡才是建立一個String的數組;
String str2 = new String("abcd");
System.out.println(str.equals(str2));//這裡是true 他是先比較是不是一個位址是一個位址輸出true 然後比較内容内容一樣也是true
System.out.println(str == str2);//這裡是false 他是之比較是不是一個位址 即是 比較是不是指向同一個對象
String str3 = "def";
String str4 = "def";
System.out.println(str3.equals(str4));//輸出true
System.out.println(str3 == str4);//輸出true 原因是因為str3和str4都是指向常量池的“def” 是一個位址 str1和str2是堆裡面的兩個不同的對象
System.out.println(str.charAt(2)); //截取字元串的第三個量輸出
System.out.println(str.indexOf('a'));//這個函數的作用是傳回他在字元串裡的位置 這裡傳回0 注意在輸入字元的時候别忘家單引号
System.out.println(str.indexOf('y'));//當你檢索一個不存在字元位置的時候 他會傳回-1;
String s = str3.substring(1);//從你輸入的那個參數的指開始截取這個字元串
System.out.println(s);
String str5 = str3.replace('e', '*');//把字元串裡的e 替換為* 生成一個新的字元串
System.out.println(str5);
String str6 = "abcde,rrtt,cccee";
String[] strArray = str6.split(",");//把一個字元串以逗号為界限截成幾部分存到字元串數組裡
for(int i=0;i<strArray.length;i++){//然後周遊輸出;
System.out.println(strArray[i]);
}
String str7 = " aa bb ";
String str77 = str7.trim();//去掉字元串開頭和結尾的空格中間的不、動
System.out.println(str77.length()); //是以輸出他的長度的是6
System.out.println("**********************");
System.out.println("Abc".equalsIgnoreCase("abc"));//忽略大小寫的比較
System.out.println("Abcbd".indexOf('b')); //查詢第一個b的位置從前往後
System.out.println("Abcbd".lastIndexOf('b')); //查詢第一個b的位置從後往前
System.out.println("Abcbd".startsWith("Ab")); //查詢是不是以“Ab”開頭
System.out.println("Abcbd".endsWith("bd")); //查詢是不是以“bd”開頭
System.out.println("Abcbd".toLowerCase()); //把字元串全部改為小寫
System.out.println("Abcbd".toUpperCase()); //把字元串全部改為大寫
System.out.println("**********************");
String gh = new String("a");//也就是所這裡會有兩個對像 一開始會先生成一個"a"對象 然後new一個對象把“a”放到裡面 然後把"a"的指放裡面;
for (int i = 0; i < 10; i++) {
gh = gh + i;
}//一共有12個對象 如果改成這樣String gh = a;就會改為11個對象
System.out.println(gh);
}
}
下面是記憶體分析:

方法區的内容:
注意:待驗證的問題:【String類是不可變字元串 (不可變指的是指向的是位址裡的内容是不可以變的 但是可以改變他的指向就是換一個位址) 一般對他操作以後會生成新的字元串(就是換一個位址)】