Java类的继承完全详解

简介: Java类的继承完全详解

写在前面


  • 🎉类的继承可以在已有类的基础上派生出来新的类,不需要编写重复的代码,==提高了代码的复用性==,是面向对象程序设计的一个重要的特点,被继承的类叫做==父类==,由继承产生的新的类叫做==子类==,一个父类可以通过继承产生多个子类,但是与C++不同的是Java语言==不支持多重继承==,即不能由多个类派生出一个新的类,避免了由多重继承产生的歧义性,更加的安全。

子类继承父类的成员变量和成员方法,还可以修改父类的成员变量或者重写父类成员方法,还可以添加新的成员变量和方法,大大提高了代码的复用性。


✅ 所有的类都是直接或者间接的继承java.lang.Object类来的。

@TOC

    --------💖分割线💖--------    


🍭 1.子类的创建

🍸1.1子类的创建方法

🎉java语言中类的继承由关键字extends实现。

🎉如果继承中没有使用extends关键字,则说明该类默认继承ava.lang.Object。

🎉子类的每个对象也是父类的对象,所以在任何使用父类实例地方,都允许使用子类实例。

实例1:创建个人类Person,在以个人类为父类创建子类学生类Student类。(代码放在文末)点击跳转


  • 🎉java在调用子类的构造函数之前,会先调用父类的构造方法。
  • 🎉构造方法是不能被继承的。

🍸1.2调用父类中特定的构造方法

🎉在Java继承中,程序执行时,子类会先调用父类的无参构造方法,进行初始化操作,但是如果父类中有多个构造函数,那么就需要在子类的构造方法中使用super()来调用父类中特定的构造方法。

实例2:super()调用父类中特定的构造方法(代码放在文末)点击跳转


  • 🎉如果省略super()则会默认调用父类的无参构造方法。
  • 🎉调用父类构造方法的super()语句必须放在子类构造方法的第一行。
  • 🎉super()可以重载,会根据参数的数量和类型选择调用父类的构造方法。
  • 🎉如果父类中只定义了有参数的构造方法,而子类中没有使用super()来调用父类特定的构造方法,则编译会出现错误。

    --------💖分割线💖--------    


🍭 2.在子类中访问父类成员

🎉在子类中使用super()方法,可以访问父类中的特定的构造方法,还可以访问父类中的成员变量和成员方法。但是不能访问子类中添加的成员。

super.变量名

super.方法名

🎉若父类成员申明为private,则子类中无法访问。


🍭 3.覆盖

🍸3.1覆盖父类中的方法

  • 🎉覆盖与重载相似,是java多态特点的体现。
  • 🎉覆盖是指在子类中,定义名称,参数个数与类型与父类中完全相同的方法,用于实现重写父类中同名方法。
  • 🎉如果子类中的方法名和父类中的方法名完全相同,则不能继承,此时子类的方法覆盖父类中的方法。
  • 🎉子类中不能覆盖父类中声明为final和static的方法。
  • 🎉在子类覆盖父类的方法时,可以扩大父类中方法的权限,但是不能缩小父类中方法的访问权限。

🍸3.2用父类的对象访问子类的成员

  • 🎉当子类覆盖父类的成员方法时,父类的对象可以访问子类的成员。只需要声明父类的变量指向子类的对象,此时可以访问子类覆盖父类的成员方法,但是不可以访问子类特有的成员方法。

🍭 4.不可被继承的成员和最终类

  • 🎉如果父类中的成员不希望被覆盖,则可以使用final关键字来修饰。如果用final来修饰变量,则称该变量为最终变量,即常量,程序中其他部分,可以访问,但是不可以修改。如果用final修饰成员方法,则该方法不可以被子类覆盖,该方法称为最终方法。增加了代码的安全性。
  • 🎉如果一个类被final修饰,则该类称为最终类,不可以被继承。

✅定义在类中的final成员变量和定义在方法中的final局部变量,一旦给定就不能被修改,都属于是只读量,只能一次赋值。

    --------💖分割线💖--------    

✅如果一个变量同时被final和static修饰,则他的实质是一个常量,即static final。且这样的常量只能在定义的时候被赋值。如果一个变量只用final修饰而不用static,则只能被赋值一次,不能缺省。

附:实例java代码

实例1:

//实例1:类的继承,创建个人类Person,在以个人类为父类创建子类学生类Student类。
//filename:A_1.java
import java.io.*;
class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("调用Person类的构造方法");
    }
    public void setNameAge(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void show(){
        System.out.println("姓名:"+name+"年龄"+age);
    }
}
class Student extends Person{
    private String department;
    public Student(){
        System.out.println("调用Student类的构造方法");
    }
    public void setDepartment(String department){
        this.department=department;
        System.out.println("我是"+department+"的学生");
    }
}
public class A_1{
    public static void main(String[] args){
        Student stu=new Student();
        stu.setNameAge("张三",18);
        stu.show();
        stu.setDepartment("计算机专业");
      }
    }
/**
调用Person类的构造方法
调用Student类的构造方法
姓名:张三年龄18
我是计算机专业的学生
*/

实例2:

//实例2:super()调用父类中特定的构造方法
//filename:A_1.java
import java.io.*;
class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("调用Person类的无参构造方法");
    }
    public Person(String name,int age){
        System.out.println("调用Person类的有参构造方法");
        this.name=name;
        this.age=age;
    }
    public void show(){
        System.out.println("姓名:"+name+"年龄"+age);
    }
}
class Student extends Person{
    private String department;
    public Student(){
        System.out.println("调用Student类的无参构造方法");
    }
    public Student(String name,int age,String department){
        super(name,age);
        this.department=department;
        System.out.println("我是"+department+"的学生");
        System.out.println("调用Student类的有参构造方法");
    }
}
public class A_1{
    public static void main(String[] args){
        Student stu1=new Student();
        Student stu2=new Student("张三",18,"计算机专业");
        stu1.show();
        stu2.show();
    }
}
/**
调用Person类的无参构造方法
调用Student类的无参构造方法
调用Person类的有参构造方法
我是计算机专业的学生
调用Student类的有参构造方法
姓名:null年龄0
姓名:张三年龄18
*/
目录
打赏
0
0
0
0
33
分享
相关文章
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
150 83
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
136 35
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
153 0
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
Java 期末考试救急必备涵盖绝大多数核心考点及五大类经典代码助你过关
本文为Java期末考试复习指南,涵盖基础语法、面向对象编程、异常处理、文件操作、数据库连接五大核心考点,提供详细解析与实用代码示例,助力快速掌握重点,高效备考,轻松应对考试。
32 0
|
17天前
|
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
52 11
|
2月前
|
【高薪程序员必看】万字长文拆解Java并发编程!(7):不可变类设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中Java不可变类设计指南,废话不多说让我们直接开始。
52 0
Java并发包下Atomic相关类的使用
本文介绍了 `java.util.concurrent.atomic` 包下的各类原子类及其使用场景,包括基本类型原子类(如 `AtomicInteger`、`AtomicLong`)、数组类型原子类(如 `AtomicIntegerArray`)、引用类型原子类(如 `AtomicReference`)、对象属性修改原子类(如 `AtomicIntegerFieldUpdater`)以及原子操作增强类(如 `LongAdder` 和 `LongAccumulator`)。同时,详细对比了不同原子类在高并发场景下的性能表现,展示了 `LongAdder` 的高效性。
102 31
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
3月前
|
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
90 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等