面向对象的三个基本特性
-
封装:隐藏部分对象的属性和实现细节,对数据的访问只能通过对外公开的接口。通过这种方法,对象内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象私有部分。
-
继承:让某个类型的对象获取另一个类型对象属性的方法。继承就是子类继承父类的特征和行为,是的子类(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
-
多态:对于同一个行为,不同的子类对象具有不同的表现形式。多态存在的3个条件:1)继承; 2)重写; 3)父类引用指向子类对象。
Java 基本数据类型
- byte:字节,8个bit.
- shot:短整型,2个byte.
- int:整型,4个byte.
- long:长整型,8个byte.
- boolean:布尔类型,1个byte,只有true和false两个取值。
- float:浮点型,4个byte.
- double:双精度的浮点型,8个byte.
- char:2个byte,存储Unicode码,用单引号赋值,表示单个字符。
除了基本数据类型(primitive type),剩下的都是引用类型(reference type)。
String 也不是基本数据类型。
基本数据类型:直接存储在栈上
引用数据类型:数据存储在堆上,栈上只存储引用地址。
String 字符串
String 字符串是被 final 修饰的常量,通常存放在方法区中。
String 无法被继承,无法被修改,任何对他的修改都会产生一个新的字符串,然后引用指向新的字符串。
- String s = “xyz”; 会先去字符串常量池中检查是否存在了,如果存在则直接使用,如果没有则会在常量池中创建 “xyz” 对象。
- String s = new String(“xyz”); 包含上面的操作,另外还会在堆中创建一个内容与“xyz”相同的对象实例。
- String.intern()方法是一种手动将字符串加入常量池中的native方法。
== 和 equals 区别
-
== :运算符,用于比较基础类型变量和引用类型变量。对于基础类型的变量,比较的是变量保存的值是否相等,类型不一定要相同。对于引用类型变量,比较的是两个对象的地址是否相等。
-
equals:Object 中定义的方法,通常用于比较两个对象的值是否相等。equals 在 Object 方法中其实等同于 == ,但在实际的使用中,equals 通常被重写用于比较两个对象的值是否相等。
在Integer中引入了IntegerCache来缓存一定范围的值,默认范围:-128~127. 故在这个范围内,== 比较的是变量保存的值大小。超出这个范围之后比较的是两个对象的地址是否相等。
hashCode 和 equals
两个对象相等,也即a.equals(b),a.hashCode() = b.hashCode();但反之不成立。
hashCode 是一种哈希散列值,一个对象的hash值,通常采用对象的地址做哈希散列。
抽象类和接口
- 抽象类:是自下而上的抽象过程,抽象类提供了通用的实现,也提供抽象方法。一个类只能继承一个抽象类。
- 接口:是自上而下的抽象过程,所有的方法都是抽象方法。一个类可以实现多个接口。
反射
- 反射:在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为反射机制。