Java学习教程,从入门到精通,Java继承语法知识点及案例代码(29)

1、Java继承语法知识点及案例代码

一、继承的基本概念

继承是面向对象编程中的一个重要概念,指的是子类从父类继承属性和方法的能力。通过继承,子类可以直接访问父类的非私有属性和非私有方法,实现代码重用和扩展。

二、继承的语法

在Java中,使用关键字extends来实现继承。子类使用关键字extends后面跟随父类的名称来继承父类。语法形式如下:

class 子类名 extends 父类名 {
    // 子类的属性和方法
}
三、继承的分类
  • 单继承:在Java中,只支持单继承,即一个子类只能继承一个父类。这是为了避免多继承带来的复杂性和代码混乱问题。
  • 多继承:Java不支持多继承,但可以通过实现多个接口来达到类似的效果。
四、继承的层级关系

继承形成了一个类的层级结构,通过继承,可以形成父类、子类的层级关系,构建类之间的依赖关系和扩展关系。

五、继承的原理和特点
  • 原理:在Java中,继承是通过子类内部维护一个指向父类的引用来实现的。这样子类就可以通过这个引用来访问父类的非私有属性和方法。
  • 特点
    • 子类可以继承父类的publicprotected属性和方法。
    • 子类不能继承父类的private属性和方法。
    • 子类可以重写父类的方法,实现自己的逻辑。
    • 子类可以新增属性和方法。
    • 子类可以用父类的引用指向子类对象。
六、super关键字的使用

在子类中,如果要调用父类的方法或属性,可以使用super关键字来访问。super关键字可以用来调用父类构造方法、访问父类的成员变量和成员方法。

七、Object类

所有的类在Java中都直接或间接继承自Object类。Object类提供了一些通用的方法,如toString()equals()hashCode()等。子类可以重写这些方法来定制自己的行为。

八、继承的代码实现

示例代码

// 定义父类
class Animal {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

// 定义子类,继承自Animal
class Dog extends Animal {
    public void bark() {
        System.out.println(name + " is barking");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("Tom");
        System.out.println("Dog name: " + dog.getName());
        dog.eat();
        dog.bark();
    }
}

说明

  1. Animal类是一个父类,包含一个属性name和一个方法eat()
  2. Dog类是一个子类,使用extends关键字继承自Animal类。它继承了Animal类的name属性和eat()方法,并添加了自己的方法bark()
  3. Main类的main方法中,创建了一个Dog对象,并调用了继承自Animaleat()方法和子类自己的bark()方法。
九、继承的注意事项
  • 父类的构造方法不会被继承,但子类的构造方法调用父类的构造方法来初始化父类的状态。
  • 子类不能继承父类的private属性和方法。
  • 子类可以通过super关键字调用父类的构造方法和方法。
  • 谨慎使用多层继承,避免类层级过于复杂,增加代码阅读和维护的难度。
十、继承的多态性

通过将父类的引用指向子类的对象,可以实现对子类对象的引用,以实现动态绑定和多态性。

示例代码

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

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

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog(); // 父类引用指向子类对象

        animal.makeSound(); // 输出: Animal makes a sound
        dog.makeSound();    // 输出: Dog barks
    }
}

说明

  • Animal类有一个makeSound()方法,输出通用的声音信息。
  • Dog类重写了makeSound()方法,提供了特定于狗的叫声。
  • Main类的main方法中,分别调用了AnimalDog对象的makeSound()方法,展示了多态性的效果。

通过以上知识点和示例代码,可以全面了解Java继承语法的相关内容。

当然可以,以下是一些具体的Java继承案例,旨在帮助更好地理解继承的概念和应用。

案例一:动物类及其子类

父类:Animal
class Animal {
    String name;
    int age;

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

    void sleep() {
        System.out.println(name + " is sleeping.");
    }
}
子类:Dog 继承自 Animal
class Dog extends Animal {
    void bark() {
        System.out.println(name + " is barking.");
    }
}
测试类:Main
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "Buddy";
        dog.age = 5;

        dog.eat(); // 继承自父类的方法
        dog.sleep(); // 继承自父类的方法
        dog.bark(); // 子类自己的方法
    }
}

输出

Buddy is eating.
Buddy is sleeping.
Buddy is barking.

案例二:交通工具类及其子类

