详解java继承

news2024/9/23 3:19:04

目录

一 、为什么需要继承

二、准备工作:用java代码先定义狗类、猫类、动物类,这是代码准备如下

三、继承代码实现

四、 子类中访问父类的成员方法

4.1. 成员方法名字不同

4.2 成员方法名字相同

五、子类构造方法

扩展:如果你对子类和父类的代码执行的顺序搞不清楚可以参考:

六、super和this异同点

七、继承种类

八、继承和组合关系

1、概念介绍

2、优缺点对比

3、如何选择


一 、为什么需要继承

Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。
比如: 狗和猫,它们都是一个动物,我们可以把猫和狗归结为一个类就是动物类。

二、准备工作:用java代码先定义狗类、猫类、动物类,这是代码准备如下

   动物类

// Animal.java
public class Animal{
    String name;
    int age;
    public void eat(){
    System.out.println(name + "正在吃饭");
    }
    public void sleep(){
    System.out.println(name + "正在睡觉");
    }
}

狗类

// Dog.java
public class Dog{
    string name;
    int age;
    float weight;
    public void eat(){
    System.out.println(name + "正在吃饭");
    }
    public void sleep(){
    System.out.println(name + "正在睡觉");
    }
    void Bark(){

    System.out.println(name + "汪汪汪~~~");
    }
}

猫类

public class Cat{
    string name;
    int age;
    float weight;
    public void eat(){
    System.out.println(name + "正在吃饭");
    }
    public void sleep()
    {
    System.out.println(name + "正在睡觉");
    }
    void mew(){
    System.out.println(name + "喵喵喵~~~");
    }
}

三、继承代码实现

Java 中如果要表示类之间的继承关系,需要借助 extends 关键字,具体如下
修饰符 class 子类 extends 父类 {
// ... 
}

连接上述定义的三个类:

// Animal.java
public class Animal{
    String name;
    int age;
    public void eat(){
    System.out.println(name + "正在吃饭");
    }
    public void sleep(){
    System.out.println(name + "正在睡觉");
    }
}
// Dog.java
public class Dog extends Animal{
    void bark(){
    System.out.println(name + "汪汪汪~~~");
    }
}

// Cat.Java
public class Cat extends Animal{
    void mew(){
    System.out.println(name + "喵喵喵~~~");
    }
}
// TestExtend.java
public class TestExtend {
    public static void main(String[] args) {
    Dog dog = new Dog();
    // dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的
    System.out.println(dog.name);
    System.out.println(dog.age);
    // dog访问的eat()和sleep()方法也是从Animal中继承下来的
    dog.eat();
    dog.sleep();
    dog.bark();
    }
}

四、 子类中访问父类的成员方法

4.1. 成员方法名字不同

public class Base {
  public void methodA(){
  System.out.println("Base中的methodA()");
  }
}
public class Derived extends Base{
  public void methodB(){
  System.out.println("Derived中的methodB()方法");
  }
  public void methodC(){
  methodB(); // 访问子类自己的methodB()
  methodA(); // 访问父类继承的methodA()
  // methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()
  }
}

4.2 成员方法名字相同

public class Base {
    public void methodA(){
    System.out.println("Base中的methodA()");
    }
    public void methodB(){
    System.out.println("Base中的methodB()");
    }
}
public class Derived extends Base{
    public void methodA(int a) {
    System.out.println("Derived中的method(int)方法");
    }
    public void methodB(){
    System.out.println("Derived中的methodB()方法");
    }
    public void methodC(){
    methodA(); // 没有传参,访问父类中的methodA()
    methodA(20); // 传递int参数,访问子类中的methodA(int)
    methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到
    }
}
【上述说明】
        通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
        通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同( 重载 ) ,根据调用 方法适传递的参数选择合适的方法访问,如果没有则报错;
问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?
答:可以通过在子类中定义super.方法名进行访问父类中被子类重写的方法。

五、子类构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
public class Base {
    public Base(){
    System.out.println("Base()");
    }
    }
public class Derived extends Base{
    public Derived(){
    // super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
    // 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
    // 并且只能出现一次
    System.out.println("Derived()");
    }
}
public class Test {
    public static void main(String[] args) {
    Derived d = new Derived();
    }
}
结果打印:
Base()
Derived()

扩展:如果你对子类和父类的代码执行的顺序搞不清楚可以参考:

执行顺序
优先级从上到下依次递减
静态代码(先执行父类静态在执行子类静态块)
父类实例代码块
父类构造代码
子类实例代码
子类构造代码

六、superthis异同点

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

七、继承种类

注意:被final修饰的类不能被继承

八、继承和组合关系

1、概念介绍

和继承类似 , 组合也是一种表达类之间关系的方式 , 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法
( 诸如 extends 这样的关键字 ), 仅仅是将一个类的实例作为另外一个类的字段。
继承表示对象之间是 is-a 的关系 ,比如:狗是动物,猫是动物
组合表示对象之间是 has-a 的关系 ,比如:汽车
// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// 车载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复用轮胎中的属性和方法
private Engine engine; // 可以复用发动机中的属性和方法
private VehicleSystem vs; // 可以复用车载系统中的属性和方法
// ...
}
// 奔驰是汽车
class Benz extend Car{
// 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}
组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合。

2、优缺点对比

组 合 关 系继 承 关 系
优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性
优点:具有较好的可扩展性缺点:支持扩展,但是往往以增加系统结构的复杂度为代价
优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象缺点:不支持动态继承。在运行时,子类无法选择不同的父类
优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口缺点:子类不能改变父类的接口
缺点:整体类不能自动获得和局部类同样的接口优点:子类能自动继承父类的接口
缺点:创建整体类的对象时,需要创建所有局部类的对象优点:创建子类的对象时,无须创建父类的对象

3、如何选择

相信很多人都知道面向对象中有一个比较重要的原则『多用组合、少用继承』或者说『组合优于继承。从前面的介绍已经优缺点对比中也可以看出,组合确实比继承更加灵活,也更有助于代码维护。并不是说继承就一点用都没有了,前面说的是【在同样可行的情况下】。有一些场景还是需要使用继承的,或者是更适合使用继承。

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

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

相关文章

jvm虚拟机初识

JVM Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪…

什么是API网关代理?

带有API网关的代理服务显着增强了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的人来说,使用 API 可以节省大量时间并提高效率。 了解API API(即应用程序编程接口)充当服务提供商和用户之间的连接网关。通过 API 连接&a…

Python pip 常用指令

前言 Python的pip是一个强大的包管理工具,它可以帮助我们安装、升级和管理Python的第三方库。以下是一些常用的pip指令。 1. 安装第三方库 使用pip安装Python库非常简单,只需要使用pip install命令,后面跟上库的名字即可。 # 安装virtuale…

Java中的网络编程

文章目录 网络基础知识IP 地址端口协议 Java 中网络编程InetAddress(静态类)UDP 通信原理UDP 发送数据步骤UDP 接收数据步骤UDP 发送接收案例 TCP 通信原理TCP 发送数据步骤TCP 接收数据步骤TCP 发送接收案例 网络基础知识 概述:在网络通信协…

计算机组成原理19——控制单元的功能和实现1

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。 目录 四种周期下的微操作命令取指周期间址周期执行周期非访存…

antv/x6_2.0学习使用(四、边)

一、添加边 节点和边都有共同的基类 Cell,除了从 Cell 继承属性外,还支持以下选项。 属性名类型默认值描述sourceTerminalData-源节点或起始点targetTerminalData-目标节点或目标点verticesPoint.PointLike[]-路径点routerRouterData-路由connectorCon…

智慧旅游景区解决方案:PPT全文49页,附下载

关键词:智慧景区建设,智慧旅游平台,智慧旅游运营检测系统项目,智慧文旅,智慧景区开发与管理,智慧景区建设核心,智慧景区开发与管理 一、智慧景区建设现状 1、基础设施建设:智慧景区…

离散数学2

复习一下,P->Q,只有真的原因推假的结果,才是错的(正常逻辑),其余情况都是对的(善意规定以及正常逻辑) 反P析取Q,可以这样理解,因为是析取,结果为T的可能性…

强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

一、Qlearning简介 Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获…

Spark Core--加强

RDD的持久化 RDD缓存 当RDD被重复使用,或者计算该RDD比较容易出错,而且需要消耗比较多的资源和时间的时候,我们就可以将该RDD缓存起来。 主要作用: 提升Spark程序的计算效率 注意事项: RDD的缓存可以存储在内存或者是磁盘上,甚至…

为布偶猫精心挑选的三款主食冻干,K9、sc、希喂深度解析对比

喂养布偶猫的小技巧:如何满足其食肉天性同时呵护其肠胃?主食冻干是答案!它不仅符合猫咪天然的饮食结构,还采用新鲜生肉为原料。搭配其他营养元素,既美味又营养,还能增强抵抗力。我们将为您测评市场上热门的…

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境:系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下: Build from source | TensorFlow 从上图可以看出,python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

C++其他语法总结

目录 《C基础语法总结》《C面向对象语法总结(一)》《C面向对象语法总结(二)》《C面向对象语法总结(三)》 一、运算符重载 运算符重载可以为运算符增加一些新的功能全局函数、成员函数都支持运算符重载常用的运算符重载示例 class Point {…

Python私有变量的定义与访问

class Student():def __init__(self, name, age):self.name nameself.age ageself.__score 0def marking(self, score):if score < 0:return 分数不能为0self.__score scoreprint(self.name 同学本次得分是: str(self.__score)) def __talk(self): # 私有的类可通过在…

qss设置某一个widget下的Checkbox的样式

#ObjectName 控件名称{属性&#xff1a;值&#xff1b;属性1&#xff1a;值1} 如下&#xff1a; 效果&#xff1a;

【大数据】分布式协调系统 Zookeeper

分布式协调系统 Zookeeper 1.Zookeeper 的特点2.Zookeeper 的数据结构3.Zookeeper 的应用场景3.1 统一命名服务3.2 统一配置管理3.3 统一集群管理3.4 服务器动态上下线3.5 软负载均衡 Zookeeper 是 Apache 开源的一个顶级项目&#xff0c;目的是为分布式应用提供协调服务&#…

910b上跑Chatglm3-6b进行流式输出【pytorch框架】

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…

01-连接池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

分析一个项目(微信小程序篇)一

分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 本次所介绍的是微信小程序项目&#xff08;甑选商场&#xff09;&#xff1a; 其首页…

深度解析HubSpot数据分析:洞察未来商业趋势

在当今数字化的商业环境中&#xff0c;数据是推动决策和业务增长的关键。作为业内领先的CRM平台&#xff0c;HubSpot不仅为企业提供了高效的客户关系管理工具&#xff0c;同时也成为了数据分析的利器。 1. HubSpot数据分析的核心价值 1.1 洞察客户行为和趋势 HubSpot数据分析…