首页 > 编程语言 >模块3 面向对象编程高级 --- 第八章:实现继承

模块3 面向对象编程高级 --- 第八章:实现继承

时间:2024-07-26 15:09:22浏览次数:17  
标签:构造方法 继承 子类 第八章 --- 面向对象编程 抽象类 父类 方法

第八章 实现继承

主要知识点

  1、继承的概念

  2、继承的实现

  3、用this和super关键字实现继承

  4、抽象类的实现

学习目标

  掌握继承和抽象类的定义和实现方法。借助集成,可以扩展原有的代码,应用到其他程序中,而不必要重新编写这些代码。扩展声明的新类称为子类,原有的类称为超类(父类)。继承机制规定,子类可以拥有超类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义超类的方法。

8.1 定义继承

8.1.1 继承的概念

  继承的实体是类而非人。也就是说继承是子类拥有父类的成员。这样不但可以节省程序的开发时间,而且还提高了代码的可重用性。通过继承可以实现代码的重用,被继承的类称为父类或者超类,由集成而得到的类称为子类。

8.1.2 继承的定义方法

  类的继承是通过关键字extends来实现的,在两个类之间建立了继承关系。子类创建的语法格式为:

class subclass-name extends superclass-name{
    // 类体
}

8.2 子类对父类的访问

  当发生继承时,如何判断对象的方法是父类的还是子类的。在Java中有两个非常特殊的变量:this和super,这两个变量在使用前,都不需要声明。this变量在一个成员函数的内部使用,指向当前对象,当前对象指的是当前正在调用执行方法的那个对象。super变量直接指向父类的构造函数,用来引用父类的变量和方法。

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

  在没有明确地指定构造方法时,子类会先调用父类中没有参数的构造方法,以便进行初始化操作。在子类的构造方法中可以通过super()来调用父类特定的构造方法。

  在子类中通过super(name,age);来调用父类的有参构造方法;

  说明:

  (1)在子类中访问父类的构造方法,其格式为:super(参数列表);

  (2)super()可以重载,super()会根据参数的个数与类型,来执行父类相应的构造方法。

  (3)调用父类构造方法的super()语句必须卸载子类构造方法中的第一行;

8.2.2 在子类中访问父类的成员

  如果子类的成员是直接父类继承过来的,,可以通过以下形式访问:

  (1)访问当前对象的数据成员:this.数据成员。

  (2)调用当前对象的成员方法:this.成员方法(参数)。

  其中子类对从父类继承过来的成员属性重新加以定义,称为属性的隐藏。子类对于从父类继承过来的成员方法重新加以定义,称为方法的重写(覆盖)。通过关键字super来指明父类的数据成员和方法,形式跟上面子类很像。

8.3 抽象类

8.3.1 抽象类的概念

  如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。因为抽象概念在问题领域没有对应的具体概念,所以用来表征抽象概念的抽象类是不能实例化的。在面向对象领域中,抽象类主要用来进行类型隐藏,可以构造出一个固定的一组行为的抽象描述,但是这组行为能够有任意个可能的具体实现方法,这个抽象描述就是抽象类。

8.3.2 定义抽象类

  抽象类是以修饰符abstract修饰的类,定义抽象类的语法格式如下:

abstract class 类名{
    声明成员变量;
    返回值的数据类型 方法名(参数表)                  // 一般方法
    {
        ......
    }
    abstract 返回值的数据类型 方法名(参数表);  // 抽象方法
}

  说明:

  (1)由于抽象类是需要被继承的,所以abstract类不能用final来修饰。也就是说,一个类不能既是最终类,又是抽象类,即关键字abstract和final不能同时用;

  (2)抽象类的子类必须实现父类中的所有抽象方法,或者将自己也声明为抽象类。

  (3)抽象类不一定包含抽象方法,但是包含抽象方法的类一定被声明为抽象类。

  (4)一个类被定义为抽象类,则该类就不能用new运算符创建具体实例对象,而必须通过覆盖的方式来实现抽象类中的方法。

习题

一、简单题

  1、实现类的继承是通过哪个关键字实现的?

  2、Java能实现多继承关系吗?如何解决这个问题?

  3、如果父类和子类同时提供了同名方法,在类实例化后,调用的是哪个类的方法?采用什么办法可以避免混淆?

  4、什么是抽象类?抽象类和普通类有什么不同?

