iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java继承
  • 809
分享到

Java继承

javajvmservlet 2023-08-17 18:08:10 809人浏览 泡泡鱼
摘要

各位朋友们,大家好!今天我为大家分享的是Java上面一个很重要的知识点:继承,继承也被称为Java的灵魂之一。 文章目录 为什么要使用继承子类怎样继承父类在子类中如何访问父类的成员super关键字 当父类中有构造方法时this关

各位朋友们,大家好!今天我为大家分享的是Java上面一个很重要的知识点:继承,继承也被称为Java的灵魂之一。

为什么要使用继承

在生活中,我们都见过猫和狗这两种动物吧,我们都知道Java是一种面向对象的语言,我们可以创建出任何我们想要的对象,那么如果我们想要用Java来创建出猫和狗该怎么办呢?在创建之前我们首先得知道猫和狗有什么特性。我们都知道猫和狗都有名字、体重、身高,都会吃饭、睡发出叫声,那么我们可以通过创建类将他们的特性包含在内。

//猫class Cat {    String name;    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }    public void bark(){System.out.println(name+"汪汪汪~~~");}}
//狗class Dog {    String name;    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"正在睡觉");    }    public void bark(){System.out.println(name+"喵喵喵~~~");}}

当我们看到两个类的时候,我们可能会发现问题:那就是这两个代码中有很多重复的成员变量,那么如果我们要想大大降低代码的复用率该怎么办呢?这里最好的解决方法就是使用我们所说的继承,因为猫和狗都属于动物,我们可以将猫和动物以及其他类型的动物的共性都给提出来作为父类,子类只需要继承父类就可以拥有父类所具有的特性。

//Animal作为父类具有子类的共特性class Animal {    String name;    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }}

子类怎样继承父类

我们子类要想继承父类,我们需要用到extends这个关键字。格式是

class 子类类名 extends 父类类名{}

所以我们上面的代码可以简化成这样:

class Animal {    String name;    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }}class Cat extends Animal{    public void bark(){System.out.println(name+"汪汪汪~~~");}}class Dog extends Animal{    public void bark(){System.out.println(name+"喵喵喵~~~");}}

而猫和狗的内存分配大概是这样的。
在这里插入图片描述

在子类中如何访问父类的成员

一般在子类中我们可以直接访问父类的成员变量。就像这样:

class Animal {    String name = "Animal";    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }}class Cat extends Animal{    public void Method() {        System.out.println(name);    }    public void Bark() {        System.out.println(name+"喵喵喵~~~");    }}public class Main {    public static void main(String[] args) {        Cat cat  =new Cat();        cat.Method();    }}

在这里插入图片描述
这种是子类和父类没有相同的成员变量,如果子类和父类有相同的成员变量时,我们访问的又是谁的成员变量呢?

class Animal {    String name = "Animal";    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }}class Cat extends Animal{    String name = "大黄";    public void Method() {        System.out.println(name);    }    public void Bark() {        System.out.println(name+"喵喵喵~~~");    }}public class Main {    public static void main(String[] args) {        Cat cat  =new Cat();        cat.Method();    }}

在这里插入图片描述
我们可以看到这里他访问的是子类自己拥有的成员,也就是说在这里遵守就近原则,方法也是如此。

class Animal {    String name = "Animal";    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }    public void Method1() {        System.out.println("this is Animal's Method");    }}class Cat extends Animal{    String name = "大黄";    public void Method() {        System.out.println(name);    }    public void Method1() {        System.out.println("this is Cat's Method");    }    public void Bark() {        System.out.println(name+"喵喵喵~~~");    }}public class Main {    public static void main(String[] args) {        Cat cat  =new Cat();        cat.Method1();    }}

在这里插入图片描述

那么如果我们想在子类中访问相同的成员的父类的成员该怎么办呢?

super关键字

我们需要用到super这个关键字来访问父类中与子类具有相同名字的成员。

class Animal {    String name = "Animal";    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }    public void Method1() {        System.out.println("this is Animal's Method");    }}class Cat extends Animal{    String name = "大黄";    public void Method() {        System.out.println(name);    }    public void Method1() {        System.out.println("this is Cat's Method");    }    public void Method2() {        System.out.println(super.name);    }    public void Bark() {        System.out.println(name+"喵喵喵~~~");    }}public class Main {    public static void main(String[] args) {        Cat cat  =new Cat();        cat.Method2();    }}

在这里插入图片描述
我们也可以用super来访问父类的方法。

class Animal {    String name = "Animal";    float weight;    float hight;    public void Eat() {        System.out.println(name+"正在吃");    }    public void Sleep() {        System.out.println(name+"在睡觉");    }    public void Method1() {        System.out.println("this is Animal's Method");    }}class Cat extends Animal{    String name = "大黄";    public void Method() {        System.out.println(name);    }    public void Method1() {        System.out.println("this is Cat's Method");    }    public void Method2() {        System.out.println(super.name);    }    public void Method3() {        Method1();        super.Method1();    }    public void Bark() {        System.out.println(name+"喵喵喵~~~");    }}public class Main {    public static void main(String[] args) {        Cat cat  =new Cat();        cat.Method3();    }}

