内部类、Object、字符串
01 内部类
-
概念:类中被包含的类
-
特点:不能直接获取
-
优点:访问方式隐蔽
-
格式
class 类名 { // 内部类 class 类名 { } }
-
访问方式
外部类.内部类 变量名 = new 外部类对象.new 内部类对象
-
本类可以直接创建内部类对象
-
内部类可以访问外部类的属性和方法
补充:匿名内部类
-
特点:只用到了一次,可以直接使用匿名内部类实现
-
优点:不用单独再创建一个类来实现
接口 变量 = new 接口() { //方法体 }
02 Object
-
概念:Object是所有类的父类,所有类都默认直接继承Object(除非已有父类,则间接继承Object)
-
特点:有许多已经写好的方法
-
优点:不用自己写方法
-
常见方法
-
toString():用字符串表示该对象
Cat cat=new Cat(); System.out.println(cat.toString());//com.mashang.Cat@1b6d3586 System.out.println(cat);//com.mashang.Cat@1b6d3586 //因为System.out.println();方法输出的就是对象的toString方法 /* println方法: public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } } */ /* valueOf方法: public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } */ /* toString方法: public String toString() { return getClass().getName() + "@" +Integer.toHexString(hashCode()); } */
-
hashCode():给不同的对象返回不同的整数(唯一)
System.out.println(cat.hashCode());460141958 System.out.println(cat1.hashCode());1163157884
-
finalize():用于垃圾回收,没用,虚拟机会自己回收
-
equals():比较两个对象地址的值
/* == 比较的是引用数据类型时,比较的是地址值 == 比较的是基础数据类型时,比较的是值 public boolean equals(Object obj) { return (this == obj); } */
03 字符串
-
概念:就是一系列的字符组合的串,在Java中单引号''表示字符,双引号""表示字符串
-
特点:不是基本数据类型,是引用类型
-
两种方式创建
直接创建
String str = "今天又是被帅醒的一天";
使用new创建
String str1 = new String("Hello");
区别:
-
存储地区不同:用new创建的直接存在堆内存中,直接创建的存在堆内存中的字符常量池中
String str1="a"; String str2="a"; String str3=new String("a"); String str4=new String("a"); System.out.println(str1 == str2);//true System.out.println(str1 == str3);//false System.out.println(str3 == str4);//false
-
字符常量池中所有的值仅有一份,变量名储存的只是地址值
-
操作字符串的方法请多阅读文档
-
字符串的equals方法:Object的方法在String类里被重写
//不在单纯比较地址值了 System.out.println(str3.equals(str4));//true /* public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } */
-
StringBuffer
-
概念:线程安全的可变字符串
-
特点:值可以变化,可以添加、修改、删除值,但不会改变地址,不会产 生新的字符串
-
优点:提高了安全性
-
线程:多个线程同时操作一个资源的时候,可能会发生数据安全问题。
-
StringBuilder
-
用法和StringBuffer一样,只是StringBuilder是非线程安全的
-
线程安全:多个线程同时操作时,有且仅有一个正在操作,其余线程处于等待阶段