【Java SE】继承

这篇具有很好参考价值的文章主要介绍了【Java SE】继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习完了类之后,我们将继续学习一个Java中的重点内容“继承”


继承

1.1 为什么需要继承

举例:

【Java SE】继承,JavaSE,java,开发语言,继承  【Java SE】继承,JavaSE,java,开发语言,继承

在Cat类中和Dog类中我们发现有很多一样的地方,这样写太浪费空间和内存了

【Java SE】继承,JavaSE,java,开发语言,继承

我们可以把它相同的地方都用一个类来表示,并且使用它1.2 继承概念 

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


1.2 继承概念

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

继承主要解决的问题是:共性的抽取,实现代码复用。

例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。 

【Java SE】继承,JavaSE,java,开发语言,继承

上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。 

从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态(后序讲) 


1.3 继承的语法

 在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类 {
 // ... 
}

 【Java SE】继承,JavaSE,java,开发语言,继承

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


1.4 父类成员访问 

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?


1.4.1 子类中访问父类的成员变量

1.4.1 子类中访问父类的成员变量

【Java SE】继承,JavaSE,java,开发语言,继承

 【Java SE】继承,JavaSE,java,开发语言,继承

  // 访问从父类中继承下来的a
  // 访问从父类中继承下来的b
  // 访问子类自己的c


1.4.2. 子类和父类成员变量同名 

【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承

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

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
  • 记住:父类对象和子类对象同名时,优先访问子类的
  • 要想访问的父类的成员变量时,一定要使用super关键字

【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承

在这里就可以看见super关键字this关键字的区别 


1.4.2 子类中访问父类的成员方法 

 要想访问到父类中的成员,得记住super关键字

1. 成员方法名字不同

【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承

当你成员方法不相同的时候,不管是父类方法还是子类方法都会被调用 


2. 成员方法名字相同 

【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承

所以想访问父类成员,必须使用super关键字 

【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。

super的其他用法在后文中介绍 


1.5 子类构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

【Java SE】继承,JavaSE,java,开发语言,继承

为什么调用了父类对象的构造方法,子类对象开始报错了 

因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。

所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整
,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

例如: 【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承

它是先打印父类的构造方法,在打印子类的构造方法 

 因此,所以父类对象已经构造了方法,子类必须重写构造方法

【Java SE】继承,JavaSE,java,开发语言,继承

注意:
1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法

所以默认情况下是不会报错的 但父类对象写了构造方法,子类必须重写构造方法


2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。


3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

super关键字必须在构造方法前面


4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现 


 1.6 super和this

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


【不同点】 

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有(默认情况下不写会隐藏)


1.7 再谈初始化

class Animals {
    public String name;
    public int age;

    public Animals(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造代码块被执行了。。。");
    }
    static {
        System.out.println("父类静态代码块被执行了。。。");
    }
    {
        System.out.println("父类实例代码块被执行了。。。");
    }

    public void eat() {
        System.out.println(this.name + "正在吃。。。");
    }
}
class Cat extends Animals {
    public String color;
    public Cat(String name ,int age,String color) {
        super(name,age);
        this.color = color;
        System.out.println("子类构造代码块被执行了。。。");
    }
    static {
        System.out.println("子类静态代码块被执行了。。。");
    }
    {
        System.out.println("子类实例代码块被执行了。。。");
    }
    public void mmm() {
        System.out.println(this.name + "正在喵喵喵");
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("小白",3,"baise");
    }
}

【Java SE】继承,JavaSE,java,开发语言,继承

通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行 

 4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

【Java SE】继承,JavaSE,java,开发语言,继承


1.9 protected 关键字 

【Java SE】继承,JavaSE,java,开发语言,继承 

【Java SE】继承,JavaSE,java,开发语言,继承

【Java SE】继承,JavaSE,java,开发语言,继承 

【Java SE】继承,JavaSE,java,开发语言,继承

 【Java SE】继承,JavaSE,java,开发语言,继承

 【Java SE】继承,JavaSE,java,开发语言,继承


1.10 继承方式

 但在Java中只支持以下几种继承方式:

单继承:

【Java SE】继承,JavaSE,java,开发语言,继承

