Java-继承-定义Student类继承于Person类(例)

news2024/11/15 8:30:16

我们书接上回:这一章,我们进入"继承"。

先来了解题目有关继承的需求:(本题是为知识服务,也可用于练手)

题目:

已有一个类Person类,代码如下:

Person类定义:

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    //做自我介绍
    public void doSelfIntroduction(){
        System.out.println("My name is "+name);
    }
}

现要求定义一个类Student继承于Person类,Student类的要求如下:

  1. 新增一个成员变量 :stuID 表示学生的学号;
  2. 一个带参数构造器,初始化学生的姓名和学号;
  3. 重写父类的void doSelfIntroduction() 方法,改输出为:"My name is xxxx and my stuID is xxxx"
  4. 新增一个方法,void study(),该方法输出:"I am studying!"

Main类代码:

public class Main{
    public static void main(String[] args) {
        Person person = new Person("Tom");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        String stuID = scanner.next();
        Person stu1 = new Student(name,stuID);
        person.doSelfIntroduction();
        stu1.doSelfIntroduction();
        Student stu2 = new Student(name,stuID);
        stu2.study();
    }
}

输入样例:

在这里给出一组输入。例如:

Jerry 121001

输出样例:

在这里给出相应的输出。例如:

My name is Tom
My name is Jerry and my stuID is 121001
I am studying!

 继承:

继承这个词,一般在语言学上:子承父业,继往开来;在生物学上也异曲同工:遗传与变异

其实,好巧不巧,java世界里面的继承也是如此道理。还记得java的核心是什么吗?类。那类在继承场景中自然而然扮演主人公——继承(java),是子类对父类属性和行为的继承

父类(superclass),子类(subclass)

继承的语法

class 子类名 extends 父类名
{
 //可以不再重复定义相同成员变量


}

子类继承父类时,需要在类定义时,使用extends+ 父类名,表示继承关系 

继承的表现

既然继承是子类对父类属性和行为的继承——那么子类一旦继承父类,就可以拥有父类的属性和方法。这个说法确实是对的。

我们开始对这句话进行各种假设,父类是单一的吗?在继承语法上,只能extends一个直接父类。但子类的间接父类可以有很多个。就好比,人只有一个亲生父亲,却也有父亲的父亲,父亲的父亲的父亲,爷爷的爷爷的爷爷...这些间接的父类的属性和行为,子类同样也可以继承。

俩个验证

我们用代码验证

子类只允许单一继承父类:

 上面代码,我们子类单一直接继承一个父类——假如我们尝试一次性直接继承两个父类

这样:

又或者是这样: 

 

发现结果都报错了

:Class cannot extend multiple classes,不能同时继承多个父类

故:确实子类只能单一继承一个父类

验证:子类可以继承直接父类、间接父类的属性和方法:

我们写一个主类,创建三个类,Son类继承Father类,Father类继承Grandpa类

可知,在这三类的继承关系上,Grandpa类位于最高地位。

public class Grandpa {
     String name;//属性1:姓名
     int workyear;//属性2:工作年限
     void work()//行为1:工作
     {
         System.out.println(name + "写唐诗");
     }
     void hobby()//行为2:爱好
     {
         System.out.println(name + "君子六艺");
     }
}
public class Father extends Grandpa{
}//直接继承,定义类里代码为空

我们在main里验证,倘若符合子类只要extends一个父类,就可以拥有父类的属性和方法,何谓"拥有",能在主方法能对属性进行调用、赋值,对方法进行调用。

public class Main {
    public static void main(String[] args) {
        Father father = new Father();
        father.name = "钱";//调用对象的属性并对其进行赋值
        father.work();//调用对象的实例方法:工作
        father.hobby();//调用对象的实例方法:爱好
    }

}

代码并没有报错,说明子类只要继承父类,即可拥有父类的属性和方法

那子类可否继承间接父类的属性和方法呢?

public class Son extends Father {
    
}//Son类只是继承Father类,并没有定义其他属性和方法
public class Father extends Grandpa{
}//直接继承,定义类里代码为空

 主类里面:

public class Main {
    public static void main(String[] args) {
        Son son = new Son();//对类实例化
        son.name = "孙";//同样对姓名属性赋值
        son.work();//调用方法
        son.hobby();//调用方法
    }
}

