类和类之间的关系之继承

  • 继承 实现 (A is-a B) 也叫作泛化
  • 组合 聚合 关联 (A)
  • 依赖

继承

子类 => 父类

  • 子类继承父类, 通过一个关键字 extends

  • 子类可以调用父类允许子类调用的方法/属性

  • 子类可以添加一些独有的方法或者属性, 减少代码的冗余

  • 子类继承来的方法不一定能满足子类的要求=> 重写(override), 重写意味着改变内部内容, 保留结构. 不同于重载(overload), 重载的例子比如说System.out.print()方法

  • 每一个类都有继承类, 如果没有extends显式的继承某个类, 默认继承 object. 它是任何一个引用类型的父类. object没有父类. 比如
    toString(): public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
    getClass(): 获取对象对应类的类映射
    hashCode(): public native int hashCode(), 将对象在内存中的地址经过某个算法计算成一个整数
    equals(): 比较两个基本值是否相等, 比较两个引用值的地址是否相等,. 可以进行重写
    wait(): 让线程进入等待状态
    notify(): 唤醒线程
    notyfyAll(): 唤醒所有线程
    finalize(): 权限修饰符是 portected, 对象被GC回收的时候, 默认调用的方法
    clone(): 克隆对象用的.

final, fanally, finalize区别?

final 是一个权限修饰符
finally 是 try-catch 的最后关键字
finalize 是垃圾回收机制回收对象的默认会调用的方法

  • 每个类只能继承一个类, extends后面只能跟一个类的名字, 目的是让类变得更加安全. 如果继承了两个类, 两个类里面都有一个方法叫做test, 那么子类调用 test 方法的时候, 到底是调用的谁的呢?
  • 可以使用传递的方式进行多继承, 人 继承 动物, 父亲 继承 人, 儿子 继承 父亲
  • 继承在内存中的存储形式
    Person p = new Person() 等号左边存在于栈内存, 等号右边存在于堆内存

    new Person的时候, 不但调用了Person的构造方法, 还调用了Animal的构造方法.
    所以, p.toString()是先去Person类里面找, 然后去Animal里面找, 最后在Object里面找到.
  • this 和 super
    this 指代当前执行方法时的对象, 不一定是当前类的
    super 当前执行方法时的对象的父类
public class Animal {
    public String name;

    public void eat(){
        System.out.println("动物吃饭");
    }
    public void sleep(){
        this.eat();
        System.out.println("动物睡觉");
    }
}

子类在调用sleep方法的时候, 会执行this.eat(), 但是这个 eat() 是子类的方法, 而非是父类的.

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务