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类是不可变字符串 (不可变指的是指向的是地址里的内容是不可以变的 但是可以改变他的指向就是换一个地址) 一般对他操作以后会生成新的字符串(就是换一个地址)】