父类:Vehicle
class Vehicle {
    String brand;

    void start() {
        System.out.println(brand + " is starting.");
    }

    void stop() {
        System.out.println(brand + " is stopping.");
    }
}
子类:Car 继承自 Vehicle
class Car extends Vehicle {
    int numberOfWheels = 4;

    void drive() {
        System.out.println(brand + " is driving with " + numberOfWheels + " wheels.");
    }
}
子类:Bike 继承自 Vehicle
class Bike extends Vehicle {
    int numberOfWheels = 2;

    void pedal() {
        System.out.println(brand + " is pedaling with " + numberOfWheels + " wheels.");
    }
}
测试类:Main
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.brand = "Toyota";

        car.start(); // 继承自父类的方法
        car.stop(); // 继承自父类的方法
        car.drive(); // 子类自己的方法

        Bike bike = new Bike();
        bike.brand = "Trek";

        bike.start(); // 继承自父类的方法
        bike.stop(); // 继承自父类的方法
        bike.pedal(); // 子类自己的方法
    }
}

输出

Toyota is starting.
Toyota is stopping.
Toyota is driving with 4 wheels.
Trek is starting.
Trek is stopping.
Trek is pedaling with 2 wheels.

案例三:图形类及其子类

父类:Shape
abstract class Shape {
    String color;

    abstract void draw();

    void setColor(String color) {
        this.color = color;
    }

    void getColor() {
        System.out.println("Color: " + color);
    }
}
子类:Circle 继承自 Shape
class Circle extends Shape {
    int radius;

    @Override
    void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}
子类:Rectangle 继承自 Shape
class Rectangle extends Shape {
    int length;
    int width;

    @Override
    void draw() {
        System.out.println("Drawing a rectangle with length " + length + " and width " + width);
    }
}
测试类:Main
public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle();
        circle.setColor("Red");
        circle.radius = 5;

        circle.getColor();
        circle.draw();

        Rectangle rectangle = new Rectangle();
        rectangle.setColor("Blue");
        rectangle.length = 10;
        rectangle.width = 5;

        rectangle.getColor();
        rectangle.draw();
    }
}

输出

Color: Red
Drawing a circle with radius 5
Color: Blue
Drawing a rectangle with length 10 and width 5

在这些案例中,通过继承,子类能够复用父类的代码,同时添加或重写方法以适应新的需求。这些案例展示了继承在Java编程中的实际应用,有助于更好地理解继承的概念和用法。

上述Java继承的案例可以应用于多种实际场景,以下是对这些案例潜在应用场景的详细阐述:

案例一:动物类及其子类

  • 应用场景

    • 游戏开发:在开发动物主题的游戏时,可以使用继承来创建不同的动物角色。例如,可以有一个Animal基类,然后创建DogCatBird等子类,每个子类都有自己独特的属性和行为。
    • 自然保护区管理:在自然保护区管理软件中,可以使用继承来管理不同类型的动物。通过继承,可以轻松地添加新的动物类型,同时保持代码的整洁和可维护性。

案例二:交通工具类及其子类

  • 应用场景
    • 物流管理系统:在物流系统中,可以使用继承来管理不同类型的交通工具。例如,Vehicle基类可以包含所有交通工具的通用属性和方法,如品牌、启动、停止等。然后,可以创建CarTruckBike等子类来表示具体的交通工具。
    • 城市规划:在城市规划软件中,可以使用继承来模拟不同类型的交通工具对城市交通的影响。通过继承,可以轻松地添加新的交通工具类型,并评估它们对交通流量、噪音污染等方面的影响。

案例三:图形类及其子类

  • 应用场景

    • 图形编辑软件:在图形编辑软件中,可以使用继承来管理不同类型的图形对象。例如,Shape基类可以包含所有图形的通用属性和方法,如颜色、绘制等。然后,可以创建CircleRectangleTriangle等子类来表示具体的图形。
    • 数据分析可视化:在数据分析可视化工具中,可以使用继承来创建不同类型的图表。通过继承,可以轻松地添加新的图表类型,如条形图、折线图、饼图等,并自定义它们的外观和行为。

