【Java 继承】了解Java类的继承的特点,继承的关系,继承的使用,到底什么是继承?

news2024/11/25 4:31:58

在这里插入图片描述

博主:_LJaXi Or 東方幻想郷
专栏: Java | 从入门到入坟

Java 继承

  • 继承的特点 \ 介绍 ❓
    • 特点 ♊
  • 继承的使用方式 🔞
    • 避免重复方法
  • 子类访问父类的成员变量 🈲
    • 子类访问父类的成员变量(直接访问)
    • 访问父类与子类同名的成员变量
    • 子类访问父类的成员方法(直接访问)
    • 访问父类与子类中同名的方法(优先访问子类)
  • super 关键字 🔞
  • 子类构造器 🈲

继承的特点 \ 介绍 ❓

特点 ♊

  1. 继承发生在多个类之间
  2. Java允许单继承,多层继承(B类继承A类,C类继承B类)
  3. 被继承的叫做父类(基类 、超类),继承的叫做子类(派生类)
  4. 子类可继承非私有属性和方法
  5. 子类不能继承父类的构造函数,但是可以调用父类的构造函数
  6. 调用带有参数的构造方法时,使用super(n1…)

继承的使用方式 🔞

在Java中可以使用 extends 关键字 来声明,一个类是从另外一个类中继承下来的
如下代码

public class A {
}
// 这段代码说明 B 继承了 A 类
public class B extends A {
} 

* 当子类继承了父类之后,子类就可以调用父类中的方法,如下代码所示

public class Demo {
	public static void main(String[] args) {
		// 程序入口函数
		// new 关键字 进行类实例化
		Cat cat = new Cat();
		// 子类调用父类方法
		cat.eat(); // 吃东西
	}
}

// 父类Animal
public class Animal {
	public void eat() {
		System.out.println("吃东西")
	}
}

// 子类Cat继承父类Animal
public Cat extends Animal {
	
}

避免重复方法

比如说有两个类,其中的方法是相同的功能
定义一个猫类,一个狗类

// 猫类
public class Cat {
	public String name;
	public int age;

	public void say() {
		System.out.println(name + "喵喵叫");
	}

	public void eat() {
		System.out.println(name + "吃东西");
	}
}
// 狗类
public class Dog {
	public String name;
	public int age;

	public void say() {
		System.out.println(name + "汪汪叫");
	}

	public void eat() {
		System.out.println(name + "吃东西");
	}
}

发现 Cat 与 Dog类有相同的成员变量,和相同的成员方法,所以我们提取出一个主类,Animal,避免重复使用代码,Animal父类包含Cat和Dog类中的成员属性

public class Animal {
	public String name;
	public int age;
	
	// cat 和 dog类中公共的成员方法
	public void say() {
		System.out.println(name + "在叫");
	}

	public void eat() {
		System.out.println(name + "吃东西");
	}
}

现在父类中有两个成员方法,我们可以修改一下cat类和dog类,如下代码所示

// 狗类
public class Dog extends Animal {
	public void say() {
		System.out.println(name + "汪汪叫");
	}
}


// 猫类
public class Cat extends Animal {
	public void eat() {
		System.out.println(name + "吃东西");
	}
}

子类访问父类的成员变量 🈲

子类使用extends将父类的成员变量及方法继承了下来

子类访问父类的成员变量(直接访问)

//父类
public class Animal {
 
    //Dog类和Cat类公共的属性
    public String name;
    public int age;
 
    //Dog类和Cat类公共的方法
    public void eat() {
        System.out.println(name + "吃饭");
    }
}
 
 
//子类
public class Dog extends Animal {
 
    //这里的colour就是子类与父类不同名的成员变量
    public String colour;
 
 
    //子类Dog独有的方法
    public void dogCall(){
        System.out.println(name + "汪汪汪");
    }
 
}

访问父类成员的属性被private修饰时,前面介绍过被private修饰的变量只能在同一个包同一个文件的同一个类下使用,那么此时如何访问:可以利用Generate进行封装

在父类中的age属性使用private修饰,即使DOG继承了父类,也不能对这个属性进行访问,解决办法是对这个属性进行封装

private 声明的属性不能直接访问,但可以通过类提供的方法进行访问

//父类
public class Animal {
 
