目录
一、子类对象实例化的过程
从结果上看
子类继承父类后,就获取了父类中声明的属性和方法。
创建子类的对象,在堆空间中,就会加载父类中声明的属性。
从过程上看
我们通过调用子类的构造器构造子类对象是,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器…直到调用到了 java.lang.Object 类中的空参构造器为止,所以构造顺序是先构造好父类,再构造子类。
图示:
二、向下类型转换 (不常用)
概念:从父类向子类进行转换。
三、Object 类的剖析
**属性:**无
方法:
equals() / toString() / finalize() / hashCode
线程相关:notify() / notifyAll() / wait()
重点:equals、toString
解释 finalize():当没有引用指向当前对象的时候,垃圾回收其调用该方法来回收这个对象。
四、== 与 equals 比较
4.1 不同点
1、== 是运算符,而 equals 是方法
2、== 可以比较基本数据类型和引用数据类型,equals 只可以比较引用数据类型
=== 比较基本数据类型的时候是比较两个变量的数值,比较引用数据类型的时候是比较两个变量的地址
equals 作为 Object 中的一个方法,而 Object 是所有类的父类,所以 equals 没有办法具体化,因此默认的是使用 == 来比较两个变量的地址,而有些类,如同 String 还有包装类重写了 equals 方法,所以可以比较具体的数据,我们在自己的类中使用 equals 的时候,一般要重写。
4.2 查看源码验证
// Object 源码对于 equals 的实现
public boolean equals(Object obj) {
return (this == obj);
}
// String 源码对于 equals 的实现,同时可以看到 Java 的 String 底层是 char[]
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;
}
//Integer 源码对于 equals 的实现
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
五、包装类
5.1、包装类的引入
Java 中定义了基本数据类型 int、float、char、boolean 等等,而作为一门纯面向对象的语言,Java 的思想就是一切皆对象,自然不能单独存在这样的类型,所以定义了包装类,把这些基本数据类型包装到类里面来让它们具有类的特性。
5.2、自动装箱与自动拆箱
5.2.1 装箱与拆箱
例:
public static void main(String[] args) {
Integer i1 = new Integer(10); //装箱,编译器提示 Unnecessary boxing 'new Integer(10)'
int i2 = i1.intValue(); //拆箱, 编译器提示 Unnecessary boxing 'new Integer(10)'
}
5.2.2 自动装箱与自动拆箱
因为如同 2.1 那样的操作在实际应用中很常见,所以为了方便程序员写代码,在 JDK1.5 引入了自动装箱与自动拆箱的操作
例:
public static void main(String[] args) {
Integer i1 = 10; //自动装箱
int i2 = i1; //自动拆箱
test(i2); //调用 test 来展示装箱
}
public static void test(Integer i2) {
System.out.println(i2);
}
六、包装类考题
(题目一)
题目如上,问:两个输出是否相同
答:不同,第一个输出 1.0,第二个输出 1。在第一个里面用到了 ‘ :’ 这个运算符,而我们知道,在两个基本数据类型进行运算的时候,会把较低级别的数据类型提升到高级别的类型上去。