综上所述,Java继承的案例可以广泛应用于游戏开发、物流管理、城市规划、图形编辑以及数据分析可视化等多个领域。通过继承,开发者可以更加高效地组织代码,提高代码的可复用性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发,将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目,如果在加上uniapp开发的H5端的项目,你还要在nginx中区分PC端和手机H5端,这就会让人很头大!网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如:set…

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦, 内存满了咋搞 就算过期key 删除,还是不够用, 这种问题没办法,只能了解一下啥解决方案了, 内存是有限的,一直存,肯定会满,这时,咋处理? 首先&#xff…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性,分别是封装、继承、多态,通过之前的学习我们已经了解了C的封装特性,那么接下来我们将继续学习另外的两大特性,在此将分为两个章节来分别讲解继承和多态。本篇就先来学…

[C++11] 包装器 : function 与 bind 的原理及使用

文章目录 functionstd::function 的基本语法使用 std::function 包装不同的可调用对象function包装普通成员函数为什么要传入 this 指针参数?传入对象指针与传入对象实例的区别 例题 :150. 逆波兰表达式求值 - ⼒扣(LeetCode) bin…

设计模式(主要的五种)

1.设计模式: 设计模式就是代码设计经验 2.设计模式的类型: 分为三大类:创建型模式,结构型模式,行为模式 创建型模式: 单例模式:某个类只能有一个实例,提供一个全局的访问点。 工…

Wireshark中的length栏位

注:Ethernet II的最小data length为46,如果小于,会补全到46. 1.指定网卡抓取的,链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

Java线程池浅谈(创建线程池及线程池任务处理)

1-认识线程池 什么是线程池? 线程池就是一个可以复用线程的技术。 不使用线程池的问题 比方说淘宝,不使用线程池,现在有一亿个线程同时进来,CPU就爆了。用户每发起一个请求,后台就需要创建一个新线程来处理&#xf…

缓冲区溢出,数据被踩的案例学习

继续在ubuntu上学习GDB,今天要学习的是缓冲区溢出。 程序的地址: GitHub - gedulab/gebypass: bypass password by heap buffer overflow 编译的方法: gcc -g -O2 -o gebypass gebypass.c 照例设置一下科学shangwang代理: e…

GoogleCloud服务器的SSH连接配置

首先,Google的服务器默认是通过自带的SSH网页端连接的,比较麻烦和容易断开,不是很好用,常见的解决办法有两种一种是通过修改ssh的配置,添加密码的方式进行连接,一种是通过配置公钥进行连接。 密码连接之前有…

万字长文解读深度学习——ViT、ViLT、DiT

文章目录 🌺深度学习面试八股汇总🌺ViT1. ViT的基本概念2. ViT的结构与工作流程1. 图像分块(Image Patch Tokenization)2. 位置编码(Positional Encoding)3. Transformer 编码器(Transformer En…

MQ集群

目录 MQ集群 集群分类 普通集群 集群结构和特征 集群的部署 获取cookie 准备集群配置 启动集群 镜像模式 镜像模式的特征 镜像模式的配置 exactly模式 仲裁队列 集群特征仲裁队列:仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列&#…

零基础Java第十七期:内部类

目录 一、Object类 1.1. 获取对象信息 1.2. 对象比较equals方法 1.3. hashCode方法 ​编辑 二、内部类 一、Object类 1.1. 获取对象信息 Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父 类。即所有…

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目,它们犹如璀璨星辰,用各自的故事和成就,为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者,共同撰写并分享项目在GitCode平台上托管的体验,挖掘平…

什么是CRM系统?

越来越多的企业意识到:如何有效管理与客户的关系、提升客户满意度,并通过这些提升推动销售增长,已经成为许多公司亟待解决的问题。为此,客户关系管理(Customer Relationship Management,简称CRM&#xff09…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

不一样的CSS(一)

目录 前言&#xff1a; 一、规则图形 1.介绍&#xff1a; 2.正方形与长方形&#xff08;实心与空心&#xff09; 2.1正方形&#xff1a; 2.2长方形 3.圆形与椭圆形&#xff08;空心与实心&#xff09; 3.1圆形与椭圆形 4.不同方向的三角形 4.1原理 4.2边框属性 5.四…

VUE实现点击导航栏进行切换右边内容

首先看看效果&#xff0c;左边导航栏进行切换&#xff0c;右边内容进行切换 代码如下 <div><el-tabs :tab-position"tabPosition" style"height: 800px;"><el-tab-pane label"通知通告">通知通告</el-tab-pane><el-t…