Java语法--继承

基于C#的跨平台上位机开发:一次编写,多平台运行 摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效 阅读详情

为什么需要继承?

java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。

 对与猫和狗在构建类时会这样构建↓

建议创建一个包,包中一个class文件写一个类,这里方便展示就不一个class文件写多个类了。

class Cat{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
    public void mimi(){
        System.out.println(this.name + "正在喵喵叫");
    }
}
class Dog{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
    public void bark(){
        System.out.println(this.name + "正在汪汪叫");
    }
}

通过观察上述代码会发现,猫和狗的类中存在大量重复

那能否将这些共性抽取呢?

面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。

 什么是继承呢?

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

 对与上述的Dog和Cat类我们可以创建一个Animal类,Animal类中可以写Dog与Cat类的共性比如:名字,年龄,体重和吃这个方法。  Cat和Dog类就能继承Animal,继承之后,Cat与Dog类也被称之为子类,Animal类也被称之为父类。

继承的格式class 子类名 extents 父类名

class Animal{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Cat extends Animal{
    public void mimi(){
        System.out.println(this.name + "正在喵喵叫");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println(this.name + "正在汪汪叫");
    }
}

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

父类成员的访问:

子类和父类不存在同名成员变量

class Animal{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Cat extends Animal{
    public int a = 0;
    public void func(){
        name = "咪咪";//访问父类继承下来的name
        age = 2;//访问父类继承下来的age
        weight = 15;//访问父类继承下来的weight
        a = 1;//访问子类自己的变量a
   
    }
    
}

子类和父类成员变量同名

class Animal{
    public String name = "二哈";
    public int age = 2;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Dog extends Animal{
    String name = "金毛";
    int age = 2;
    public void func(){
        System.out.println(name);
        System.out.println(age);
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.func();
    }
}

 ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

在子类和父类变量同名时,会优先访问子类的成员变量

总结:

如果访问的成员变量子类中有,优先访问自己的成员变量。
如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

访问子类和父类的方法时也是同理

成员方法名字不同

class Animal{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Cat extends Animal{
    public void mimi(){
        System.out.println(this.name + "正在喵喵叫");
    }
    public void func(){
        eat();//访问父类方法
        mimi();//访问子类方法
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.func();
    }
}

成员方法相同时

class Animal{
    public String name = "咪咪";
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Cat extends Animal{
    //方法重写
    public void eat(){
        System.out.println(this.name + "正在吃猫粮");
    }
    public void func(){
        eat();
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.func();
    }
}

 访问的子类的成员变量

这里还有一个知识点--方法重写与方法重载不同下篇多态的时候会说到

这时候会有一个疑问--父类和子类成员重名的时候会优先访问子类的成员,那父类的成员要如何访问呢?这里就要用到super

super关键字:

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

class Animal{
    public String name = "二哈";
}
class Dog extends Animal{
    String name = "金毛";
    public void func(){
        System.out.println(super.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.func();
    }
}

这个时候调用func输出的结果为二哈

class Animal{
    public String name = "二哈";
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println(this.name + "正在吃猫粮");
    }
    public void func(){
        super.eat();
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.func();
    }
}

通过super关键字调用了父类的方法

在构造方法中的super()

super()类似于this(),this()是调用

如果父类和子类中都没有自己创建构造方法的化,编译器会自动在父类和子类中提供无参的构造方法.

自己创建构造方法的情况下如果父类中创建构造方法,子类中也必须要有此时就可以在子类中用super()传参来初始化成员变量

class Animal{
    public String name;
    public int age;
    public double weight;
    public void eat(){
        System.out.println(this.name + "正在吃东西");
    }
    //父类构造方法
    public Animal(String name, int age, double weight) {
        this.name = name;
        this.age = age;
        this.weight = weight;
    }
}
class Cat extends Animal{
    //子类构造方法
    public Cat(String name, int age, double weight) {
        super(name,age,weight);
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", weight=" + weight +
                '}';
    }
}

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("咪咪",2,12);
        System.out.println(cat.toString());
    }
}

 在子类构造方法中,并没有写任何关于父类构造的代码,但是在构造子类对象时,先执行父类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。父子父子肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整

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

IEAL编译器如何快速生成构造方法

 如何快速生成toString展示方法

接下来说一下super和this的相同点和不同点:

相同点:
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

不同点:

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成
员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造
方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有 

 子类和父类静态代码块-实例代码块-构造方法的初始化的顺序

class Animal{
    static {
        System.out.println("调用了父类的静态代码块");
    }
    {
        System.out.println("调用了父类的实例代码块");
    }
    public Animal() {
        System.out.println("调用了父类的构造方法");
    }
}
class Cat extends Animal{
    static{
        System.out.println("调用了子类的静态代码块");
    }
    {
        System.out.println("调用了子类的实例代码块");
    }
    public Cat() {
        super();
        System.out.println("调用了子类的构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
    }
}

先执行静态代码块再执行父类的实例代码块和构造方法最后执行子类的实例代码块和构造方法(静态代码块只能执行一次,因为静态代码块是实在类加载的时候就被执行了,并不是在加载的时候)

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println("===============");
        Cat cat2 = new Cat();
    }
}

实例化第二个cat对象时,静态代码块不会被执行,因为类只能被加载一次

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println("===============");
        Cat cat2 = new Cat();
    }
}