    //Dog类和Cat类公共的属性
    public String name;
    private int age;
 
 
    //右键选择Generate进行封装
    public int getAge() {
        return age;
    }
    //右键选择Generate进行封装
    public void setAge(int age) {
        this.age = age;
    }
 
    //Dog类和Cat类公共的方法
    public void eat() {
        System.out.println(name + "吃饭");
    }
}

子类: Dog

//子类
public class Dog extends Animal {
 
    //这里的colour就是子类与父类不同名的成员变量
    public String colour;
 
 
    //子类Dog独有的方法
    public void dogCall(){
 
        //将从父类继承的name属性赋值
        String name = "小黄";
 
        //通过getAge访问父类的私有属性age
        System.out.println(name + getAge() + "汪汪汪");
    }
 
}

入口函数

public class Demo {
    public static void main(String[] args) {
        //通过New关键字进行创建dog对象
        Dog dog = new Dog();
        //通过子类对象访问父类的私有属性age并进行赋值
        dog.setAge(1);
        //通过对象dog调用子类方法
        dog.dogCall(); // 小黄1汪汪汪
    }
}

访问父类与子类同名的成员变量

父类

//父类
public class Animal {
    String name = "小黄";
    //Dog类和Cat类公共的方法
    public void eat() {
        System.out.println(name + "吃饭");
    }
}

子类

//子类
public class Dog extends Animal {
    //子类Dog独有的方法
    public void dogCall() {
        //将从父类继承的name属性赋值
        String name = "小黄";
        System.out.println(name  + "汪汪汪");
    }
}

入口函数

//启动项
public class Demo {
    public static void main(String[] args) {
        //通过New关键字进行创建dog对象
        Dog dog = new Dog();
        //通过对象dog调用子类方法
        dog.dogCall(); // 阿福汪汪汪
    }
}

父类中有属性名为name,子类中也有属性名name,且他们的类型相同,我们通过打印可以看到打印输出的为子类name成员变量的值

在子类成员方法中或者通过子类成员对象访问成员变量时:

  1. 如果访问的成员变量子类有,优先访问子类
  2. 如果访问的成员变量子类没有,访问从父类继承下来的成员变量,如果父类也没有,则编译报错
  3. 如果访问的成员变量子类和父类同名,根据就近原则优先访问子类的成员变量
  4. 也可以通过关键字类访问成员变量(访问子类本类的用this,访问父类的用super)

子类访问父类的成员方法(直接访问)

父类

//父类
public class Animal {
    String name = "小黄";
    //父类的方法eat()
    public void eat() {
        System.out.println(name + "吃饭");
    }
}

子类

//子类
public class Dog extends Animal {
    //子类Dog独有的方法dogCall()
    public void dogCall(){
        //将父类的方法一起添加进来,方便调用
        eat();
        //将从父类继承的name属性赋值
        String name = "小黄";
        System.out.println(name  + "汪汪汪");
    }
}

入口函数

//启动项
public class Demo {
    public static void main(String[] args) {
        //通过New关键字进行创建dog对象
        Dog dog = new Dog();
        //通过对象dog调用子类方法
        dog.dogCall(); // 小黄吃饭  小黄汪汪汪
    }
}

访问父类与子类中同名的方法(优先访问子类)

父类

//父类
public class Animal {
    String name = "小黄";
    //父类的方法eat()
    public void eat() {
        System.out.println(name + "吃饭");
    }
}

子类

//子类
public class Dog extends Animal {
    //子类Dog的方法eat()
    public void eat(){
        //将父类的方法一起添加进来,方便调用
        //将从父类继承的name属性赋值
        String name = "小黄";
        System.out.println(name  + "汪汪汪");
    }
}

程序入口函数

//启动项
public class Demo {
    public static void main(String[] args) {
        //通过New关键字进行创建dog对象
        Dog dog = new Dog();
        //通过对象dog调用子类方法
        dog.eat(); // 小黄汪汪汪
    }
}

如果父类和子类的成员变量和成员方法相同,访问时优先级肯定时子类更高,如何通过子类的方法去访问父类的成员变量或者方法?

super 关键字 🔞

💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤

super.成员变量:表示访问父类的成员变量
super.成员方法: 表示访问父类的成员方法
super(): 表示访问父类的构造方法


