Java官方笔记6继承

news2024/11/18 3:49:16

继承

Java只有单继承,最顶级的父类是Object。

子类会继承父类的fields和methods,而不会继承constructors,因为constructors不属于methods,但是子类可以通过super调用父类的constructor。

子类继承父类的范围是:public、protected、package-private

隐式转换,子类转父类(只有1个爸爸):

Object obj = new MountainBike();

显示转换,父类转子类(有多个子女,所以要明确指定):

MountainBike myBike = (MountainBike)obj;

类有field,而接口没有,所以在多继承时就有问题:如果多个类有相同的field,那么子类将不知道用哪一个,而接口不存在这个问题。Java不支持继承多个类,但是可以实现多个接口。

重载

子类的方法跟父类有完全相同的签名和返回类型(也可以是子类),将会覆盖父类方法Override

如果子类定义了1个static方法,跟父类完全相同,那么父类方法会被隐藏Hide

Override和Hide是不同的:

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;  // 隐式转换
        Animal.testClassMethod();  // 调的父类
        myAnimal.testInstanceMethod();  // 父类对象引用,还是调的子类
    }
}
The static method in Animal
The instance method in Cat

Override只会调子类方法,而Hide取决于调用方是父还是子,比如这里的myCat,隐式转换为父类Animal后,会调父类的static方法,而调的实例方法却是子类的。(如果不是隐式转换,而是直接给父类实例化,那肯定还是调父类方法)

类instance方法优先于接口default方法:

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}

public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}

public interface Mythical {
    default public String identifyMyself() {
        return "I am a mythical creature.";
    }
}

public class Pegasus extends Horse implements Flyer, Mythical {
    public static void main(String... args) {
        Pegasus myApp = new Pegasus();
        System.out.println(myApp.identifyMyself());
    }
}

输出为I am a horse.

Override的优先:

public interface Animal {
    default public String identifyMyself() {
        return "I am an animal.";
    }
}

public interface EggLayer extends Animal {
    default public String identifyMyself() {
        return "I am able to lay eggs.";
    }
}

public interface FireBreather extends Animal { }

public class Dragon implements EggLayer, FireBreather {
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}

输出为I am able to lay eggs

如果实现多接口,有同名的,需要显示指定调用方:

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

public interface FlyCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public class FlyingCar implements OperateCar, FlyCar {
    // ...
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);  // 显示指定,并且使用super
        OperateCar.super.startEngine(key);  
    }
}

总结下,如果子类方法签名+return跟父类方法一样,有以下4种情况:

注意compile-time error,static方法不能和instance方法一样,因为它们是不同级别的。

多态

MountainBike和RoadBike都继承Bicycle,虽然都有printDescription,但它们有多样的形态:

public class MountainBike extends Bicycle {
    private String suspension;

    public MountainBike(
               int startCadence,
               int startSpeed,
               int startGear,
               String suspensionType){
        super(startCadence,
              startSpeed,
              startGear);
        this.setSuspension(suspensionType);
    }

    public String getSuspension(){
      return this.suspension;
    }

    public void setSuspension(String suspensionType) {
        this.suspension = suspensionType;
    }

    public void printDescription() {
        super.printDescription();
        System.out.println("The " + "MountainBike has a" +
            getSuspension() + " suspension.");
    }
}
public class RoadBike extends Bicycle{
    // In millimeters (mm)
    private int tireWidth;

    public RoadBike(int startCadence,
                    int startSpeed,
                    int startGear,
                    int newTireWidth){
        super(startCadence,
              startSpeed,
              startGear);
        this.setTireWidth(newTireWidth);
    }

    public int getTireWidth(){
      return this.tireWidth;
    }

    public void setTireWidth(int newTireWidth){
        this.tireWidth = newTireWidth;
    }

    public void printDescription(){
        super.printDescription();
        System.out.println("The RoadBike" + " has " + getTireWidth() +
            " MM tires.");
    }
}

所谓的虚拟方法调用,名字很高大上,其实质就是,子类重载了父类方法,在调用子类实例方法时,先调子类实现:

注意,子类的field如果和父类的一样,那么父类的field会被hide,即使type不一样。如果要使用父类的field,需要关键字super。同名fileld是不好的设计,应该尽量避免。

super关键字

public class Superclass {

    public void printMethod() {
        System.out.println("Printed in Superclass.");
    }
}
public class Subclass extends Superclass {

