JAVA基础 - 继承和多态

news2024/11/17 9:42:08

目录

一. 继承

二. 多态

三. 引用类型的转换 检查

向上转型(Upcasting)

向下转型(Downcasting)

四. final关键字



一. 继承

在 Java 中,继承(Inheritance)是面向对象编程的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。

优点

  1. 代码复用:子类可以直接使用父类中定义的属性和方法,无需重新编写相同的代码,提高了代码的可重用性。

  2. 层次结构:有助于建立清晰的类层次结构,反映现实世界中的对象关系。

  3. 易于扩展:通过继承,可以在不修改父类代码的情况下,为子类添加新的属性和方法,扩展功能。

语法

使用 extends 关键字来表示继承关系。

class Parent {
    // 父类的属性和方法
}

class Child extends Parent {
    // 子类的属性和方法
}

访问控制

  1. 子类可以访问父类的 public 和 protected 成员。

  2. 如果子类和父类在同一个包中,子类还可以访问父类的默认访问权限(没有明确修饰符)的成员。

方法重写(Override)

子类可以重写父类的方法,方法名、参数列表和返回类型必须与父类被重写的方法相同。重写的方法体可以根据子类的需求进行修改。

class Parent {
    public void method() {
        System.out.println("Parent's method");
    }
}

class Child extends Parent {
    @Override
    public void method() {
        System.out.println("Child's method");
    }
}

构造方法

  1. 子类的构造方法在创建对象时会首先调用父类的无参构造方法(如果父类没有定义无参构造方法,必须在子类的构造方法中显式地调用父类的有参构造方法)。

  2. 可以在子类的构造方法中通过 super 关键字调用父类的构造方法。

示例

class Animal {
    protected String name;

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        this.name = name;
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }

    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat();
        dog.bark();
    }
}

继承使得代码更加简洁、可维护和可扩展,但也要注意合理使用,避免过度复杂的继承层次和不必要的继承。

二. 多态

在 Java 中,多态(Polymorphism)是面向对象编程的重要特性之一,它允许不同的对象对同一消息或操作做出不同的响应。

多态的类型

  1. 编译时多态(方法重载 - Overloading):在同一个类中,存在多个方法具有相同的名称,但参数的数量、类型或顺序不同。在编译时,根据传递的参数类型和数量来决定调用哪个具体的方法。

    例如:

   class Calculator {
       public int add(int a, int b) {
           return a + b;
       }

       public double add(double a, double b) {
           return a + b;
       }
   }
  1. 运行时多态(方法重写 - Overriding):子类继承父类的方法,并对其进行重新定义。在运行时,根据对象的实际类型来决定调用子类还是父类中被重写的方法。

    例如:

   class Animal {
       public void makeSound() {
           System.out.println("The animal makes a sound");
       }
   }

   class Dog extends Animal {
       @Override
       public void makeSound() {
           System.out.println("The dog barks");
       }
   }

实现多态的条件

  1. 继承:子类继承父类。

  2. 方法重写:子类重写父类的方法。

  3. 父类引用指向子类对象:通过父类类型的引用变量来引用子类对象。

    例如:

   Animal animal = new Dog(); 
   animal.makeSound();  // 实际调用的是 Dog 类中重写的 makeSound 方法

多态的优点

  1. 增强了代码的灵活性和可扩展性,使得代码更易于维护和修改。

  2. 提高了代码的复用性,不同的对象可以通过相同的方法调用实现不同的功能。

  3. 使得程序的设计更加符合现实世界的逻辑,能够更好地模拟不同类型对象的行为差异。

总之,多态是 Java 中非常强大的特性,合理运用多态可以使程序更加简洁、高效和易于理解。

三. 引用类型的转换 检查

在 Java 中,当涉及多态和引用类型的转换时,需要特别注意类型的兼容性和转换的安全性。

向上转型(Upcasting)

将子类对象的引用赋值给父类类型的变量,这是自动进行的,因为子类对象总是可以被当作父类对象来处理。

例如:

