类:封装的是对象的属性和行为
方法:封装的是具体的业务逻辑功能实现
访问控制修饰符:封装具体的访问权限,以保护数据的安全
继承:作用:代码复用
超类:所有派生类所共有的属性和行为
接口:部分派生类所共有的属性和行为
派生类:派生类所特有的属性和行为
特性:单一继承、多接口实现、具有传递性
多态:行为的多态:所有抽象方法都是多态的(通过方法重写来实现)
对象的多态:所有对象都是多态的(通过向上造型来实现)
最少具备两种状态:自己的形态和object的形态
方式:向上造型、强制类型转换、instanceof判断
String:字符串类型1、java.lang.String使用final修饰,不能被继承
2、java中的String在内存中采用Unicode编码方式,任何一个字符都占用两个字节的编码
3、字符串一旦创建,对象内容永远无法改变,但字符串引用可以重新赋值-----不变对象
lang包中String类,有一个private final char value[],String维护的是一个char的数组
final表示一旦创建,对象不能被改变
字符串底层封装了字符数组,以及针对字符数组的操作算法
常量池java对字符串有一个优化措施:字符串常量池(堆中)
java推荐我们使用字面量/直接量方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再将创建字符串时会重用对象以减少内存开销,避免内存中堆积大量内容相同的字符串对象
public class StringDemo {
public static void main(String[] args) {
//直接双引号赋值的称为“字面量”
String s1 = "abc123";//常量池还没有,因此创建了该字符串对象,并存入常量池中
String s2 = "abc123";//常量池有该字符串,直接拿来用,s1与s2地址相同
//s2复用了这个对象
System.out.println(s1==s2);
s1 = s1 + "!";//堆中会创建了一个新的对象"123abc",并将地址赋值给s1,
//因为不是直接用字面量赋值,所以生成的对象"123abc"不会存在常量池中
//只是在堆中创建对象
System.out.println(s1==s2);
}
}
//输出:true
false
字面量赋值会存储在常量池中,用字符串连接符(+)连接后再赋值的在常量池中没有分配
public class StringDemo {
public static void main(String[] args) {
String s1 = "123abc";//堆中会创建一个"123abc"的对象,常量池中有一个"123abc"的地址
String s2 = "123" + "abc";//复用常量池中的对象
//编译器在编译时,若发现时两个字面量操作,
//则直接运算好并将结果保存到表达式中,相当于String s2 = "123abc";
System.out.println(s1==s2);
String s3 = "123";
String s4 = s3 + "abc";
//不是两个字面量操作,编译器不能直接确定值,会在堆中创建新的对象,而不会复用常量池中的对象
System.out.println(s1==s4);
}
}
//输出:true
false