看看效果: 

 

 Son类除了继承Father类没写一行,Father类如上也只继承了Grandpa类,按理说Son继承Father类,应该没有一个属性和方法。但是如上面的代码,可见,Son也继承了Grandpa的属性和两个方法——"work" 和"hobby".

我们来看看运行结果:

public class Main {
    public static void main(String[] args) {
        Grandpa grandpa = new Grandpa();
        grandpa.name = "赵";
        grandpa.work();
        grandpa.hobby();//创建一个grandpa的对象
        Father father = new Father();
        father.name = "钱";
        father.work();
        father.hobby();//创建一个father的对象
        Son son = new Son();
        son.name = "孙";
        son.work();
        son.hobby();//创建一个son的对象
    }

}

 

三代可谓一脉相承,都会写唐诗和善君子六艺 。可是,这并不符合实际发展,子类为适应不断发展变化的环境和外界需求,对自身的行为和属性必须作出相应的变化和发展。

JAVA里面对这一子类进化需求,也作出回应:
1.子类可以添加父类所不具有的属性和方法

2.子类也可对继承过来的方法进行修改,但不能对属性进行修改。

再来俩个验证

1.子类可以添加父类所不具有的属性和方法

我们让Son适应时代需求,新添加一个行为和一个属性

public class Son extends Father {
    String[] career;//添加属性:所谓技多不压身
    void work2()//添加方法
    {
        System.out.println(name + "武功高强");
    }

}
public class Main {
    public static void main(String[] args) {
        Son son = new Son();
        son.name = "孙";
        son.career = new String[]{"诗人","侠客"};//意外发现对于属性是字符串数组初始化赋值: new String[]{};
        son.work();
        son.work2();
        son.hobby();
    }

}

我们在Son类添加一个新的属性和方法,在主方法里对Son 进行实例化,并对属性进行赋值和方法调用。代码没报错,可见验证假设成功

看看结果:

2.子类也可对继承过来的方法进行修改,但不能对属性进行修改。 

前半句,对继承过来的方法进行修改,我们又称——方法覆盖(Method Override)

在进行Override的时候,我们最好提前在上方加个注释:意为告诉JVM我们要对继承过来的方法进行覆盖重写了。

方法覆盖:

方法包括:

返回类型 方法名(参数列表)
{
   方法体
}//如果原方法还有public ,覆盖的方法也得原封不动写下来

进行方法覆盖时,为了让JVM明确我们覆盖的到底是哪个方法,返回类型和方法名(参数列表)即除了方法体可做改变,其余保持原样。(返回类型可以返回原方法的类型的子类型,该知识点涉及向上转型,咱们后面再聊) 

方法覆盖必须满足返回类型,方法名和参数列表与原方法一样。(now)

子类为了适应发展,创造出更多的属性和行为,还应该对继承下来的方法进行进化,发展出一套适合自身和外界需求的方法。——这也是传承的意义,不光为子类自身,更为整个类的发展

我们重写Father类和Son类方法work()

public class Father extends Grandpa{
    @Override
    void work()//继承并覆盖Grandpa的方法
    {
        System.out.println(name + "满腹经纶,学富五车");
    }

}
public class Son extends Father {
    
    @Override//继承间接父类的方法并进行覆盖
    void work()
    {
        System.out.println(name + "文能提笔安天下,武能上马定乾坤");
    }


}

主类代码进行调用:

public class Main {
    public static void main(String[] args) {
        Grandpa grandpa = new Grandpa();
        grandpa.name = "赵";
        grandpa.work();
        
        Father father = new Father();
        father.name = "钱";
        father.work();
        
        Son son = new Son();
        son.name = "孙";
        son.work();   
    }

}

对父类属性的修改:

JAVA本身并不提供子类“覆盖”父类成员变量的方法,子类仍然继承,但是可以不用表现,就如遗传时,基因都给子类,至于是否显现这个性状,就看子类是否愿意在主方法里面调用了。

小总结:

子类通过extends关键字,单一继承父类

子类继承直接父类和所有间接父类的属性和方法

子类可以添加新的属性和方法

子类可以改变父类的方法体

回到题目

先继承;

class Student extends Person
{}

 在子类里面添加属性:

