返回顶部
首页 > 资讯 > 后端开发 > Python >一篇文章超详细的介绍Java继承
  • 229
分享到

一篇文章超详细的介绍Java继承

2024-04-02 19:04:59 229人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言继承继承的优点重写和隐藏父类方法重写父类中的方法隐藏父类中的方法方法重写和隐藏后的修饰符子类访问父类私有成员使用super关键字使用super调用父类的无参数构造方法/有参数

前言

继承是面向对象语法的三大特征之一。继承可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢。今天我们开始学习有关Java继承的知识。

继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承的作用:通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类{
    ...       //成员变量、成员方法
}
class 子类 extends 父类{
    ...       //类体
}

例如:

class teacher{             //声明一个teacher类为父类
    String name;             //定义父类的成员变量name、age   
    int age;
    void show(){           //定义父类成员方法,将成员变量输出
        System.out.println(name);       
        System.out.println(age); 
    }
}
class Student extends teacher {     //声明一个Student类为子类并继承父类
}
public class myfirst {
    public static void main(String[] args) {
    System.out.println("学生");
    Student student=new Student();     //声明一个Student类的实例对象student
    student.name="Tom";                //子类调用父类的成员变量name并赋值
    student.age=19;                    //子类调用父类的成员变量age并赋值
    student.show();                    //子类调用父类的成员方法show
    }
}

运行结果为:

学生
Tom
19

注意:

  • 子类不能选择性继承父类;
  • Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
  • 构造方法不会被子类继承,但可以从子类中调用父类的构造方法。

继承的优点

  • 继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
  • 在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
  • 可以在子类中声明一个在父类中没有的新字段和方法;
  • 可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
  • 可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。

重写和隐藏父类方法

子类继承了父类中的所有成员及方法,但在某种情况下,子类中该方法所表示的行为与其父类中该方法所表示的行为不完全相同,例如,在父类语言中定义了说话这个方法,而在子类中说话的方法是不同的:外国人说英文,中国人说中文,这时我们就需要重写或隐藏父类的该方法。

重写父类中的方法

当一个子类中一个实例方法具有与其父类中的一个实例方法相同的签名(指名称、参数个数和类型)和返回值时,称子类中的方法“重写”了父类的方法。例如:

class A{
    public void sayHello() {                      //输出英文欢迎
        System.out.println("Hello,Welcome to Java!!!");
    }
    public void sayBye() {
        System.out.println("GoodBye,everyone");
    }
}
class B extends A {           
    public void sayHello() {                      //输出中文欢迎  
        System.out.println("大家好,欢迎学习Java!!!");
    }
}
public class myfirst {
    public static void main(String[] args) {
    B b=new B();                                //创建子类B的一个实例对象,使用默认构造方法
    b.sayHello();                               //调用子类中重写的方法
    b.sayBye();                                 //调用父类中的方法
    }
}

运行结果为:

大家好,欢迎学习Java!!!
GoodBye,everyone

注意:重写的方法具有与其所重写的方法相同的名称、参数数量、类型和返回值。

隐藏父类中的方法

如果一个子类定义了一个静态类方法,而这个类方法与其父类的一个类方法具有相同的签名(指名称、参数格式和类型)和返回值,则称在子类中的这个类方法“隐藏”了父类中的该类方法。

  • 当调用被重写的方法时,调用的版本是子类的方法;
  • 当调用被隐藏的方法时,调用的版本取决于是从父类中调用还是从子类中调用。
class A{
    public static void sayHello() {             //静态类方法
        System.out.println("大家好,这是A的静态类方法");
    }
    public void sayHello2() {                   //实例方法
        System.out.println("大家好,这是A中的实例方法");
    }
}
class B extends A {    
    public static void sayHello() {             //静态类方法
        System.out.println("大家好,这是B的静态类方法");
    }
    public void sayHello2() {                   //实例方法
        System.out.println("大家好,这是B的实例方法");
    }
}
public class myfirst {
    public static void main(String[] args) {
        B b=new B();                           //创建B类的实例对象b
        A a=b;                                 //隐式对象类型转换
        A.sayHello();                          //调用A类的静态类方法
        a.sayHello();                          //调用a对象的静态类方法
        B.sayHello();                          //调用B类的静态方法
        a.sayHello2();                         //调用a对象的实例方法
        b.sayHello2();                         //调用b对象的的实例方法
        A a2=new A();                          //创建A类的实例对象a2
        a2.sayHello2();                        //调用a2对象的实现方法
    }
}

运行结果为:

大家好,这是A的静态类方法
大家好,这是A的静态类方法
大家好,这是B的静态类方法
大家好,这是B的实例方法
大家好,这是B的实例方法
大家好,这是A中的实例方法

可以看出,得到调用的隐藏方法是父类中的方法,而得到调用的重写方法是子类中的方法。