class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    public void bark() {
        System.out.println("Dog is barking");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal = new Dog();  // 向上转型,自动完成
        animal.eat();  // 调用的是 Dog 类重写的 eat 方法
    }
}

向下转型(Downcasting)

将父类对象的引用转换为子类类型的变量。这是不安全的,除非确定引用实际指向的是子类对象,否则可能会导致运行时错误 ClassCastException 。

在进行向下转型之前,需要使用 instanceof 运算符进行类型检查,以确保转换的安全性。

例如:

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal = new Dog();  // 向上转型

        if (animal instanceof Dog) {  // 类型检查
            Dog dog = (Dog) animal;  // 向下转型
            dog.bark();
        }
    }
}

instanceof 运算符用于判断一个对象是否是某个类或其子类的实例,如果是则返回 true ,否则返回 false 。

总之,在处理多态中的引用类型转换时,要谨慎进行,充分利用 instanceof 进行类型检查,以避免运行时错误。

四. final关键字

在 Java 中,final 关键字有多种用途:

  1. 修饰变量

    • 当 final 修饰基本数据类型的变量时,该变量的值一旦被初始化就不能再被修改。
    • 当 final 修饰引用数据类型的变量时,该变量所引用的对象不能再被重新赋值,但对象的属性值可以修改。

    例如:

    final int num = 10;  // 不能再修改 num 的值
    final String str = "Hello";  // 不能再修改 str 的值
    final List<String> list = new ArrayList<>();  // 不能将 list 重新指向其他对象,但可以修改 list 中的元素
  1. 修饰方法:被 final 修饰的方法不能被子类重写。

    例如:

    class Parent {
        final void finalMethod() {
            // 方法实现
        }
    }

    class Child extends Parent {
        // 不能重写 finalMethod 方法
    }
  1. 修饰类:被 final 修饰的类不能被继承。

    例如:

    final class FinalClass {
        // 类的实现
    }

    // 以下代码会报错,因为不能继承 final 类
    // class SubClass extends FinalClass {}

使用 final 关键字可以提高代码的安全性和可读性,防止意外的修改和不必要的继承重写。

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

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

相关文章

openEuler操作系统下Oracle 19c 从19.3补丁更新到19.17

Oracle 19c 从补丁19.3更新到19.17的过程涉及到多个步骤&#xff0c;包括备份、下载补丁、替换OPatch、验证清单信息、冲突检测、空间检测、应用补丁等。以下是一个概括性的流程&#xff0c;但请注意&#xff0c;具体步骤可能会根据实际的Oracle环境、补丁内容和Oracle的官方指…

基于python的BP神经网络红酒品质分类预测模型

1 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow.keras.models import Sequential from tenso…

DataEase一键部署:轻松搭建数据可视化平台

DataEase是一个开源的数据可视化和分析工具&#xff0c;旨在帮助用户轻松创建和共享数据仪表盘。它支持多种数据源&#xff0c;包括关系型数据库&#xff0c;文件数据源&#xff0c;NoSQL数据库等&#xff0c;提供强大的数据查询、处理和可视化功能。DataEase 不仅是一款数据可…

oracle读写时相关字符集详解

服务器端操作系统&#xff08;Oracle linux&#xff09;字符集 服务器端数据库字符集 客户端操作系统&#xff08;Oracle linux&#xff09;字符集 客户端工具sqlplus字符集 结论1&#xff1a;客户端工具sqlplus的会话&#xff0c;使用的字符集&#xff0c;是数据库字符集。…

如何排查GD32 MCU复位是由哪个复位源导致的?

上期为大家讲解了GD32 MCU复位包括电源复位和系统复位&#xff0c;其中系统复位还包括独立看门狗复位、内核软复位、窗口看门狗复位等&#xff0c;在一个GD32系统中&#xff0c;如果莫名其妙产生了MCU复位&#xff0c;如何排查具体是由哪个复位源导致的呢&#xff1f; GD32 MC…

反激Flyback从逆向到初步设计(UC2844)