在这里插入图片描述

当父类中有构造方法时

当我们的父类中有构造方法时,我们在构造子类的时候需要在构造方法的第一行使用super(),来先帮助父类完成构造,然后再完成自己的构造方法。

class Base {    public Base() {        System.out.println("Base");    }}class Derived extends Base{    public Derived() {        super();        System.out.println("Derived");    }}public class Main {    public static void main(String[] args) {        Derived deriver = new Derived();    }}

在这里插入图片描述
不仅如此我们都知道如果你的类中没有构造方法,编译器会默认帮你生成一个无参的构造方法,如果你的类中还有继承关系,那么在构造方法的第一行还会默认有super()。

class Base {    public Base() {        System.out.println("Base");    }}class Derived extends Base{}public class Main {    public static void main(String[] args) {        Derived deriver = new Derived();    }}

在这里插入图片描述
但是如果你的父类中有有参数的构造方法,你就必须先帮助父类完成构造,否则编译器会报错。
在这里插入图片描述
在这里插入图片描述

this关键字

我们在实例化一个类时,往往是先完成这个类具有的构造方法,而构造方法往往是给类的成员变量赋值的,那么我们怎样通过构造方法给成员变量赋值呢?
这里就需要this,this代表当前类实例的一个引用,它可以在构造器、成员方法和代码块中使用,表示当前类的实例对象。

class Base {    String name;    public Base(String name) {        this.name = name;        System.out.println(name);    }}class Derived extends Base{    public Derived() {        super("大黄");    }}public class Main {    public static void main(String[] args) {        Derived deriver = new Derived();    }}

在这里插入图片描述
this的功能不止这些,我们都知道方法可以发生重载,构造方法也是如此。
我们可以使用this(),来完成该类中的其他的构造方法。

