Java:继承和多态(必会知识点整理)

主要内容

  1. 继承
  2. 多态
  3. 向上转型
  4. 向下转型
  5. 方法重写
  6. 方法重载
  7. super关键字
  8. 动态绑定
  9. 封装访问控制
  10. 构造方法规则

一、继承

1. 概念:

一句话说就是:“共性抽取,代码复用”

    1. 子类会将父类中的成员变量或者成员方法继承到子类中
    1. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

2. 语法:

(1) extends

修饰符 class 子类 extends 父类{//...
}

(2) 父类成员访问:

访问1:子类中访问父类的成员变量
    1. 子类和父类不存在同名成员变量
    • 正常访问
    1. 子类和父类成员变量同名

    循就近原则,自己有优先自己的,如果没有则向父类中找。

    • 如果访问的同名成员变量子类中有,优先访问子类自己的成员变量

    • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错

    • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的

访问2:子类中访问父类的成员方法
  • 成员方法名字不同

    • 成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。
  • 成员方法名字相同

    class Parent {void show(int x) { System.out.println("Parent:int"); }
    }class Child extends Parent {void show(String s) { System.out.println("Child:String"); } // 重载void demo() {show(10);    // 调用父类方法show("hello"); // 调用子类重载方法}
    }
    
    • 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
    • 通过子类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载)根据调用方法适传递的参数选择合适的方法访问,如果没有则报错
class Base {int a = 10;String b = "父类";void methodA() { System.out.println("父类方法A"); }
}class Derived extends Base {int a = 20; // 同名成员变量void methodA() { System.out.println("子类重写方法A"); } // 方法重写void methodB() { System.out.println("子类特有方法B"); }void test() {System.out.println(a);        // 输出20(就近原则)System.out.println(super.a); // 输出10(显式访问父类)methodA();                   // 调用子类重写方法super.methodA();              // 调用父类被覆盖方法}
}