class Student extends Person
{
  String stuID;
}

在子类写一个带参数构造器:

class Student extends Person
{
  String stuID;
}
public Student(String name,String stuID)
{
    this.name = name;//真的是这样赋值吗
    this.stuID = stuID;

}//带参数构造器

我们发现报错了

 父类里面的name成员是private,子类不能公开访问,那子类拥有这个属性吗?答案是有的。但是不能公开访问,需要其他方式进行访问。

我们再看父类代码,发现父类的构造器是公开的:父类是这个属性的创始者,对于这个属性虽然是私有的,子类蛮干是无法访问的。但是父类也为我们公开了访问和使用的方法,扑面而来的哲学气息:授人以鱼不如授人以渔。

鱼,父类已经暗暗给你,不过需要你学会如何渔。

super关键字

还记得父类的英文名吗?superclass,super关键字就是调用父类的方法,实现当前方法的需求。

方便理解,我们可以把super替换成父类的名字。

那么在子类里面要初始化从父类继承过来的私有属性,需要调用父类的构造器,怎么用super来写呢?答案已经呼之欲出了对不对

super()是调用父类的无参构造器,super(参数1,参数...)是调用父类的有参构造器,super.方法名是调用父类的方法。特殊说明,调用父类的构造器我们一般选用super关键字且在第一行,而其他公开实例方法,this和super都可以:his是因为子类直接继承过来了,super也可以:在子类里面使用父类的方法完成当前对象的需求

同样的,这里的父类可以是间接父类。

class Student extends Person
{
    String stuID;
    public Student(String name,String stuID)
    {
       super(name);//调用父类的构造器一定是在子类的第一行
       this.stuID = stuID;
    
    }
}

对父类方法的重写:

class Student extends Person
{
    //...
    @Override
    public void doSelfIntroduction()
    {
        System.out.println("My name is " + getName() + " and my stuID is " + stuID);
    
    }//getName()前面默认省掉this,也可用super,结果是一样的
}

 

 在子类里面新增一个方法:
 

class Student extends Person
{
//...
    public void study()
    {
     System.out.println("I am studying!");
    }//新增方法
}

完整代码参考:
 

