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

相关推荐
一只特立独行的猪6111 小时前
Java面试——集合篇
java·开发语言·面试
讓丄帝愛伱2 小时前
spring boot启动报错:so that it conforms to the canonical names requirements
java·spring boot·后端
weixin_586062022 小时前
Spring Boot 入门指南
java·spring boot·后端
Dola_Pan5 小时前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book5 小时前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
蜗牛^^O^6 小时前
Docker和K8S
java·docker·kubernetes
从心归零6 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂7 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius8 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe8 小时前
分布式系统实战经验
java·分布式