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
*/
相关文章
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
27 1
|
10天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
23 0
java基础(13)String类
|
7天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
21天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
23 9
Java——类与对象(继承和多态)
|
21天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
25 10
Java——类与对象(封装)
|
4天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
21天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
21 9
Java——类与对象
|
20天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
20 1
Java——String类详解
|
11天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
|
8天前
|
安全 Java 编译器
java访问类字段
java访问类字段
下一篇
无影云桌面