方法重写和隐藏后的修饰符

在子类中被重写的方法,其访问权限允许大于但不允许小于被其重写的方法,例如:父类中一个受保护的实例方法(protected)在子类中可以是公共的(public)的,但不可以是私有的(private)。如果一个方法在父类中是static方法,那么在子类也必须是static方法;如果一个方法在父类中是实例方法,那么在子类中也必须是实例方法。

子类访问父类私有成员

子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的字段呢,我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问相应的字段。例如:

class A{                     //父类A
    private int value=10;    //声明一个私有变量value并赋值为10
    public int getvalue() {  //声明一个公有成员方法getvalue,返回value
        return value;
    }
}
class B extends A{           //A的子类B
}
public class myfirst {    
    public static void main(String[] args) {
      B b=new B();           //创建子类B的一个实例对象
      System.out.println("子类通过父类提供的公共接口访问A中的私有字段value:"+b.getvalue());
    }
}

运行结果为:

子类通过父类提供的公共接口访问A中的私有字段value:10

使用super关键字

使用super调用父类中重写的方法、访问父类中被隐藏的字段
子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。例如:

package first;
class A{
    public String name="张飞";         //添加成员变量
    public void say() {                //添加成员方法say
        System.out.println("我是父类A成员方法say");
    }
}
class B extends A{
    public String name="关羽";         //与父类中同名的字段,隐藏父类
    public void say(){                 //重写方法say
        super.say();                   //使用super关键字调用父类中的方法
        System.out.println("我是子类B成员方法say");
        System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
    }
}
public class myfirst {
    public static void main(String[] args) {
      B b=new B();                     //创建子类的一个实例对象
      b.say();                         //调用子类中重写的方法
      System.out.println("子类的name名字:"+b.name);   //调用子类中的name
    }
}

运行结果为:

我是父类A成员方法say
我是子类B成员方法say
父类的name名字:张飞
子类的name名字:关羽

使用super调用父类的无参数构造方法/有参数构造方法

子类不继承其父类的构造方法。

  • 当使用无参数的super()时,父类的无参数构造方法就会被调用;
  • 当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。

例如:

class SuperClass {              //创建父类SuperClass
      private int n;            //声明一个私有变量n
      SuperClass(){             //父类无参数构造方法
        System.out.println("这是父类SuperClass无参数构造方法");
      }
      SuperClass(int n) {       //父类有参数构造方法
        System.out.println("这是父类SuperClass有参数构造方法");
        this.n = n;
      }
    }
    class SubClass extends SuperClass{     // SubClass类继承SuperClass类
      private int n;                       //声明一个私有变量n
      SubClass(){                          // 自动调用父类的无参数构造器
        System.out.println("这是子类无参数构造方法");
      }  
      
      public SubClass(int n){              //子类有参数构造方法
        super(300);                        //调用父类中带有参数的构造器
        System.out.println("这是子类有参数构造方法"+n);
        this.n = n;
      }
    }
public class myfirst {
    public static void main(String[] args) {
            SubClass sc1 = new SubClass();      //创建子类SubClass实例对象,调用其无参数构造方法
            SubClass sc2 = new SubClass(100);   //创建子类SubClass实例对象,调用其有参数构造方法
    }
}

运行结果为:

这是父类SuperClass无参数构造方法
这是子类无参数构造方法
这是父类SuperClass有参数构造方法
这是子类有参数构造方法100

注意

  • 如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;
  • 对父类的构造放的调用必须放在子类构造方法的第一行;
  • 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;
  • 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;
  • 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。

附:继承的使用和认识

1、继承是怎么实现的?

使用extends 和 implements 关键字

extends 继承的都是对象

implements 继承实现并实现的是接口

2、在继承的场景下,同一样东西,怎么区分是你老爹的还是你自己的?

使用super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

3、父类的某些方法不想被子类继承,怎么处理?

对方法或属性进行 private 关键字或final关键字修饰

private 关键字修饰,子类无法使用和继承

final关键字修饰,无法继承,但是否可以被使用需要看权限属性

总结

到此这篇关于Java继承的文章就介绍到这了,更多相关Java继承介绍内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一篇文章超详细的介绍Java继承

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

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

