当前位置:

首页 > 编程开发 > Java继承使用实例分析

Java继承使用实例分析

继承继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承的作用:通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。在Java中通过extends关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:class父类{...//成员变量、成员方法}class子类extends父类{...//类体}例如:classteacher{//声明一个teacher类为父类S

本文目录

    继承

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

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

    在 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关键字修饰,无法继承,但是否可以被使用需要看权限属性

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。