二、操作题

  1、定义一个银行卡的类BankCard作为父类,成员属性和成员方法根据实际情况自行确定,然后分别定义万事达卡Master类和维萨卡Visa类作为BankCard的子类,实现他们之间的继承关系。

  2、定义一个表示学习方法的抽象类StudyMethod,其中包括3个抽象方法,分别是学习英语English、学习语文Chinese、学习计算机Computer,写出此抽象方法的代码。

标签:构造方法,继承,子类,第八章,---,面向对象编程,抽象类,父类,方法
From: https://www.cnblogs.com/kuangmeng/p/18322530

相关文章

  • Pag动画:umi+libpag+copy-webpack-plugin实现及问题解决
    1、package.json添加如下,安装依赖:"libpag":"^4.2.84","copy-webpack-plugin":"9.1.0",为什么是写死的旧版本,后面解释2、使用的方法,这里只是一个小示例,具体如何使用看个人(这里主要是想记录过程中出现的问题及解决方式): constinit=async()=>{   constPag......
  • 为什么演员评论家的演员损失乘以-1?
    https://www.tensorflow.org/tutorials/reinforcement_learning/actor_critic#3_the_actor-critic_loss在Actor-Critic方法的TensorFlow指南中,actor损失使用以下公式计算:advantage=returns-valuesaction_log_probs=tf.math.log(action_probs)actor_los......
  • 【开源所有代码-全在线智能音箱】树莓派智能音箱,自定义唤醒词,大模型LLM GPT对话
    安装sounddevicepipinstallsounddevice安装portAudiosudoapt-getinstalllibportaudio2sudoapt-getinstalllibasound-devsudoapt-getinstallportaudio.devsudoapt-getinstallpython3-pyaudiopipinstallpyaudio安装wavepipinstallwave......
  • 2024-07-26 定义一个vue组件,并使用双向绑定该组件的值
    我写了一个input组件(vue3)<template><div><inputclass="inp":value="modelValue"@input="$emit('update:modelValue',$event.target.value)"/></div></template&......
  • X-Frame-Options may only be set via an HTTP header sent along with a documen
    X-Frame-OptionsmayonlybesetviaanHTTPheadersentalongwithadocumen_百度搜索(baidu.com)X-Frame-Options-盼星星盼太阳-博客园(cnblogs.com)vue项目中iframe嵌套其他项目,iframe父子页面传值-盼星星盼太阳-博客园(cnblogs.com)......
  • 可以捕捉高动态范围成像的的AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CS
    AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CSSC18SMEA0-DPBR图像传感器——明佳达1、AR0521SR2C09SURA0-DP2是一款1/2.5英寸CMOS数字图像传感器,带有2592(H)×1944(V)有效像素阵列。它能在线性或高动态范围模式下捕捉图像,且带有卷帘快门读取,其中包含了复杂......
  • sqlserver --日常使用脚本
    ----------------------------------------------------------------------------------------------------------Description:sqlserver常用脚本:--------------------------------------------------------------------------------------------------------SELECTT.text,P.q......
  • 运行 Spark-Shell 程序时出现错误
    我正在尝试创建SparkShell程序,但在运行时出现错误。下面是我正在执行的代码。frompyspark.sqlimport*frompysparkimportSparkConffromlib.loggerimportLog4j#conf=SparkConf()#conf.set("spark.executor.extraJavaOptions","-Dlog4j.configuration=f......
  • XYCTF-MISC
     一.真>签到直接拖到010  XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba} 二.熊博士这一题直接拖进随波逐流一键解码CBXGU{ORF_BV_NVR_BLF_CRZL_QQ}xyctf{liu_ye_mei_you_xiao_jj}三.出题有点烦需要密码  爆破出来了  解码密码:123456......
  • ansible-playbook
    ansible-playbook执行脚本,并输出到控制台-name:Deploynginxlogrotate.shandprinttheresulthosts:allbecome:yes#如果需要以root权限执行命令,则需要这一行tasks:-name:Deploylogrotate.shscript:/home/xxx/nginxLograte/deploy_nginxlogra......