super关键字只能在非静态方法中使用 ⭕

💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤💤

super关键字:在子类中访问父类的成员方法或者变量


父类

//父类
public class Animal {
    String name = "大黄";
    //父类的方法eat()
    public void eat() {
        System.out.println(name + "吃饭");
    }
}

子类 使用super调用父类的方法

//子类
public class Dog extends Animal {
    //子类Dog的方法eat()
    public void eat(){
        //将从父类继承的name属性赋值
        String name = "小黄";
        //利用super关键字访问父类中同名的成员变量name
        System.out.println(super.name  + "汪汪汪");
    }
}

启动项

public class DemoApplication {
    public static void main(String[] args) {
        //通过New关键字进行创建dog对象
        Dog dog = new Dog();
        //通过对象dog调用子类方法
        dog.eat(); // 子类中使用super调用父类name,打印结果: 大黄汪汪汪
    }
}

子类构造器 🈲

子类之所以叫子类,因为它继承了父类,但子类是不继承父类的构造器的,他只是进行一个调用

* 如果父类的构造器没有参数,则子类的构造器不需要使用super关键字调用父类的构造器,系统会自动调用父类的无参构造
* 如果父类的构造器带有参数,则必须在子类构造器中通过super关键字调用父类构造器并赋予相应的形参列表
* super(实参列表)必须在构造器的第一行

//父类
public class Animal {
    private int age;
    //父类的无参构造
    public Animal() {
        System.out.println("Animal()的无参构造");
    }
    //父类的有参构造
    public Animal(int age) {
        System.out.println("Animal()的有参构造");
        this.age = age;
    }
}

Dog类:利用super调用父类中的有参构造器

//子类
public class Dog extends Animal {
    private int age;
    //自动调用父类的无参构造
    public Dog() {
        System.out.println("Dog的无参构造");
    }
    public Dog(int age) {
        //利用super调用父类中的有参构造器
        super(200);
        System.out.println("Dog的有参构造"+age);
        this.age = age;
    }
}

Cat类:利用super调用父类中的有参构造器

//Cat类通过extends关键字继承父类Animal
public class Cat extends Animal {
    private int age;
    //调用的无参构造
    public Cat() {
        System.out.println("Cat的无参构造");
    }
    public Cat(int age) {
        //利用super调用父类中的有参构造
        super(100);
        System.out.println("Cat的有参构造"+age);
        this.age = age;
    }
}

入口函数

 
public class DemoApplication {
    public static void main(String[] args) {
        System.out.println("Dog类继承-----------");
        Dog dog = new Dog();
        Dog dog1 = new Dog(300);
 
        System.out.println("Cat类继承------------");
        Cat cat = new Cat();
        new Cat(400);
    }
}

输出

Dog类继承-----------
Animal()的无参构造
Dog的无参构造
Animal()的有参构造
Dog的有参构造300
Cat类继承------------
Animal()的无参构造
Cat的无参构造
Animal()的有参构造
Cat的有参构造400

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

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

相关文章

MapReduce实战案例(3)

案例三: MR实战之TOPN(自定义GroupingComparator) 项目准备 需求测试数据 有如下订单数据 订单id商品id成交金额Order_0000001Pdt_01222.8Order_0000001Pdt_0525.8Order_0000002Pdt_03522.8Order_0000002Pdt_04122.4Order_0000002Pdt_05722.4Order_0000003Pdt_01222.8 现在…

6 具有 OCR 功能的顶级 PDF 图像转 Word 转换器

如果您在 PDF 图像中找到一些有用的信息并想转换为 Word 格式以供进一步使用,您将需要一个具有OCR 功能的 PDF 图像转 Word 转换器,该转换器旨在识别 PDF 图像中的文本并将其制作出来可编辑。 将 PDF 图像转换为 Word 并不容易,因为我们需要…

高压放大器工作原理(高压放大器怎么用的)

高压放大器是一种能够将低电平信号放大到足够高的电平,以便用于驱动大功率负载或处理高电压信号的电子设备。它广泛应用于各种电子设备中,例如音频放大器、射频放大器、电力电子设备等。下面我们将详细介绍高压放大器的工作原理以及使用方法。 高压放大器…

一分钟:GTP鼓谱导出转换MIDI格式教程

