当前位置:

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

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

谷歌浏览器Mac版入口
谷歌浏览器Mac版入口

谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

Chrome浏览器JS脚本不运行怎么办
Chrome浏览器JS脚本不运行怎么办

Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

IE浏览器怀旧版在线网址
IE浏览器怀旧版在线网址

IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

火狐浏览器有哪些设置功能
火狐浏览器有哪些设置功能

火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

chrome搜索免验证入口
chrome搜索免验证入口

Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

java heap space 选型思路:使用场景与区别整理
java heap space 选型思路:使用场景与区别整理

Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

java heap space 使用中遇到的问题怎么解决
java heap space 使用中遇到的问题怎么解决

Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

java xml 选型思路:使用场景与区别整理
java xml 选型思路:使用场景与区别整理

XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

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

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

Windows
Windows

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

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。