在java语法中是可以无限继承的,但是即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.
如果想从语法上进行限制继承, 就可以使用 final 关键字

final关键字:

final修饰类不能被继承

可以看到会标红报错

final修饰变量也意味着将变量变成了常量类似于C语言中的const

final int a = 10;
a = 20; // 编译出错

 

 

ComfyUI报错ModuleNotFoundError: No module named ‘comfy.options‘ 好家伙,我一想我刚刚好像用了pip安装了comfy模块,不会是和ComfyUI自带的comfy模块产生冲突了吧。(3)还有的说是项目不是最新版,叫更新到最新版本的,好家伙,我报错之前根本没更新也没错,突然就报错的。(4)还有的说没有comfy.options这部分代码,叫自己去拉一个,我一看也有啊。我也不知道啥时候脑抽风去装这么个东西的,幸好我聪明机智,一眼就知道了。看把我气的,然后网上搜集各种资料,一个一个去试。 阅读详情

相关推荐

c#.net使用正则表达式验证文本中是否包含手机号码或电话号码?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections; namespace RegularPhoneApp { class Program

码农 3584

Java语法之继承

Java语法之继承

m0_63635730的博客 4822

机械臂 关节电机选型计算

电机 机械臂

hisen92的专栏 8982

继承(java语法)

继承的概念及使用方法、父类成员方法/变量的访问、子类构造方法、super、this、fianl、protected、public、private、default关键字的访问权限和使用方法。

Dreadnaught的博客 414

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1095

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 654

java类继承语法_java语言中Object类继承的语法

继承与java(以及其他OOP语言)非常紧密地结合在一起。我们就为大家引入了继承的概念,并在本章里不时用到,因为一些特殊的场合要求必须使用继承。除此以外,创建一个类时肯定会进行继承,因为若非如此,会从Java的标准根类Object中继承。用于合成的语法是非常简单且直观的。但为了进行继承,必须采用一种全然不同的形式。需要继承的时候,我们会说:“这个新类和那个旧类差不多。”为了在代码里表面这一观念,需...

weixin_42515340的博客 227

基于 YOLOv26 的 PCB 板缺陷检测:工业级视觉实战

本文提出了一种基于YOLOv26的PCB板缺陷检测系统,通过深度学习技术实现对PCB板缺陷的自动化检测。系统能够识别短路、开路、焊点不良等8种常见缺陷,具有高精度、多类别分类和实时推理等优势。文章详细介绍了系统架构,包括数据采集、预处理、YOLOv26模型检测和后处理模块。在代码实现部分,给出了环境配置、数据预处理与增强的具体方法,使用Albumentations库进行图像增强处理。该系统为电子制造业提供了高效、准确的PCB质量检测解决方案,显著提升了检测效率和准确性。

一键难忘的博客 336

java 继承接口语法_java的继承、接口方面的语法及知识

继承(inheritance):一个类只能继承一个类代码复用继承的语法:class ChildClass extends ParentsClass{}父类的属性子类中都存在,只是有没有权限访问的问题根据名字找谁是谁?1.变量-> 类型 (类、接口)->接口2.已经确定是变量局部变量、形参->类的属性-> 外部类的属性就近原则构造方法:注意默认的那个无参构造方法优先调用父类的...

weixin_28996657的博客 172

如何使用 ESP32 CAM 进行自动车牌识别 (ANPR)

用于提取 JSON 值并在 OLED 上显示文本的函数。有一个可用的函数,即 extractJsonStringValue 来提取字符串值。它是独立函数,但您仍然可以使用一些 JSON 库来执行相同的功能。

jkh920184196的博客 1304

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2311

Java基础语法——三大特性之一:继承

绪论概念在Java编程语言中,是一个基本的面向对象概念,它允许我们创建一个新的类(子类)基于一个已存在的类(父类)。通过继承,子类自动拥有父类的字段和方法,而无需重新编写相同的代码。这不仅减少了重复代码,提高了代码的复用性,还使得类之间产生了关系,为实现多态性提供了条件。为什么需要继承我们这边使用一个程序来进行讲解。假设现在我们现在需要编写一个程序 我们编写了两个类,一个是Pupil 类(小学生),一个是Gradute(大学毕业生).问题:两个类的属性和方法有很多时相同的,怎么办?

2402_86637890的博客 2200

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Java 基础语法】万字解析 Java 的包和继承

文章目录一、包1. 概念2. 使用方式3. 静态导入4. 创建包5. 包的访问权限6. 常见的系统包二、继承1. 概念2. 语法规则(含 super 使用)3. protected 关键字4. 更复杂的继承关系5. final 关键字三、组合四、总结(含谜底) 一、包 1. 概念 根据定义:包是组织类的一种方式 那么为什么要组织类呢? 简单来讲就是保证类的唯一性,就比如在以后的工作中,如果大家一起开发一个项目,大家可能在自己的代码中都写到了一个 Test 类,而如果出现了两个同名的类的话,就会冲突,导致代