class Student extends Person
{
    String stuID;
    public Student(String name,String stuID)
    {
       super(name);
       this.stuID = stuID;
    
    }
    @Override
    public void doSelfIntroduction()
    {
        System.out.println("My name is " + getName() + " and my stuID is " + stuID);
    
    }
    public void study()
    {
     System.out.println("I am studying!");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟退火遗传算法GASA-附MATLAB代码

模拟退火遗传算法(Simulated Annealing Genetic Algorithm,SAGA)结合了模拟退火算法(Simulated Annealing,SA)和遗传算法(Genetic Algorithm,GA)的优点,用于解…

基于springboot+vue+Mysql的招生管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

网络基础(二)——HTTPS协议原理

目录 1、概念准备 1.1、HTTPS是什么 1.2、什么是加密 1.3、为什么要进行加密 1.4、常见的加密方式 对称加密 非对称加密 1.5、数据摘要&&数据指纹 1.6、数字签名 2、HTTPS的工作过程探究 2.1、方案1 - 只使用对称加密 2.2、方案2 - 只使用非对称加密 2.3、…

多线程中常用的一些方法介绍

目录 1. setName和getName方法 2. 静态方法currentThread 3. 静态方法sleep 4. setPriority和getPriority方法 5. setDaemon方法 6. 静态方法yield 7. join方法 下面介绍这些方法的使用,以下面的MyThread为例: public class MyThread extends Th…

电商系列之促销

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…

SpringBoot + Vue + Nginx前后端分离项目本地部署(Win)

SpringBoot Vue Nginx前后端分离项目本地部署步骤 本地部署所需步骤 将后端打包好的jar文件和前端生成的静态资源文件放入同一目录启动Spring Boot应用配置Nginx并重启访问 http://your_domain 查看部署效果 前端Vue项目部署 将写好的vue代码的目录下运行 npm run build …

956: 约瑟夫问题的实现

【学习版】 【C语言】 #include <iostream> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef struct Lnode {int date;struct Lnode* next; }Lnode, * Linklist; int In(Linklist&…

《数据结构学习笔记---第十篇》--- 堆堆排序(超详细图解)

目录 1.堆是什么? 2.问题引入&#xff1a;当我们插入一个新的元素时&#xff0c;那么他还是堆吗。 3.堆的元素插入 4.问题引入&#xff1a;当我们删除一个堆顶元素时&#xff0c;我们又该如何调整呢&#xff1f; 5.堆顶元素删除 6.如何建堆&#xff1f; 6.1向上调整建堆…

面试算法-140-接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2…

网络编程(TCP、UDP)

文章目录 一、概念1.1 什么是网络编程1.2 网络编程中的基本知识 二、Socket套接字2.1 概念及分类2.2 TCP VS UDP2.3 通信模型2.4 接口方法UDP数据报套接字编程TCP流套接字编程 三、代码示例3.1 注意点3.2 回显服务器基于UDP基于TCP 一、概念 首先介绍了什么是网络编程&#xff…

大模型量化技术-GPTQ

大模型量化技术-GPTQ 2022年,Frantar等人发表了论文 GPTQ:Accurate Post-Training Quantization for Generative Pre-trained Transformers。 这篇论文详细介绍了一种训练后量化算法,适用于所有通用的预训练 Transformer模型,同时只有微小的性能下降。 GPTQ算法需要通过…

Autodesk Maya 2025 Multilanguage (macOS, Linux, Windows) - 三维动画和视觉特效软件

Autodesk Maya 2025 Multilanguage (macOS, Linux, Windows) - 三维动画和视觉特效软件 三维计算机动画、建模、仿真和渲染软件 请访问原文链接&#xff1a;https://sysin.org/blog/autodesk-maya/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&a…

‘cv2’、PIL、torch、torchivision

运行环境安装失败集 1、 ModuleNotFoundError: No module named ‘cv2’No module named ‘cv2’ opencv-python PEP517 ERROR2、ModuleNotFoundError: No module named PIL3、torch、torchvision安装 1、 ModuleNotFoundError: No module named ‘cv2’ No module named ‘cv…

基于SSM的社区疫情防控管理信息系统

目录 背景 技术简介 系统简介 界面预览 背景 随着时代的进步&#xff0c;计算机技术已经全方位地影响了社会的发展。随着居民生活质量的持续上升&#xff0c;人们对社区疫情防控管理信息系统的期望和要求也在同步增长。在社区疫情防控日益受到广泛关注的背景下&#xff0c…

JAVAEE——文件IO

文章目录 文件的概念什么是文件&#xff1f;树型结构组织 和 目录文件路径相对路径绝对路径 文件的分类文件的权限 文件读写IO API字符流操作API 警告字节流操作APIInputStreamOutputStream 文件的概念 什么是文件&#xff1f; 我们先来理解一下什么是文件&#xff0c;那么想…

四川尚熠电子商务有限公司靠谱吗?怎么样?

在当下数字化浪潮中&#xff0c;电子商务行业正以前所未有的速度蓬勃发展。四川尚熠电子商务有限公司&#xff0c;作为专注于抖音电商服务的企业&#xff0c;凭借其敏锐的市场洞察力和创新精神&#xff0c;正成为行业内的佼佼者&#xff0c;为众多品牌打开抖音电商市场的大门。…

[技术闲聊]我对电路设计的理解(三)

终于可以独立做项目了&#xff0c;是不是很激动&#xff0c;是不是为自己骄傲和自豪&#xff0c;应该的&#xff0c;奋斗那么久不就是为了站在山巅看看四周的风景嘛&#xff01; 虽说山外还有山&#xff0c;但是此刻就在脚下的山巅上&#xff0c;怡然自得都是不过分的&#xff…

YOLOv8改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络,CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下…

《内心强大比什么都重要》 - 三余书屋 3ysw.net

内心强大比什么都重要 今天我和大家一起分享一本好书&#xff0c;艾米莫林的《内心强大比什么都重要》。这本书中描述了人们如何控制情绪、想法和行动&#xff0c;让自己的内心更强大。书中也列举了一些有用的建议、积极向上的例子和实际解决方法&#xff0c;来帮助读者们克服…

Python搭建编程环境-安装Python3解释器

✅作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1&#x1f3c5; &#x1f525;本文已收录于Python系列专栏&#xff1a;零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书…