多层继承: 

 【Java SE】继承,JavaSE,java,开发语言,继承

不同的类继承同一个父类: 

【Java SE】继承,JavaSE,java,开发语言,继承

 多继承不支持

【Java SE】继承,JavaSE,java,开发语言,继承 

注意:Java中不支持多继承,但可以多态 


1.11 final 关键字 

final关键字可以用来修饰变量、成员方法以及类

 1. 修饰变量或字段,表示常量(即不能修改)

【Java SE】继承,JavaSE,java,开发语言,继承 

跟C语言中的const相似,不能被修改 

 2. 修饰类:表示此类不能被继承

【Java SE】继承,JavaSE,java,开发语言,继承

 3. 修饰方法:表示该方法不能被重写(后序介绍)


 1.12 继承与组合

 继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物

组合表示对象之间是has-a的关系,比如:学校

 【Java SE】继承,JavaSE,java,开发语言,继承

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合 


总结:  

后期博主会陆续更新Java SE的知识

如有不足之处欢迎补充交流

看到这里的友友们,支持一下博主,来个免费三连,感谢! ! !


 文章来源地址https://www.toymoban.com/news/detail-753535.html

到了这里,关于【Java SE】继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVA】面向对象的编程语言(继承篇)

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 在之前的文章中,我们介绍过面向对象的编程语言,今天我们就来就进入到JAVA面对对象的编程世界,今天我们主要来介绍面向对象的编程范式中一个重要的概念——继承。 继承是java面向对象编程技术的一块基石,因为

    2024年02月09日
    浏览(42)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(73)
  • JAVA SE基础《一》----JAVA入门

    初识Java 1.Java背景知识 java是美国 sun公司(Stanford University Network) 在1995年推出的一门计算机 高级编程语言 。 Java早期称为Oak(橡树),后期改名为Java。 Java之父: 詹姆斯·高斯林(James Gosling) 。 2009年sun公司被 Oracle(甲骨文) 公司收购。 2.Java能做什么? 桌面应用开发:各

    2024年02月09日
    浏览(51)
  • 【Java SE】 详解java访问限定符

    Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符: 实际只有三种访问限定符,default的意思是默认情况下,不加这三种访问

    2024年02月04日
    浏览(39)
  • Java SE 面试题

    请简要介绍 Java SE。 Java SE (Java Standard Edition) 是 Java 平台的基础版本,提供 Java 开发所需的所有核心功能。它包括 Java 语言规范、Java 虚拟机规范和 Java 类库。 请解释 Java 的垃圾回收机制。 Java 的垃圾回收机制是自动内存管理的一部分,用于在堆内存中自动回收不再使用的对

    2024年02月01日
    浏览(53)
  • 【JAVASE】继承

    ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事

    2024年02月14日
    浏览(33)
  • JavaSE:继承和多态(下篇)

    目录 一、前言 二、多态 (一)多态的概念 (二)多态实现条件 (三)多态的优缺点 三、重写 (一)重写的概念 (二)重写的规则  (三)重写和重载的区别 四、向上转型和向下转型 (一)向上转型 (二)向下转型   五、总结 大家好,前几天蜡笔小欣带大家了解并学

    2024年04月11日
    浏览(31)
  • javaSE-----继承和多态

    目录 一.初识继承: 1.1什么是继承,为什么需要继承: 1.2继承的概念与语法:  二.成员的访问: 2.1super 2.2this和super的区别: 三.再谈初始化: 小结: 四.初识多态: 4.1多态的概念: 4.2多态的实现条件: Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的

    2024年03月10日
    浏览(47)
  • JAVA SE -- 第十六天

    (全部来自“韩顺平教育”) 一、文件 是保存数据的地方 2、文件流 文件在程序中是以流的形式来操作  流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径

    2024年02月14日
    浏览(63)
  • 【Java SE】| BigDecimal妙用

    在使用浮点数(float / double)进行运算时,会发生精度丢失的风险(因为无限循环小数无法使用二进制来精确表示,会被截断,精度丢失)。所以我们要用到 BigDecimal ,其可以实现对浮点数的运算,不会造成精度丢失 避免使用float或double类型作为BigDecimal的构造参数,因为这样

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包