class Base {    String name;    int age;    public Base(String name) {    //完成该类中带有两个参数的构造方法        this(name,0);        this.name = name;        System.out.println(name);    }    public Base(String name,int age) {        this.name = name;        this.age = age;        System.out.println(name+age);    }}class Derived extends Base{    public Derived() {        super("大黄");    }}public class Main {    public static void main(String[] args) {        Derived deriver = new Derived();    }}

在这里插入图片描述
但是这里我们需要注意的是this()跟super()一样,都必须放在构造方法的第一行,也就是说super()和this()不能同时出现。

初始化

class Person {    public String name;    public int age;    public Person(String name, int age) {        this.name = name;        this.age = age;        System.out.println("构造方法执行");    }    {        System.out.println("实例代码块执行");    }    static {        System.out.println("静态代码块执行");    }}public class Main {    public static void main(String[] args) {        Person person1 = new Person("zhangsan",10);        System.out.println("===========================");        Person person2 = new Person("lisi",18);    }}

我们看看这段代码的结果是什么?
在这里插入图片描述
通过这段代码我们可以知道静态代码块、实例代码块和构造方法的执行顺序是:先执行静态代码块,然后是实例代码块,最后是构造方法,并且静态代码块只会执行一次。

那么如果有继承关系的时候执行顺序又是怎样的呢?

class Person {    public String name;    public int age;    public Person(String name, int age) {        this.name = name;        this.age = age;        System.out.println("Person:构造方法执行");    }    {        System.out.println("Person:实例代码块执行");    }    static {        System.out.println("Person:静态代码块执行");    }}class Student extends Person{    public Student(String name,int age) {        super(name,age);        System.out.println("Student:构造方法执行");    }    {        System.out.println("Student:实例代码块执行");    }    static {        System.out.println("Student:静态代码块执行");    }}public class Main {    public static void main(String[] args) {        Student student1 = new Student("zhangsan",19);        System.out.println("===========================");        Student student2 = new Student("lisi",20);    }}

在这里插入图片描述
也就是说先执行父类的静态代码块,然后是子类的静态代码块,然后是父类的实例代码块,父类的构造方法,最后是子类的实例代码块和构造方法。

protected关键字

我们的子类是否可以访问父类的所有成员呢?其实并不是。
在这里插入图片描述
我们可以看到这里的c是不能被访问的,因为父类的c被private修饰的,他只能在当前类中使用,那么如果我们只让父类的子类使用的成员该怎么办呢?我们可以使用protected。
在这里插入图片描述
你其他的没有继承父类的类就不能使用被protected修饰过的成员,这样大大提高了代码的安全性。
在这里插入图片描述

final关键字

如果我们的类不想被继承,我们可以在类的前面加上final修饰,代表他是最终类,该类不可被继承。final修饰变量表明该变量不可被改变,他的属性也就从变量变成了常量。final修饰方法,表明这个方法不可被重写,重写我们后面再讲。

建议

在Java中继承是一个非常实用的特性,我们应该正确的使用它。继承关系可以有很多层,但是不建议超过三层,并且在Java中不可以多继承,也就是说一个类不能继承多个类,就像一个儿子不能有多个父亲一样,父类可以有多个子类。

来源地址:https://blog.csdn.net/m0_73888323/article/details/130449175

--结束END--

本文标题: Java继承

本文链接: https://www.lsjlt.com/news/373196.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JAVA】继承
    作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将jav...
    99+
    2023-08-31
    java 开发语言
  • Java继承
    各位朋友们,大家好!今天我为大家分享的是Java上面一个很重要的知识点:继承,继承也被称为Java的灵魂之一。 文章目录 为什么要使用继承子类怎样继承父类在子类中如何访问父类的成员super关键字 当父类中有构造方法时this关...
    99+
    2023-08-17
    java jvm servlet
  • Java之继承
    继承 继承为什么使用继承继承是什么继承的语法访问父类成员访问父类成员变量访问父类成员方法 super关键字子类构造方法super和this异同分别的使用方法 继承的方式final关键字 作者简介: zoro-1,...
    99+
    2023-08-16
    java 开发语言 程序人生
  • java中的继承
    一、继承 是面向对象三大特征之一。 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承的方法,使得子类具有父类相同的行为。 继承需要符合的关系是:is-a。例如:智能手机是手机。 二、类的继承格式...
    99+
    2023-09-01
    java jvm servlet
  • 【Java】还不理解继承?一篇文章看懂继承|继承入门
    作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Java岛冒险记【从小白到大佬之路】...
    99+
    2023-09-03
    java 开发语言 jvm
  • Java继承的概念
    本篇内容介绍了“Java继承的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!继承与合成基本概念继承:可以基于已经存在的类构造一个新类。继...
    99+
    2023-05-30
    java
  • 详解Java的继承
    目录继承:继承的好处:继承的坏处:继承的特点:继承和成员变量之间的关系:this关键字和super关键字的区别方法的重写:总结继承: 把多个类相同的内容提取到另外一个类中,然后使用关...
    99+
    2024-04-02
  • Java继承与组合
    系列文章目录 你真的知道怎样用java敲出Hello World吗?—初识JAVA 你知道为什么会划分数据类型吗—JAVA数据类型与变量 10 > 20 && 10 / 0 == 0等于串联小灯泡—J...
    99+
    2023-09-06
    java
  • 什么是Java继承
    本篇内容主要讲解“什么是Java继承”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java继承”吧!一、继承的概念什么是继承在现实生活中,继承指的是子女继承父辈的财产。在程序中,当一个类A...
    99+
    2023-06-15
  • python 继承与多重继承
    当然,如果不支持python继承,语言特性就不值得称为“类”。派生类定义的语法如下所示: <statement-1> . . . <statement-N> 名称 BaseC...
    99+
    2023-01-31
    python
  • java 继承的基础(转)
    java 继承的基础(转)[@more@]继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。在J...
    99+
    2023-06-03
  • Java中的继承详情
    目录一. 继承1.1 继承的实现1.2 继承的好处和弊端二. 继承中的成员访问特点2.1 继承中变量的访问特点2.2 super2.3 继承中构造方法的访问特点2.4 继承中成员方法...
    99+
    2024-04-02
  • Java的继承实例分析
    这篇文章主要介绍“Java的继承实例分析”,在日常操作中,相信很多人在Java的继承实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的继承实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • 深入浅析JAVA的继承
    本篇文章给大家分享的是有关深入浅析JAVA的继承,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。继承(inheritance)是Java OOP中一个非常重要的概念。继承是在复用...
    99+
    2023-05-31
    java 继承 ava
  • Java基础-封装和继承
    目录一. 封装1.1 封装的目的1.2 封装的好处1.3 封装的步骤1.4 封装的例子1.5 小结二. 继承2.1 继承的介绍2.2 生活中的继承2.3 继承的好处2.4 继承的格式...
    99+
    2024-04-02
  • java如何实现多继承
    Java不支持多继承,一个类只能直接继承自一个父类。这是为了避免多继承可能引发的冲突和复杂性问题。 然而,Java提供了一种间接实现...
    99+
    2023-10-26
    java
  • Python-继承
    单继承 多继承 面向对象三大特性 封装根据职责将属性和方法封装到一个抽象的类中 继承实现代码的重用,相同的代码不需要重复的缩写 多态不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 1.单继承 1.1继承的概念、...
    99+
    2023-10-27
    python linux ubuntu centos pycharm Powered by 金山文档
  • JavaScript继承与多继承实例讲解
    这篇文章主要介绍“JavaScript继承与多继承实例讲解”,在日常操作中,相信很多人在JavaScript继承与多继承实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • python 继承
    面向对象中的继承关系         1. 经典类             py2: 不继承任何类  2. 新式类             py2: 手动继承object             py3: 所有的类都是object的子类 ...
    99+
    2023-01-30
    python
  • C++多继承(多重继承)的实现
    在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有...
    99+
    2023-05-16
    C++多继承 C++多重继承
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作