一.Flyback基本拓扑 国标gb/t 12325-2008《电能质量供电电压偏差》规定&#xff1a;220v单向供电电压偏差为标称电压的-10%&#xff0c;7%。 对应220V的标称电压&#xff0c;其浮动范围是在198~235.4V。以下运算均基于此规定进行。 首先220V进入EMI模块&#xff0c;消除差模干扰…

虚拟机配置RabbitMQ集群教程

RabbitMQ是常用的一款消息中间件&#xff0c;那么如何在我们虚拟机中创建其集群呢&#xff1f;跟着博主这篇文章让你一步到位 本篇搭建的是三台机器为一个集群&#xff01;假设大家虚拟机都为初始化状态&#xff0c;从0开始&#xff08;注意集群搭建需要CentOS8以上环境&#x…

老板电器发布首个烹饪AI模型,揭秘其如何引领厨电行业变革

数字发展日新月异&#xff0c;智慧产品迭代更新。当前&#xff0c;我们或许正身处一场连科学巨人也无法预见的深度变革之中。现代科技使得普通人无需深入学习数学或编程知识&#xff0c;也能借助手机或电脑&#xff0c;体验“苏格拉底式”的在线指导&#xff0c;或者与“乔布斯…

js 习题 1

文章目录 前言T1T2T3T4T5T6T7T8T9结语 前言 『最孤独的人最亲切&#xff0c;受过伤的人总是笑的最灿烂。』—— 「素媛」 T1 let buf""; process.stdin.on("readable",function(){let chunkprocess.stdin.read();if(chunk){bufchunk.toString();} });pr…

在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具。在 2023 年国际机器学习会议 (ICML) 上&#xff0c;MILA 和英特尔实验室联合发布了ProtST模型&#xff0c;该模型是个可基于文本提示设计蛋白质的多模态模型。此后&#xff0…

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册&#xff0c;并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片&#xff0c;点击x号后要删除掉当前的图片&#xff0c;那么我们设计的时候如果我们代码写成如下的格式 …

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…

jenkins自动化持续集成

一、持续集成优势 1.1 解放重复劳动 一次设置&#xff0c;多次复用。持续集成任务可以解放集成、测试、部署等重复性劳动&#xff0c;通过自动化任务能够显著提升集成频率。 1.2 更快解决问题 接入持续集成任务后&#xff0c;能够更早地感知变更后效果&#xff0c;及时进入…

『 Linux 』信号的写入与保存

文章目录 信号的发送信号的保存sigset_t 类型与信号集操作函数阻塞信号集(信号屏蔽字)操作函数未决信号集操作函数验证阻塞信号集与未决信号集 信号的发送 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10)…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…

Rce漏洞复习(ctfshow29-50)

Rce漏洞简介思维导图 Web29 代码审计&#xff1a; if(!preg_match("/flag/i", $c)){ eval($c); 传参没有flag&#xff08;大小写都没有出现&#xff09; Payload&#xff1a; ?csystem("ls"); ?csystem("tac *lag.php"); Web30 代码…

数据结构——排序大汇总(建议收藏)

这篇文章将为大家详细讲解各大排序的基本思想与实现代码~ 内有动图 首先&#xff0c;我们来看常见的排序有以下几大类&#xff1a; 1.插入排序 插入排序的主要思想是将每个位置的元素插入到前面已具备顺序的数组中 实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想 …

Adobe正通过数字体验改变世界

在当今这个数字化飞速发展的时代&#xff0c;Adobe公司正以其创新的技术和卓越的产品引领着创意设计领域的变革。从Adobe发布的生成式AI工具&#xff08;Adobe Firefly&#xff09;&#xff0c;到Illustrator和Photoshop的新AI功能&#xff0c;再到广受认可的Adobe国际认证&…

【Golang 面试基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

opencv入门(四)

文章目录 一、形态学转换1.1 图像腐蚀1.1.1 erode():用于实现对图像的腐蚀操作1.2 图像膨胀1.2.1 dilate():实现对图像的膨胀操作1.3 图像 开\闭运算、梯度运算、顶帽运算、底帽运算1.3.1 morphologyEx():实现对图像的 开\闭运算、梯度运算、顶帽运算、底帽运算一、形态学转…