3. super

  • 在子类方法中访问父类的成员。

    • 只能在==非静态方法==中使用

    • 在子类方法中,访问父类的成员变量和方法。

    • superthis:

      class Animal {String type = "Animal";
      }class Cat extends Animal {String type = "Cat";void print() {System.out.println(this.type);   // Cat(当前对象成员)System.out.println(super.type);  // Animal(父类成员)}
      }
      
        1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
        1. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
        1. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
        1. 子类构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

4. 子类构造方法:

子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

  • 在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整
class Person {String name;Person(String name) { this.name = name; System.out.println("Person构造");}
}class Student extends Person {int id;Student(String name, int id) {super(name); // 必须第一行!this.id = id;System.out.println("Student构造");}
}public class Main {public static void main(String[] args) {Student s = new Student("张三", 1001);}
}

输出:

Person构造
Student构造
  • 注意:

      1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
      1. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
      1. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。并且只能出现一次。
      1. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

二、封装

(只针对Java,不同语言有些许差异)

No范围privatedefaultprotectedpublic
1同一包中的同一类
2同一包中的不同类
3不同包中的子类
4不同包中的非子类

三、多态

一句话说就是:完成某个行为,当不同的对象去完成时会产生出不同 的状态。

(1) 重写(override):

  • 也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

  • 注意:

    • 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致

    • 被重写的方法返回值类型可以不同,但是必须是具有父子关系的

    • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected

    • 父类被staticprivate修饰的方法、构造方法都不能被重写。

    • 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

(2) 重写和重载:

区别点重写(override)重载(overload)
参数列表一定不能修改必须修改
返回类型不能修改(除非是父子类兼容的返回类型)可以修改
访问限定符不能做更严格的限制(可以相同或更宽松)可以修改

(3) 静态绑定和动态绑定:

  • 静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。

  • 动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。

(4) 多态实现条件:

    1. 必须在继承体系下
    1. 子类必须要对父类中方法进行重写
    1. 通过父类的引用调用重写的方法
    父类类型 变量名 = new 子类对象();  
    变量名.方法(); // 实际调用的是子类重写的方法  
    
    class Animal {  void sound() { System.out.println("动物叫"); }  
    }  class Cat extends Animal {  @Override  void sound() { System.out.println("喵喵喵"); } // 重写  
    }  public class Main {  public static void main(String[] args) {  Animal a = new Cat(); // 向上转型  a.sound(); // 输出"喵喵喵"(动态绑定,执行子类方法)  }  
    }  
    

四、向上转移和向下转型:

1. 向上转型:

从小范围向大范围的转换

  • 实际就是创建一个子类对象,将其当成父类对象来使用。

  • 父类类型 对象名 = new 子类类型()

    Animal animal = new Cat("kitty",2)
    
  • 使用:

      1. 直接赋值

        Animal cat = new Cat("kitty",2); //子类对象直接赋值给父类对象
        
      1. 方法传参
      public static void eatFood(Animal a){a.eat();
      }
      
      1. 方法返回

         public static Animal getAnimal(String type) {if ("dog".equals(type)) {return new Dog();  // 向上转型:Dog→Animal} else if ("bird".equals(type)) {return new Bird(); // 向上转型:Bird→Animal}return new Animal();}
        

2. 向下转型(有风险):

将父类引用再还原为子类对象,即向下转换

public class Main {public static void main(String[] args) {Animal animal = new Cat();  // 向上转型// 向下转型(必须先向上转!)if (animal instanceof Cat) {  // 安全检查Cat cat = (Cat) animal;   // 强制转换cat.catchMouse();        // 输出"猫抓老鼠"}// 错误示例:直接转型非子类对象(运行时抛出ClassCastException)// Animal dog = new Animal();// Cat wrongCat = (Cat) dog;  // 报错!}
}

注意:

  • 必须通过 instanceof 检查安全性,避免 ClassCastException
  • 只有原本是子类对象的父类引用才能成功向下转型。

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

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

相关文章

基于esp32系列的开源无线dap-link项目使用介绍

基于esp32系列的开源无线dap-link项目使用介绍🔖有关esp32/8266相关项目:需要自己搭建编译环境: https://github.com/windowsair/wireless-esp8266-dap/tree/master🌿支持esp32/c3/s3,支持在线固件烧录,支持AP配网&…

深入了解linux系统—— 进程信号的产生

前言 进程在收到信号之后,可以立即处理,也可以在合适的时间再处理(1-31号普通信号可以不被立即处理) 信号不是被立即处理,信号就要被保存下来,让进程在合适的时间再去处理。 相关概念 在了解进程是如何保存…

【Bluedroid】蓝牙协议栈enable流程深度解析

本文详细剖析 Bluedroid 蓝牙功能启用的核心流程,从enable()函数触发开始,深入解析蓝牙协议栈的异步启动机制、核心协议模块初始化、硬件控制器绑定及状态同步全流程。重点阐述接口就绪性检查、异步线程管理、配置文件回调机制等关键环节,揭示…

各种开发语言主要语法对比

各类主流编程语言的语法有着显著差异,这些差异源于语言设计哲学(简洁性 vs 显式性)、应用领域(系统级、Web、数据科学)、运行方式(编译 vs 解释)以及支持的范式(面向对象、函数式、过…

小鹏汽车6月交付车辆34,611辆,同比增长224%

小鹏汽车-W(09868)发布公告,2025年6月,小鹏汽车共交付智能电动汽车34,611辆,同比增长224%,这标志着小鹏汽车已连续第八个月交付量超过了30,000辆。2025年第二季度,小鹏汽车共交付103,181 辆智能电动车,创下…

深入理解观察者模式:构建松耦合的交互系统

在软件开发中,我们经常遇到这样的场景:一个对象的状态变化需要通知其他多个对象,并且这些对象需要根据变化做出相应的反应。比如,用户界面中的数据变化需要实时反映到多个图表上,或者电商系统中的库存变化需要通知订单…

React强大且灵活hooks库——ahooks入门实践之常用场景hook

什么是 ahooks? ahooks 是一个 React Hooks 库,提供了大量实用的自定义 hooks,帮助开发者更高效地构建 React 应用。其中场景类 hooks 是 ahooks 的一个重要分类,专门针对特定业务场景提供解决方案。 安装 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget(一)1.QWidget2.enabled属性2.geometry🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Qt的学习】 📝📝本…

AIOT开发选型:行空板 K10 与 M10 适用场景与选型深度解析

前言 随着人工智能和物联网技术的飞速发展,越来越多的开发者、学生和爱好者投身于创意项目的构建。 在众多的开发板中,行空板 K10 和 M10 以其独特的优势脱颖而出。 本文旨在为读者提供一份详尽的行空板 K10 和 M10 对比分析,从适用场景、…

redis汇总笔记

语雀完整版: https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis笔记》 Redis 一般问题 Redis内存模型(I/O多路模型)多路复用IO如何解释 为什么Redis要使用单线…

STM32用PWM驱动步进电机

硬件介绍:连线:注意这里stp连的是pwm脉冲,dir连的是方向到时候代码pwm波形就是从这里来的,具体接线根据你的代码来注意要点:步进电机和舵机驱动是不一样的,它是根据步长来移动的,所以要开一个中…

力扣25.7.10每日一题——重新安排会议得到最多空余时间 II

Description 今天这道题和昨天类似,只是允许顺序变化。 Solution 把会议区间视作桌子,空余时间视作空位,我们要把一个桌子移到别的空位中。 初步想法是枚举桌子,找一个长度大于等于桌子长度的空位移过去。看上去,找…

IP报文分片与重组原理及实现分析

IP报文分片与重组原理及实现分析 引用: ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 当IP数据包大小超过MTU(最大传输单元)时,路由器/主机将其分割为多个片段传输,每个片段包含&…

[python]在drf中使用drf_spectacular

安装drf_spectacular 文档 pypi链接:https://pypi.org/project/drf-spectacular/ 文档链接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安装步骤 在环境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)

5.预训练模型跑分 回顾赛题 回顾赛题任务 挑战与难点: 标注数据少 ——> 半监督学习 or 数据增强 聚类分析噪点影响严重 回顾Baseline 问题: TF-IDF无法捕捉以下语义。聚类分析粗糙,未评估聚类质量。 提升方案: 分类任务…

SPSSPRO:数据分析市场SaaS挑战者的战略分析

目录 第一部分:执行摘要 第二部分:平台解构:产品、架构与用户体验 2.1 SaaS范式转移:架构与起源 2.2 功能能力:分析师的工具箱 2.3 “智能分析”的价值主张 第三部分:市场渗透与受众细分 3.1 目标用户…

低版本hive(1.2.1)UDF实现清除历史分区数据

目标&#xff1a;通过UDF实现对表历史数据清除 入参&#xff1a;表名、保留天数N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中顶层const与底层const

在C中&#xff0c;const关键字用于定义常量&#xff0c;但它在指针和引用上下文中会产生两种不同的常量性&#xff1a;顶层const&#xff08;top-level const&#xff09;和底层const&#xff08;low-level const&#xff09;。理解它们的区别是避免编译错误和提高代码质量的关…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数生态质量评价

集成云端、桌面端等环境&#xff0c;结合遥感云计算、GIS空间分析&#xff0c;R语言统计分析的优势&#xff0c;以分析生态环境脆弱性的时空演变为主线。通过本课程的学习&#xff0c;您将掌握&#xff1a;第一&#xff0c;收集各类指标数据&#xff0c;构建的“生态压力度-生态…

算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题

在计算机科学和数学领域&#xff0c;蒙特卡洛算法&#xff08;Monte Carlo Algorithm&#xff09;以其独特的随机抽样思想&#xff0c;成为解决复杂问题的有力工具。从圆周率的计算到金融风险评估&#xff0c;从物理模拟到人工智能&#xff0c;蒙特卡洛算法都发挥着不可替代的作…