面向对象(中)

一、子类对象实例化的过程

从结果上看

​ 子类继承父类后,就获取了父类中声明的属性和方法。

​ 创建子类的对象,在堆空间中,就会加载父类中声明的属性。

从过程上看

​ 我们通过调用子类的构造器构造子类对象是,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器…直到调用到了 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。在第一个里面用到了 ‘ :’ 这个运算符,而我们知道,在两个基本数据类型进行运算的时候,会把较低级别的数据类型提升到高级别的类型上去。

发布了42 篇原创文章 · 获赞 3 · 访问量 2068

猜你喜欢

转载自blog.csdn.net/stable_zl/article/details/104646358