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应用程序。

相关推荐
num_killer4 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode5 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐5 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲5 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红5 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥5 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v5 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地6 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209256 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei6 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot