JAVA 继承

前言

继承是面向对象编程中的一项基本概念,它允许一个类(子类或派生类)使用另一个类(父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以在不改变父类的情况下添加新的属性和方法,或者修改父类的行为。

在继承关系中,父类通常包含一些通用的属性和方法,而子类则通过继承这些特性来获得共享的行为。这有助于提高代码的可重用性、可扩展性和组织性。

在Java中,使用extends关键字实现继承,子类通过继承可以获得父类的非私有成员变量和方法,子类的构造方法可以调用父类的构造方法,使用super()关键字。

子类的继承性

子类和父类在同一个包中的继承性

如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。

例子

代码

java 复制代码
// 在同一包中的父类
class Animal {
    public String publicField = "公共字段";
    protected String protectedField = "受保护字段";
    String defaultField = "默认字段";
    private String privateField = "私有字段";

    public void publicMethod() {
        System.out.println("公共方法");
    }

    protected void protectedMethod() {
        System.out.println("受保护方法");
    }

    void defaultMethod() {
        System.out.println("默认方法");
    }

    private void privateMethod() {
        System.out.println("私有方法");
    }
}

// 在同一包中的子类
class Dog extends Animal {
    // 子类自然地继承了父类的成员变量
    void accessFields() {
        System.out.println(publicField);      // 可以访问父类的公共字段
        System.out.println(protectedField);   // 可以访问父类的受保护字段
        System.out.println(defaultField);      // 可以访问父类的默认字段
        // System.out.println(privateField);   // 无法访问父类的私有字段
    }

    // 子类自然地继承了父类的方法
    void accessMethods() {
        publicMethod();                        // 可以调用父类的公共方法
        protectedMethod();                     // 可以调用父类的受保护方法
        defaultMethod();                       // 可以调用父类的默认方法
        // privateMethod();                    // 无法调用父类的私有方法
    }
}

public class Test {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.accessFields();   // 调用子类方法,访问继承的成员变量
        myDog.accessMethods();  // 调用子类方法,访问继承的方法
    }
}

运行结果

子类和父类不在一个包中的继承性

如果子类和父类不在同一个包中,那么子类继承了父类的protected,public成员变量作为子类的成员变量,并且继承了父类的protected,public方法作为子类的方法,继承的成员或方法的访问权限保持不变。如果子类和父类不在同一个包中,子类不能继承父类的友好变量和友好方法。

友好变量通常指的是没有明确的访问修饰符(public、private、protected、default)的成员变量

友好方法通常指的是没有明确的访问修饰符(public、private、protected、default)的方法。

例子

代码

Animal.java

java 复制代码
package Animal;
// 在不同包中的父类
public class Animal {
    public String publicField = "公共字段";
    protected String protectedField = "受保护字段";
    String defaultField = "默认字段";  // 包私有字段,子类无法继承
    private String privateField = "私有字段";  // 私有字段,子类无法继承

    public void publicMethod() {
        System.out.println("公共方法");
    }

    protected void protectedMethod() {
        System.out.println("受保护方法");
    }

    void defaultMethod() {
        System.out.println("默认方法");  // 包私有方法,子类无法继承
    }

    private void privateMethod() {
        System.out.println("私有方法");  // 私有方法,子类无法继承
    }
}

Main.java

java 复制代码
package Main;

import Animal.Animal;
class Dog extends Animal {
    // 子类继承了父类的protected和public成员变量
	void accessFields() {
        System.out.println(publicField);      // 可以访问父类的公共字段
        System.out.println(protectedField);   // 可以访问父类的受保护字段
        // System.out.println(defaultField);   // 无法继承父类的包私有字段
        // System.out.println(privateField);   // 无法继承父类的私有字段
    }

    // 子类继承了父类的protected和public方法
	void accessMethods() {
        publicMethod();                        // 可以调用父类的公共方法
        protectedMethod();                     // 可以调用父类的受保护方法
        // defaultMethod();                    // 无法继承父类的包私有方法
        // privateMethod();                    // 无法继承父类的私有方法
    }
}
public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.accessFields();   // 调用子类方法,访问继承的成员变量
        myDog.accessMethods();  // 调用子类方法,访问继承的方法
    }
}

运行结果

总结

继承在Java中是一种关键的面向对象编程机制,通过使用extends关键字,子类能够继承父类的属性和方法。在继承中,子类可以访问父类的public和protected成员,但不能访问private成员。通过方法的重写,子类可以提供特定于自身的实现。此外,继承是实现多态性的基础,允许父类引用指向子类对象。通过学习继承,我不仅理解了如何有效地组织和重用代码,还能够更灵活地运用多态性,提高代码的可扩展性和可维护性。

通过掌握Java继承,我在编码中实现了更高水平的代码重用,改善了代码的可读性和可维护性。能够设计合理的类层次结构,使我的代码更有组织性和可扩展性。继承的理解帮助我更好地应用多态性,提高了代码的灵活性。此外,通过深入学习继承的概念,我更容易理解和使用各种框架,同时能够更好地运用设计模式,提高了面向对象思维的水平。综合而言,通过学习Java继承,我的编程能力得到了有力的提升,使我能够更高效地开发和维护Java应用程序。

相关推荐
泡海椒19 小时前
Java 后端最优 PDF 导出方案:jquick-pdf 项目引入与快速测试
java·开发语言·pdf
阿飞76619 小时前
订单超时自动关单:RabbitMQ 延迟队列 + 定时任务"双保险"实践
java
二炮手亮子19 小时前
使用云服务+hermes+mino模型 我用微信操控服务器自己编程并部署实操
java·语言模型·ai编程
她的男孩19 小时前
安全同事找我要"上周所有登录失败记录",我查完数据库:一条都没有
java·后端·架构
m0_5873830019 小时前
本地同城无人机作业接单系统源码:架构拆解与抢单调度实现
java·小程序·架构·需求分析
FantanLee19 小时前
面试级「分布式 ID 设计方案」
java
青春易逝丶19 小时前
Maven
java·maven
吠品20 小时前
纯HTML+ECharts构建交互式数据看板:实现思路与踩坑记录
java·服务器·数据库
盖伦发发20 小时前
Redis 核心教学: 数据结构, 缓存设计, 分布式锁
java·redis·后端·软件工程
卷毛的技术笔记20 小时前
RocketMQ事务消息:我把分布式事务这层窗户纸捅破了
java·分布式·后端·java-rocketmq