const loadPromise self.osmd.load("/resource/test");loadPromise.then(function () {self.osmd.render();});作为一名鼓手,我深知鼓谱转换MIDI格式的重要性,但是找了好久,一直没有找到一个好用的工具。 直到我发现了GTP鼓谱转换…

下载YouTube视频的一种方法

文章目录 工具名称下载方法使用方法1.只下载音频2.下载音频转换成mp3(加上-x –audio-format参数)3.下载视频(带音频)ID:22 | EXT:mp4 | 1280*720 下载的数据集:YouCook2 工具名称 yt-dlp 下载…

doxygen使用: 跨平台方式让markdown文件包含另一个文件

文章目录 1. 目的和问题2. 解决思路2.1 FILTER_PATTERNS 选项2.2 基于 Python 的 FILTER_PATTERNS 选项2.3 sledcpp.py 脚本 3. 完整工程3.1 目录结构3.2 hello.h 文件内容3.3 CHANGELOG.md 文件内容3.4 generate_doxyfile.py 文件内容3.5 docs/root.md3.6 docs/changelog.md3.…

Redis 事务详细介绍

事务 注意:Redis单条命令是保证原子性的;但是事务不保证原子性! Redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令时才执行 Redis事务本质:一组命令的集合&…

API接口对接的流程和注意的事项

API接口对接是将两个应用程序或系统连接并进行数据交换的过程。在进行API接口对接时,需要确保两个系统具有相同的协议和格式,并且数据传输过程中不会出现错误或数据丢失。下面是API接口对接的流程和注意事项: 流程: 1.确认数据格…

【多目标优化算法】多目标蚱蜢优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux——进程退出

目录 一.进程退出时有三种选择: 1.1 echo $?命令: 功能: 打印距离现在最近一次执行某进程的退出码 例2代码: 例3: 例4代码: 1.3 进程运行过程中可能会出现的错误种类: 二.总结&#xff…

神经网络学习小记录73——Pytorch CA(Coordinate attention)注意力机制的解析与代码详解

神经网络学习小记录73——Pytorch CA(Coordinate attention)注意力机制的解析与代码详解 学习前言代码下载CA注意力机制的概念与实现注意力机制的应用 学习前言 CA注意力机制是最近提出的一种注意力机制,全面关注特征层的空间信息和通道信息…

Unity随手问题记录(持续更新~~)

目录 1.将摄像机定位到模型实际中心点前边(防止有些模型中心点和实际模型中心位置偏移很大的情况) 2.获取当鼠标在RawImage上时,鼠标位置对应的图像坐标(简单粗暴方式) 3.设置脚本运行顺序 4.当plugins底下出现dll文件识别不到的情况&#xf…

LeetCode 1110. Delete Nodes And Return Forest【二叉树,DFS,哈希表】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术(内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据),测量…

图像采集卡的基本原理、应用领域和发展趋势

图像采集卡是一种硬件设备,用于将模拟视频信号转换为数字信号,并将其传输到计算机中进行处理和存储。它通常用于监控、视频会议、医学图像等领域。本文将介绍图像采集卡的基本原理、应用领域和发展趋势。 一、图像采集卡的基本原理 图像采集卡的基本原…

视频里的声音怎么转换成音频?

视频里的声音怎么转换成音频?这样我们就能把视频里的想要的声音在其他音频平台播放或是用于其他视频。其实视频提取音频是一种将视频文件中的音频数据分离出来的技术。该技术可以将视频中的音频转换为不同的格式,让我们可以在无需视频的情况下使用音频文…

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作? Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称:WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执…

【Zero to One系列】在WSL linux系统上,使用docker运行Mysql与Nacos,以及如何启动与停止WSL

前期回顾: 【Zero to One系列】window系统安装Linux、docker 1、下载docker-compose 1.下载: curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2.授予权限&a…

大数据治理入门系列:元数据管理

在介绍数据治理一文中,我们曾用在图书馆找书的例子解释为什么需要进行数据治理。数据治理在某种程度上类似于图书管理。元数据管理作为数据治理的重要一环,也可以进行这种类比。 在图书管理过程中,需要根据相应的制度购买、记录、存放、借还…

【LeetCode: 486. 预测赢家 | 暴力递归=>记忆化搜索=>动态规划 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…