java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java继承避坑指南

别再死记硬背!Java继承的“血缘密码”与避坑指南(最新整理)

作者:第六章初

在Java中,继承是一种非常重要的面向对象编程概念,它允许我们通过重用已有的代码来创建新的类,然而,不恰当的继承使用可能会导致一些问题,比如“血缘密码”(Inheritance Pitfalls)和设计上的缺陷,下面我将解释一些常见的继承问题,并给出一些避坑指南

前言

一 继承

什么是继承

基本代码示例

// 这是一个父类,用来表示学生信息
public class Student {
    public String name;
    public int age;
    public String id;
    public String major;
    public void print(){
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("ID: " + id);
        System.out.println("Major: " + major);
    }
}
// 子类:本科生 继承自学生类
public class Undergraduate extends Student {
        void undergraduate(){
            System.out.println(name+"正在学习基础课程");
        }
}
//子类:研究生,继承自学生类
public class Postgraduate  extends Student {
    void postgraduate(){
        System.out.println(name+"正在做实验");
    }
}

测试类

public class test20250807 {
    public static void main(String[] args) {
        Undergraduate u = new Undergraduate();
        Postgraduate p = new Postgraduate();
        u.name = "张三";
        p.name = "李四";
        u.undergraduate();
        p.postgraduate();
    }
}

继承语法

在java中我们通过extend关键字进行继承

子类中访问父类的成员变量/成员方法

不存在同名的成员变量时

在子类中正常访问

public class Base {
    int a;
    int b;
  }
public class Derived extends Base{
     int c;
    public void method(){
    a = 10; // 访问从⽗类中继承下来的a
    b = 20; // 访问从⽗类中继承下来的b
    c = 30; // 访问⼦类⾃⼰的c
   }
}
存在同名的成员变量/方法时
    public static void main(String[] args) {
        Undergraduate u = new Undergraduate();
        Postgraduate p = new Postgraduate();
        u.print();
        p.print();
//子类
public class Undergraduate extends Student {
    public void print() {
        System.out.println("子类中的print");
    }
 }
//父类
public class Student {
    public String name;
    public int age;
    public String id;
    public String major;
    public void print(){
        System.out.println("父类中的print");
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("ID: " + id);
        System.out.println("Major: " + major);
    }
}

结果:

子类的构造方法

代码示例:

public class Base {
    public Base(int a){
        System.out.println("Base class constructor");
    }
public class Derived extends Base {
    Derived() {
        super(10);  //这里对父类进行初始化
        System.out.println("Derived Constructor Called!");
    }
 }
public class test202508081 {
    public static void main(String[] args) {
        Derived d = new Derived();
    }
}

结果:

二 this和super

相同点

不同点

三 继承关系上代码块等的初始化顺序

在此之前我们复习看一之前的代码块的初始化顺序:

加入继承:

package student;// 这是一个父类,用来表示学生信息
public class Student {
    public String name;
    public int age;
    static{
        System.out.println("student静态代码块");
    }
    {
        System.out.println("student(示例代码块)非静态代码块");
    }
    public Student(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println("student带两个参数的构造代码块");
    }
public class Undergraduate extends Student {
    static{
        System.out.println("Undergra静态代码块");
    }
    {
        System.out.println("Undergra(示例代码块)非静态代码块");
    }
    public Undergraduate(String name, int age) {
        super(name,age);
        System.out.println("Undergra带两个参数的构造代码块");
    }
public class test20250807 {
    public static void main(String[] args) {
        Undergraduate u = new Undergraduate("张三",20);

结果:

四 访问修饰限定符-protected 关键字

不能通过父类类名进行访问

如果被 protected 关键字修饰该类当中成员变量,成员⽅法等表⽰要么只能在同⼀个包中的类中进⾏访问,要么在不同包中只能通过在继承关系上的⼦类对象来访问。

五 继承分类

多继承是不存在的,不能同时有多个父类。

六 final关键字

七 继承和组合

//组合
// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// ⻋载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复⽤轮胎中的属性和⽅法
private Engine engine; // 可以复⽤发动机中的属性和⽅法
private VehicleSystem vs; // 可以复⽤⻋载系统中的属性和⽅法
// ...
}
//继承
// 奔驰是汽⻋
class Benz extend Car{
// 将汽⻋中包含的:轮胎、发送机、⻋载系统全部继承下来
}

总结

到此这篇关于别再死记硬背!Java继承的“血缘密码”与避坑指南的文章就介绍到这了,更多相关java继承避坑指南内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文