猜你喜欢
  • 一篇文章超详细的介绍Java继承
    目录前言继承继承的优点重写和隐藏父类方法重写父类中的方法隐藏父类中的方法方法重写和隐藏后的修饰符子类访问父类私有成员使用super关键字使用super调用父类的无参数构造方法/有参数...
    99+
    2024-04-02
  • C++继承详细介绍
    在我们进行开发的时候,我们经常会遇到抽象出来的类之间具有继承关系。 举个简单的例子,比如我们在设计某游戏,当中需要定义Human也就是人这个类。每个人有名字,以及一定的血量,能够工作...
    99+
    2024-04-02
  • 一篇文章带你入门Java继承
    目录Java中继承什么是继承:为什么要用继承:学习总结:继承关键字:extends总结Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实...
    99+
    2024-04-02
  • 【Java】还不理解继承?一篇文章看懂继承|继承入门
    作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Java岛冒险记【从小白到大佬之路】...
    99+
    2023-09-03
    java 开发语言 jvm
  • 一篇文章带你详细理解java中类的继承与多态
    类的继承子类及其定义子类的定义使用关键字extends格式:class SubClass extends SuperClass{ ........ }子类可以继承父类的属性和方法;子类不能继承带private修饰符的属性,方法;子类不能继承...
    99+
    2017-08-28
    java入门 java 继承 多态
  • C++继承与菱形继承详细介绍
    目录继承的概念和定义基类和派生类之间的赋值继承中的作用域派生类的默认成员函数菱形继承继承和组合的区分与联系其余注意事项继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的...
    99+
    2024-04-02
  • Javascript继承机制的详细介绍
    这篇文章主要介绍“Javascript继承机制的详细介绍”,在日常操作中,相信很多人在Javascript继承机制的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2024-04-02
  • Kotlin类的继承实现详细介绍
    1.在kotlin中,默认类都是封闭的closed的。如果要让某个类开放继承,必须用open关键字修饰 类中的方法默认也是关闭的。如果需要子类复写父类的方法,也必须用open修饰。 ...
    99+
    2024-04-02
  • 一篇文章教你JS函数继承
    目录一. 前言:二.原型链继承:三.借用构造函数继承(对象伪装):四.组合继承:五.寄生组合继承:六.class继承:七.总结:一. 前言: Hello,大家最近过得好吗,€...
    99+
    2024-04-02
  • 一篇文章带你了解java接口与继承
    目录JAVA接口的概念接口的代码实现定义关键字:interface实现 关键字: implements举个列子注意事项Java继承什么是继承:总结JAVA接口的概念 官方解释:Jav...
    99+
    2024-04-02
  • Java超详细讲解类的继承
    目录写在前面1.子类的创建1.1子类的创建方法1.2调用父类中特定的构造方法2.在子类中访问父类成员3.覆盖3.1覆盖父类中的方法3.2用父类的对象访问子类的成员4.不可被继承的成员...
    99+
    2024-04-02
  • 一篇超详细的SpringBoot整合MybatisPlus的文章
    目录创建个SpringBoot项目写个HelloController测试下使用代码生成器生成代码添加所需的依赖CodeGenerator运行代码生成器,在控制台输入想要生成的表总结创...
    99+
    2024-04-02
  • 一篇超详细的Spring Boot整合Mybatis文章
    目录配置文件形式pom.xmlapplication.yml:UserMapper.xmlUserMapper配置springboot整合mybatis在运行类上添加@MapperS...
    99+
    2024-04-02
  • Python类的继承与多态详细介绍
    目录概念类的创建类的继承多态的使用概念 类(Class): 用来描述具有相同的属性和方法的对象的集合。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类...
    99+
    2024-04-02
  • Java超详细讲解三大特性之一的继承
    目录继承的概念方法的重写super关键字的使用super调用构造器总结继承的概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,...
    99+
    2024-04-02
  • 一篇超详细的Spring Boot对jdbc支持的文章
    目录项目结构pom.xml启动类Dao层Service层Controller层测试类测试总结项目结构 pom.xml pom.xml: <?xml version...
    99+
    2024-04-02
  • 关于java中继承类的权限问题的详细介绍
    在Java中有一个比较容易忽略的问题,那就是继承类的权限与基类的权限之间的关系。因为平时在使用继承类的时候,可能很少会需要到修改基类的访问权限控制符,而是直接使用基类的访问权限控制符。如果基类有属性方法是private的,那么子类是否可以修...
    99+
    2019-09-11
    java教程 java 继承类 权限
  • Java继承与多态超详细梳理
    目录一、继承1、继承的概念2、继承的语法3、父类成员访问(1)子类中访问父类的成员变量(2)子类中访问父类的成员方法4、super关键字5、子类构造方法6、super和this7、代...
    99+
    2024-04-02
  • 一篇文章带你了解Maven的继承和聚合
    目录1、继承2、聚合总结1、继承 需求场景: 有三个 Maven 工程,每个工程都依赖某个 jar 包,比如 Junit,由于 test 范围的依赖不能传递,它必然会分散在每个工程中...
    99+
    2024-04-02
  • 一篇文章让你看懂Js继承与原型链
    目录继承与原型链继承属性继承方法在 JavaScript 中使用原型性能附:原型链是实现继承的主要方法总结继承与原型链 当谈到继承时,JavaScript 只有一种结构:对象。每个实...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作