吞吞吐吐大魔王的博客 6097

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

你一定要学会的Java语法 -- 【继承】

java继承

weixin_50966738的博客 899

c#的继承语法 示例及与 Java 的异同

对c#继承语法的片面讲解,与Java继承观念上的对比

2401_87490332的博客 522

JAVA中继承的概念和语法

1.类继承的概念 根据已有类来定义新类,新类拥有已有类的所有功能JAVA只支持类的单继承,每个子类之能有一个直接超类超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化继承机制可以提高程序的抽象程度,提高代码的可重用性Tips:子类对象与超类对象存在“是一种”的关系子类对象,从外部来看,应该包括:与超类相同的接口,包含着超类的所有变量和方法,同时可以具有更多的方法和数据成员2.继承的语法: ...

想自学翻身的咸鱼的博客 1155

java类继承语法_java类的继承(基础)

---恢复内容开始---这篇随笔和大家讲讲java中类的继承是什么?希望对你们有所帮助。目录一、java继承是什么?二、为什么使用java继承三、java继承的实现1.1 java继承的基本语法1.2 super的用法一、Java继承是什么?简单来讲,Java中的继承是一个对象获取父对象的所有属性和行为的机制。它是面向对象编程系统(OOP)的重要组成部分。Java中继承的思想是,创建基于现有类...

weixin_36308872的博客 1022

java语法:继承与多态

继承:一个类可以继承另一个类的属性和方法,这样可以避免重复编写相似的代码,并且可以实现多层次的类组织管理。多态:允许不同的对象对同一消息作出不同的响应,通过动态绑定的方式,可以根据对象的实际类型来确定调用的方法,从而实现代码的灵活性和可扩展性。

weixin_49817511的博客 232

关于java中类的组合与继承语法小结

在面向对象编程语言中,继承和组合是两个很关键的问题,二者在语法和形式上有很多的相似之处。此处,仅对二者的用法做一个小结[1]。 一、组合语法 组合仅需将对象引用置于新类中即可,比如: // SprinklerSystem.java class WaterSource {        private String s;        WaterSource()        {

lskyne的专栏 1181

[Java基本语法] 继承与多态

🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)🧀线程与网络(96平均质量分)🍭MySql数据库(93平均质量分)🍬算法(97平均质量分)

无需多言 1642

JAVA语法——继承

继承 什么是继承? 继承是类与类之间的一种关系。 多个类继承单独的某个类,多个类就可以使用单独的这个类的属性和行为了。 多个类成为子类(派生类),单独的这个类称为父类(基类 或超类)。 为什么用继承? 使用继承的好处:提高代码复用。 如果要开发一个教务管理系统,需要考虑一些角色类的设计,如:学生类,老师类 继承的格式 在java中,继承的关键字用的是“extends”。 public class 子类名 extends 父类名 {}。 继承后子类的特点? 子类继承父类,子类可以得到父类的属性和行为,子类可以

linzetao233的博客 1758

C、C++、Java 继承语法与定义差异性详解

C语言不支持继承,只能结构体嵌套模拟。**C++**支持多重继承,语法灵活,但易产生菱形继承问题。Java单继承类,多继承接口,更安全简洁。“C无继承,C++多继承,Java单继承接口多;语法各不同,机制莫混淆。

IT技术学习与工作笔记分享 917

Java类继承的基本概念和语法

文章目录类继承的概念和语法类继承的概念超类和子类子类对象继承的语法类继承举例访问从超类继承的成员 类继承的概念和语法 类继承的概念 根据已有定义来定义新类,新类拥有已有类的所有功能 Java只支持类的单继承,每个子类只能有一个直接超类 超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化 继承机制可以提高程序的抽象程度,提高代码的可重用性 超类和子类 子类对象与超类对象存在“是一个…...

WalterBailey's Blog 566

Java继承语法

Java中继承的特点 Java中类只支持单继承,不支持多继承 Java中类支持多层继承Java中继承的特点 Java中类只支持单继承,不支持多继承 Java中类支持多层继承 继承中成员方法的访问特点 方法重写的注意事项 继承中构造方法的访问特点 继承中变量的访问特点

2302_76758195的博客 1742

Java使用继承的语法是,Java使用继承

本文概述用Java继承是一种机制,一个对象获得所有父对象的属性和行为。这是一个重要的哦(面向对象编程系统)的一部分。继承在Java背后的理念是,你可以创建新的类建立在现有类。当你从一个现有的类继承时,你可以重用父类的方法和字段。此外,你可以添加新的方法和字段在当前类也。业代表的是一个关系也称为父子关系。为什么在java中使用继承方法的重写(因此可以实现运行时多态性)。代码可重用性。条款中使用继承类...

weixin_34217656的博客 328

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

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

qq_45746668的博客 1194

Java基础语法-继承和多态

说到继承,你可能想到继承了父母的一些特点,财产等等。是的,在我们Java的学习中也是类似的,他会派生出一个子类,你可以把这个子类想像成自己的儿子,通过继承,他就可以继承你的一部分代码。

codeking10086的博客 969
上一篇: Java的类和对象
下一篇: Java--多态
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值