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

相关推荐
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟5 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity6 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天6 小时前
java的threadlocal为何内存泄漏
java
caridle7 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^7 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋37 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx