首页 > 编程语言 >类的继承性(Java)

类的继承性(Java)

时间:2024-06-19 12:29:22浏览次数:23  
标签:Java 构造方法 子类 Dog 访问 继承性 父类 super

本篇学习面向对象语言的第二特性——继承性。

1 .为什么需要继承

我们来举个例子:我们知道动物有很多种,是一个比较大的概念。在动物的种类中,我们熟悉的有猫(Cat)、狗(Dog)等动物,它们都有动物的一般特征(比如能够吃东西,能够发出声音),不过又在细节上有区别(不同动物的吃的不同,叫声不一样)。在Java语言中实现Cat和Dog等类的时候,就需要继承Animal这个类。继承之后Cat、Dog等具体动物类就是子类,Animal类就是父类。

 使用继承不仅大大的减少了代码量,也使得代码结构更加清晰可见,增加代码的复用性。 

  

2.继承的概念

继承表示两个类之间的一种关系,是已有类创建新类的机制。子类不仅可以从父类中继承成员变量和方法,还可以重新定义他们以及扩充新的内容。子类也叫派生类,父类也叫基类或者超类。继承主要解决的问题是共性的抽取,实现代码的复用。

3. 继承的语法 

  修饰符 class 子类 extends 父类 {

     }

代码示例:

class Animal {
    String name;
    int age;
    public void eat() {
        System.out.println("正在吃饭");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println(name + "汪汪汪~");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name+dog.age);
//Dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承而来的
        dog.bark();
        dog.eat();
//Dog访问的eat()和sleep()方法也是从Animal中继承而来的
    }
}

 注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

4 .父类成员访问

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?

4.1 子类中访问父类的成员变量

在子类方法中或者通过子类对象访问成员时:
(1)如果访问的成员变量子类中有,优先访问子类的成员变量。
(2)如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
(3)如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。 

4.2 子类中访问父类的成员方法

(1)通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
(2)通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错; 

问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?

5、final关键字 

final关键字可以用来修饰变量、成员方法及类。

1、修饰变量或字段,表示常量(不能被修改)。

2、修饰类,表示此类不能被继承。

3、修饰方法,表示不能被重写。

6、super关键字  

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。 

class Animal {
    String name="父类";
    int age=99;
    public void eat() {
        System.out.println("父类eat方法");
    }
}

class Dog extends Animal {
    String name="子类";
    public void eat() {
        System.out.println("子类eat方法");
    }
    public void  method(){
       super.eat();
    }
}

【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。 

 7、构造方法的继承

遵行原则:

1、子类未定义构造方法时,创建对象时将无条件的无参调用父类构造方法。

2、对于父类的含参构造方法,子类需要在自己构造方法中使用关键字super来调用它,语法:super(参数)  。但是,super关键字必须在子类构造方法中的第一个可执行语句。

3、若没有使用super关键字,那么在创建对象时,则先执行父类的无参构造方法,再执行子类自己定义的构造方法。

4、super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。

8、super和this的比较

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

【相同点】
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

9、继承上的执行顺序

示例代码如下:

class Animal {
    String name;
    int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造方法");
    }
    {
        System.out.println("父类实例代码块");
    }
    static {
        System.out.println("父类静态代码块");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
        System.out.println("子类构造方法");
    }
    {
        System.out.println("子类实例代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog =new Dog("旺财",3);
        System.out.println("———————————————");
        Dog dog1=new Dog("小花",5);
    }
}

 

 从结果可以得出结论:继承上的执行顺序是:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行 

 本篇类的继承性学习到这里是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面一篇学习多态,关注我,不要错过哦!~

标签:Java,构造方法,子类,Dog,访问,继承性,父类,super
From: https://blog.csdn.net/m0_73107796/article/details/139775063

相关文章

  • 面向对象的封装性(Java)
    目录1、封装的概念2、访问限定符3、包3、1自定义包3、2 常见的包4、static成员4、1static修饰成员变量4、2static修饰成员方法 4、3static成员变量初始化5、代码块5、1代码块概念以及分类5、2普通代码块5、3构造代码块5、4静态代码块1、封装的概念面向对......
  • JavaScript基础部分知识点总结(Part2)
    初识JavaScript1.JavaScript是什么JavaScript是世界上最流行的语言之一,是一种运行在客户端的脚本语言(Script是脚本的意思)脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行现在也可以基于Node.js技术进行服务器端编程2.JavaScript的作用表单动态校......
  • Java调用mysql后台函数的例子
    在Java中调用MySQL后台的存储函数(注意,这里我们区分存储过程和存储函数:存储过程没有返回值,但可以通过输出参数返回数据;而存储函数有一个返回值)时,你需要使用CallableStatement来执行这个函数并获取返回值。以下是一个简单的例子,说明如何在Java中调用MySQL的存储函数:MySQL存储函......
  • 小型企业人事管理系统java ssm mysql|全套源码+文章lw+毕业设计+课程设计+数据库+ppt
    小型企业人事管理系统javassmmysql|全套源码+文章lw+毕业设计+课程设计+数据库+ppt小型企业人事管理系统的设计与实现【摘要】:人才是企业发展的核心力量,所以人事管理是企业管理中一项重要的任务。传统的人事管理系统不仅效率慢而且极易出错,使管理者不能清楚的了解每一位......
  • Linux实时查看Java接口数据
    1.Linux实时查看Java接口数据的方法在Linux系统中实时查看Java接口数据通常涉及几个步骤:(1)编写Java应用程序:首先,我们需要有一个Java应用程序,它暴露了一个或多个HTTP接口。这些接口应该返回我们想要实时查看的数据。(2)使用HTTP工具或库:在Linux上,我们可以使用命令行工具(如curl或htt......
  • 深入解析Java异常处理
    在Java编程中,异常处理是一项至关重要的技术。合理地处理异常不仅能提高程序的健壮性,还能增强代码的可维护性。本文将详细介绍Java中的异常处理机制,包括异常的基本概念、分类、处理方法以及最佳实践,并通过代码示例帮助理解。一、什么是异常异常是指程序在运行过程中发生的......
  • 课题分享:学校招生信息管理系统,基于java+SSM+mysql
     一、前言介绍    在当今这个信息技术高度发展的时代,信息管理的革新已经成为了一个全球性的议题,它的影响深远而广泛。作为这一变革的一部分,“学校招生信息网”应运而生,它是一个基于Mysql数据库,通过JSP技术实现的在线平台。这个平台的建立,不仅是为了应对中国经济持续增......
  • Java学习心得:一课一得
    前言Java,作为一门面向对象的编程语言,自1995年诞生以来,一直以J其跨平台性、稳定性和安全性等特点受到广大开发者的喜爱。在学习Java的过程中,我深刻体会到了编程的乐趣和挑战。今天,我想和大家分享一下我的Java学习心得,希望对初学者有所帮助。知识点一:Java概述与环境搭建Java是......
  • Java与React轻松导出Excel/PDF数据
    前言在B/S架构中,服务端导出是一种高效的方式。它将导出的逻辑放在服务端,前端仅需发起请求即可。通过在服务端完成导出后,前端再下载文件完成整个导出过程。服务端导出具有许多优点,如数据安全、适用于大规模数据场景以及不受前端性能影响等。本文将使用前端框架React和服务端框架S......
  • 【解决方案】Java 互联网项目中消息通知系统的设计与实现(上)
    目录前言一、需求分析1.1发送通知1.2撤回通知1.3通知消息数1.4通知消息列表二、数据模型设计2.1概念模型2.2逻辑模型三、关键流程设计本篇小结前言消息通知系统(notification-system)作为一个独立的微服务,完整地负责了App端内所有消息通知相关的后端功能实现。该系统既需要与文......