    // overrides printMethod in Superclass
    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

在子类constructor中,如果没有显式super,那么会调用默认的super()

Object

Java中的所有类,都终极继承了Object。(继承链的顶端)

toString()

System.out.println(firstBook.toString());

equals()

public class Book {
    String ISBN;
    
    public String getISBN() { 
        return ISBN;
    }
    
    public boolean equals(Object obj) {
        if (obj instanceof Book)
            return ISBN.equals((Book)obj.getISBN()); 
        else
            return false;
    }
}

hashCode()

如果两个对象相等,那么它们的hashCode一定相等。重写equals(),必须重写hashCode()

getClass()

void printClassName(Object obj) {
    System.out.println("The object's" + " class is " +
        obj.getClass().getSimpleName());
}

clone()

aCloneableObject.clone();

finalize()

垃圾回收时调用。它的调用时机是不确定的,不要使用它来做逻辑。

抽象

abstract class,抽象类,不能被实例化,但是可以继承。

abstract void moveTo(double deltaX, double deltaY);

如果抽象类有method,那么也必须是abstract:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

子类必须抽象类的所有方法,否则子类也必须是abstract。

抽象类:(not static、final) field,(public、protected、private) method

接口:public static final field,public method

Java中,抽象类的例子是AbstractMap、接口的例子是HashMap实现的Serializable, Cloneable, and Map<K, V>接口。

image-20230602232643026

如果类没有实现接口中的所有方法,可以定义为abstract,然后由子类来实现剩余的全部方法:

abstract class X implements Y {
  // implements all but one method of Y
}

class XX extends X {
  // implements the remaining method in Y
}

X没有实现全部方法,所以是abstract,子类XX实现剩余全部方法。

参考资料:

Inheritance https://dev.java/learn/inheritance/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录--让URL地址都变成了ooooooooo

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 发现一个很有创意的小工具网站&#xff0c;如封面图所示功能很简单&#xff0c;就是将一个URL地址转换为都是 ooooooooo 的样子&#xff0c;通过转换后的地址访问可以转换回到原始地址&#xff0c;简单…

chatgpt赋能python:Python创建Word文档指南

Python创建Word文档指南 在今天的数字时代&#xff0c;Word文档仍然是最常见和使用的文档类型之一。Python是一个强大的编程语言&#xff0c;可以用于自动化创建各种类型的文档&#xff0c;包括Word文档。在本篇文章中&#xff0c;我们将介绍如何使用Python创建Word文档&#…

Rust每日一练(Leetday0019) 跳跃游戏、合并区间、插入区间

目录 55. 跳跃游戏 Jump Game &#x1f31f;&#x1f31f; 56. 合并区间 Mmerge Intervals &#x1f31f;&#x1f31f; 57. 插入区间 Insert Interval &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专…

KP3114电源IC介绍--【其利天下】

KP3114 是一款高性能低成本 PWM 控制功率开关&#xff0c;适用于离线式小功率降压型应用场合&#xff0c;外围电路简单、器件个数少。同时产品内置高耐压 MOSFET 可提高系统浪涌耐受能力。 与传统的 PWM 控制器不同&#xff0c;KP3114 内部无固定时钟驱动 MOSFET&#xff0c;系…

为什么陶瓷板视觉技术会越来越受到人们的青睐?

随着科技的不断进步和应用&#xff0c;陶瓷板视觉技术越来越受到人们的青睐。陶瓷板视觉技术是一种新型的非接触式检测技术&#xff0c;它可以在生产过程中对产品进行高效、准确的检测和质量控制。下面我们来详细了解一下陶瓷板视觉技术的优势和应用。 一、优势 1.高效性 陶…

10款抓包工具优缺点对比

1. Wireshark 介绍&#xff1a;Wireshark是一个免费的网络协议分析工具&#xff0c;支持Windows、macOS和Linux等多个平台。它可以捕获和分析网络数据包&#xff0c;支持多种网络协议解码。优点&#xff1a;功能强大、支持多种协议解码、支持多平台、过滤器功能强大、免费开源。…

QT+OpenGL实例化和抗锯齿

QTOpenGL实例化和抗锯齿 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 实例化 如果我们需要渲染大量物体时&#xff0c; 代码看起来会像这样&#xff1a; for(int i 0; i < amount; i) {DoSom…

Mybatis 别名的配置 + Mybatis配置类的调查

参考资料 Mybatis配置类别名mybatis-spring-boot-autoconfigure类型别名&#xff08;typeAliases&#xff09;SpringBoot五步配置Mybatis超简教程 目录 一. 使用场景二. 前期准备2.1 实体类2.2 查询接口 三. 配置方式1 配置文件的方式3.1 application.yml文件3.2 SQL的XMl文件…

做完这些lab,国内外大厂横着走

hi&#xff0c;大家好&#xff0c;这里是极客重生&#xff0c;坚实的计算机基础&#xff0c;对我们发展都是至关重要的&#xff0c;不管是校招还是社招&#xff0c;因此我和小伙伴一起收集了一些国内外硬核lib和开源项目来帮助大家学习和巩固基础&#xff08;动手实践&#xff…

计算机组成原理 第一章_概述

typora-copy-images-to: images 文章目录 typora-copy-images-to: images1.现代计算机的结构2.各硬件的工作原理2.1 主存储器的基本组成2.2 运算器的基本组成2.3 控制器的基本组成2.4 计算机的工作过程 3.计算机系统的层次结构4. 计算机的性能指标4.1存储器的性能指标4.2 CPU的…

14-Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…

chatgpt赋能python:Python如何创建一个DataFrame

Python如何创建一个DataFrame 在数据科学和分析领域中&#xff0c;DataFrame是一种非常常见的数据结构。它类似于电子表格&#xff0c;可以存储和处理包含多个列和行的数据。在Python中&#xff0c;pandas库提供了DataFrame数据结构的支持。 什么是DataFrame&#xff1f; Da…

Hugging News #0602: Transformers Agents 介绍、大语言模型排行榜发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

聚观早报 | B站第一季度净亏损同比下降72%;​必应聊天放宽限制

今日要闻&#xff1a;B站第一季度净亏损同比下降72%&#xff1b;必应聊天放宽限制&#xff1b;马斯克再次成为世界首富&#xff1b;英伟达CEO黄仁勋计划访华&#xff1b;联想moto razr 40系列新品发布 B站第一季度净亏损同比下降72% 6 月 1 日消息&#xff0c;哔哩哔哩&#x…

哈希表理论基础

目录 哈希表 哈希函数 哈希碰撞 一般哈希碰撞有两种解决方法&#xff0c; 拉链法和线性探测法。 拉链法 线性探测法 常见的三种哈希结构 set map 总结 哈希表 哈希表是根据关键码的值而直接进行访问的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通…

Linux NGINX 优化与防盗链

----------------隐藏版本号------------------- 可以使用 Fiddler 工具抓取数据包&#xff0c;查看 Nginx版本&#xff0c; 也可以在 CentOS 中使用命令 curl -I http://192.168.80.101 显示响应报文首部信息。 curl -I http://192.168.80.101 方法一&#xff1a;修改配置文件…

java工程师技术成长之路

1、新手阶段&#xff0c;全面、扎实地掌握语言的基本要素是你的当务之急。当然&#xff0c;除了语言&#xff0c;你还需要了解与编程相关的其他周边知识。 2、工作了几年&#xff0c;整天忙于业务代码&#xff0c;初级工程师很容易困惑下一步的方向在哪里&#xff0c;并且相当多…

KVM 虚拟化

1.1 前言 1.1.1 什么是虚拟化&#xff1f; 在计算机技术中&#xff0c;虚拟化&#xff08;技术&#xff09;或虚拟技术&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff08;CPU、内存、磁盘空间、网络…

当你怀疑电脑的时候,就是该换个方法的时候了

做软件开发的朋友们&#xff0c;干的时间长了&#xff0c;相信都会有过类似的体验&#xff1a;一个问题查了很久很久&#xff0c;代码检查了很多遍很多遍&#xff0c;到最后都要怀疑电脑了&#xff0c;突然发现是一个特别隐蔽的错误导致的&#xff0c;而这种错误通常不涉及逻辑…

2021第十二届蓝桥杯Python组国赛【真题+解析+代码】

&#x1f381;2021第十二届蓝桥杯python组国赛真题 &#x1f680; 真题练习&#xff0c;冲刺国赛 &#x1f680; 2021第十二届蓝桥杯python组国赛真题解析代码 博观而约取&#xff0c;厚积而薄发 &#x1f3c6;国赛真题目录 文章目录 &#x1f381;2021第十二届蓝桥杯python组国…