JAVASE的全面总结

news2024/11/29 12:46:06

(未完待续)

五、子类与继承

5.1 子类与父类

继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。

Java不支持多重继承(子类只能有一个父类)。

5.1.1 声明子类

使用关键字extends来定义一个类的子类,格式如下:            

class 子类名  extends  父类名 {      

           …        

  }

例如:            

class Student extends People {  

              …        

 }   

 说明:把Student类定义为People类的子类、People类是Student类的父类

5.1.2 类的树形结构

Java的类按继承关系形成树形结构这个树形结构中,根节点是Object类(Object是java.lang包中的类),即Object是所有类的祖先类。

除了Object类,每个类都有且仅有一个父类,一个类可以有多个或零个子类。如果一个类(除了Object类)的声明中没有使用extends关键字,这个类被系统默认为是Object的子类,即类声明“class A”与“class A extends Object”是等同的。

 5.2 子类的继承性

  类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。  

所谓子类继承父类的成员变量就是把继承来的变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作。  

所谓子类继承父类的方法就是把继承来的方法作为子类中的一个方法,就好象它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。

class Father{
    float weight,height;
    String head;
    void speak(String s){
        System.out.println(s)

    }

}

class Son extends Father{
    String head,foot;

}

Son s = new Son();

5.2.1 子类和父类在同一包中的继承性

如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。

下面的例子1中有4个类:People,Student.java,UniverStudent.java和Example5_1,这些类都没有包名(需要分别打开文本编辑器编写、保存这些类的源文件,比如保存到C:\ch5目录中),其中UniverStudent类是Student的子类,Student是People的子类。程序运行效果如图5.1。

 

package Example5_1;

public class People {
    int age,leg = 2,head = 2;
    protected void showPeopleMess(){
        System.out.printf("%d岁,%d腿,%d头",age,leg,head);
    }
}

 

package Example5_1;

public class Student extends People{
    int number;
    public void tellNumber(){
        System.out.printf("%d\t",number);
    }
    int add(int x,int y){
        return x+y;
    }
}
package Example5_1;
public class University extends Student{
    int multi(int x,int y){
        return x*y;
    }
}
package Example5_1;
public class Example5_1 {
    public static void main(String args[]){
        Student zhang = new Student();
        zhang.age = 21;
        zhang.head = 1;
        zhang.leg = 2;
        zhang.number = 1312;
        zhang.tellNumber();
        University kong = new University();
        kong.age = 22;
        kong.head = 1;
        kong.leg = 2;
        kong.number = 1314;
        System.out.println("kong可以做加法运算"+kong.add(10,2));
        System.out.println("kong可以做乘法"+kong.multi(10,2));
    }

}

5.2.2   子类和父类不在同一包中的继承性

如果子类和父类不在同一个包中,那么,子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法,继承的成员或方法的访问权限保持不变。

5.2.3  继承关系(GENERALIZATION)的UML图 

如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。

 5.3  子类与对象

类继承了父类的很多东西,那么子类在创建对象的时候,他又是怎么生成自己的对象的呢。子类生产的对象会有哪些东西呢。

//例题:子类的继承
class Father 
{  float weight,height;
    String head;
    void speak(String s)
    {  System.out.println(s);
    }
}
class Son extends Father 
{   String hand,foot;
}
 
   Son s=new Son();

 5.3.1 子类对象的生成

子类创建对象时,子类的构造方法总是先调用父类的某个构造方法,完成父类部分的创建;然后再调用子类自己的构造方法,完成子类部分的创建。如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法 。

子类在创建一个子类对象时,不仅子类中声明的成员变量被分配了内存,而且父类的所有的成员变量也都分配了内存空间,但子类只能操作继承的那部分成员变量 。

子类可以通过继承的方法来操作子类未继承的变量和方法 .

 例子2中,子类ChinaPeople的对象调用继承的方法操作未被子类继承却分配了内存空间的变量。程序运行效果如图5.3。

 

package Example5_2;
class People{
    private int averHeight = 166;
    public int getAverHeight(){
        return averHeight;
    }
}
class ChinaPeople extends People{
    int height;
    void setHeight(int h){
        height = h;
    }
    public int getheight(){
        return height;
    }
}
public class EXample5_2 {
    public  static void main(String args[]){
        ChinaPeople zhangsan = new ChinaPeople();
        System.out.println("子类未继承的averHeight是"+zhangsan.getAverHeight());
        zhangsan.setHeight(20);
        System.out.println("子类的实例变量的值是"+zhangsan.height);
        System.out.println("子类的实例变量的值是"+zhangsan.getheight());
    }

}

结论

1)创建子类对象时,子类总是按层次结构从上到下的顺序调用所有超类的构造函数。

2)如果父类没有不带参数的构造方法,则在子类的构造方法中必须明确的告诉调用父类的某个带参数的构造方法,通过super关键字,这条语句还必须出现在构造方法的第一句。

 5.3.2  关于INSTANCEOF运算符

instanceof运算符是Java独有的双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时,instanceof运算的结果是true,否则是false 。请看例题。

class Test
{   String s; 
     Test()
     {   stu  s=new String(); 
          if(s instanceof String)
          { System.out.println(“YES”);
           }
     }   
}

5.4   成员变量的隐藏和方法重写

5.4.1  成员变量的隐藏

对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。

在子类中要操作这个与父类同名的成员变量时,子类操作的是子类重新声明的这个成员变量。而不是被隐藏掉的。,

例子3(Example5_3.java)中,Goods类有一个名字为weight的double型成员变量,本来子类CheapGoods可以继承这个成员变量,但是子类CheapGoods又重新声明了一个int型的名字为weight的成员变量.程序运行效果如图5.4 

 

package Example5_3;

public class Goods {
    public double weight;
    public void oldSetweight(double w){
        weight = w;
        System.out.println("double型的weight="+weight);
    }
    public double getWeight(){
        return weight;
    }
    public double oldGetprice(){
        double price = weight * 10;
        return price;
    }
}
package Example5_3;

public class CheapGoods extends Goods{
    public int weight;
    public void newSetweight(int w){
        weight = w;
        System.out.println("int型的weight是"+weight);
    }
    public double newGetPrice(){
        double price = weight * 10;
        return price;
    }
}
package Example5_3;

public class Example5_3 {
    public static void main(String args[]){
        CheapGoods cheapgoods = new CheapGoods();
        cheapgoods.newSetweight(198);
        System.out.println("对象cheapgoods的weight的值是:"+cheapgoods.weight);
        System.out.println("对象cheapgoods的价格是:"+cheapgoods.newGetPrice());
        cheapgoods.oldSetweight(100.74);//利用子类对象调用继承的方法操作隐藏的double型变量weight
        System.out.println("使用老的方法计算出的价格是:"+cheapgoods.oldGetprice());
    }
}

 

5.4.2    方法重写(OVERRIDE)

同样,子类通过重写可以隐藏已继承的实例方法。

1.重写的语法规则 如果子类继承了父类的实例方法,那么子类就有权利重写这个方法。 方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或是父类方法的类型的子类型,且这个方法的名字、参数个数、参数的类型和父类的方法完全相同.  

2.重写的目的 子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。

3.  重写后方法的调用 子类创建的一个对象,如果子类重写了父类的方法,则运行时系统调用的是子类重写的方法; 子类创建的一个对象,如果子类未重写父类的方法,则运行时系统调用的是子类继承的方法;

4.重写的注意事项 重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限(访问限制修饰符按访问权限从高到低的排列顺序是:public、protected、友好的、private。)

 

 

package EXample5_4;
public class University {
    void enterRule(double math,double chinese,double english){
        double avrScore = (math + chinese + english)/3;
        if(avrScore >= 60){
            System.out.println(avrScore+"达到相应的要求");
        }
        else System.out.println(avrScore+"未达到相应的要求");
    }
}
package EXample5_4;

public class ImportantUniversity {
    public void enterrule(double math,double chinese,double english){
        double avrScore =(math + chinese + english)/3;
        if(avrScore >= 73) System.out.println(avrScore+"通过了重点大学的录取的分数线");
        else System.out.println(avrScore+"未通过重点大学的录取的分数线");
    }
}

 

package EXample5_4;

public class Example5_4 {
    public static void main(String args[]){
        ImportantUniversity zhangsan = new ImportantUniversity();
        zhangsan.enterrule(50,100,120);
    }
}

 

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

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

相关文章

golang - switch

switch 的使用 switch 语句用于基于不同条件执行不同操作,,直每一个 case 分支都是唯一的,从上到下逐一测试到匹配为止匹配项后面也不需要再加 break switch 表达式 {case 表达式1, 表达式2, ... :语句块1case 表达式2, 表达式3, ... :语句块…

Linux LD链接器 -静、动库编译or链接

文章目录 程序链接动态链接静态链接 目标文件链接打包为动态打包为静态总结 动态链接- 动态链接:在运行、加载时,在内存中完成链接的过程- 动态共享库:用于动态链接的系统库、特性是可以加载无需重定位的代码 got表(Global Offset Table)延时…

SpringBoot核心配置全面总结

目录 1、application. properties核心文件 2、 application.yml配置文件(推荐配置风格) 3、SpringBoot多环境配置 4、SpringBoot自定义配置 1)Value注解 2) ConfigurationProperties 5. 远程配置中心(目前生产…

http协议(一)/应用层

学习目标:⭐理解应用层的作用,理解协议,理解序列化和反序列化,并且实现网络版计算器⭐HTTP协议。⭐手写一个简单的http协议。 应用层 我们写的一个个解决实际问题, 满足我们日常需求的网络程序, 都是在应用层。 协议/序列化与反…

第三节:支持向量机分类预测

0、介绍 监督学习(英语:Supervised learning)是机器学习中最为常见、应用最为广泛的分支之一。本次实验将带你了解监督学习中运用十分广泛的支持向量机,并学会使用 scikit-learn 来构建预测模型,用于解决实际问题。 知…

都什么年代了,还在用Excel和ACCESS做应用系统?快来学Eversheet

表格用的越久,就越头疼 稍微有规模的企业,各种表格都会多如牛毛,一堆堆的,有时候这里一张,那里一张,容易整乱,更容易丢失。不管你是用WPS还是用Excel,有些问题你还是依旧解决不了。…

【VM服务管家】VM4.x算法模块开发_4.1 开发配置类

目录 4.1.1 算法开发:算法模块的开发流程4.1.2 参数操作:获取与设置模块参数的方法4.1.3 文件交互:文件交互操作的配置方法4.1.4 输出显示:设置输出并显示在VM界面的方法4.1.5 模板配置:模板配置界面的实现方法4.1.6 命…

中文译英文 模型

Helsinki-NLP/opus-mt-zh-en Hugging FaceWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://huggingface.co/Helsinki-NLP/opus-mt-zh-en?text%E6%88%91%E5%8F%AB%E6%B2%83%E5%B0%94%E5%A4%AB%E5%86%8…

【Java入门合集】第一章Java概述

【Java入门合集】第一章Java概述 博主:命运之光 专栏:JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念; 2.掌握Java开发环境的搭建,环境变量的配置; 3.掌握Java程序的编写、编译和运行; 4.学会编写第一个Java程序&#x…

Python 科研绘图可视化(后处理)Matplotlib - RGBAxes

Introduction 科研可视化是将数据和信息转化为可视化形式的过程,旨在通过图形化展示数据和信息,使得科研工作者能够更好地理解和分析数据,并从中发现新的知识和洞见。科研可视化可以应用于各种领域,如生物学、物理学、计算机科学…

一文带你入门C++类和对象【十万字详解,一篇足够了】

本文字数较多,建议电脑端访问。不多废话,正文开始 文章目录 ———————————————【类和对象 筑基篇】 ———————————————一、前言二、面向过程与面向对象三、结构体与类1、C中结构体的变化2、C中结构体的具体使用3、结构体 --&…

3.6 Linux shell脚本编程(概念、变量、语句)

目录 shell脚本概述 shell脚本编写步骤 第一个shell脚本文件 shell脚本变量 变量的介绍 变量的作用 变量的命名要求 变量的分类 用户自定义变量 取值 用户自定义变量-数组 只读变量 位置变量与预定义变量 环境变量 shell语句 shell程序 说明性语句&#xff08…

MATLAB连续时间信号的实现和时域基本运算(八)

1、实验目的: 1)熟悉常用连续时间信号的实现方法; 2)掌握连续时间信号的时域基本运算; 3)掌握实现基本函数及其运算的函数的使用方法; 4)加深对信号基本运算的理解。 2、实验内容&am…

【VM服务管家】VM4.0平台SDK_2.4 结果获取类

目录 2.4.1 数据结果:通过流程输出或模块输出获取数据结果的方法2.4.2 流程运行:所有流程运行结束的回调方法2.4.3 模块回调:所有模块运行结束的回调方法2.4.4 加密狗回调:获取加密狗状态的回调方法2.4.5 方案加载:方案…

STM32物联网实战开发(4)——基本定时器

我使用的是正点原子的阿波罗F429开发板,他有14个定时器,本次实验使用STM32F429的基本定时器6作定时,在中断中每隔1秒翻转LED电平状态。 1.CubeMX初始化定时器 先开启定时器6 再对定时器6的参数进行配置,将定时器6定时时间配置为…

记一次SSRF漏洞的学习和利用

导语:本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。 1.前言 本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。此漏洞并结合腾讯云的API接口,可以获取大量嘶吼服务器的敏感信息。利用这些敏感信息,又…

阿里测试8年,肝到P8只剩他了····

在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记…

玩转ChatGPT提示词 持续更新·······

导语: 众所周知,在AI的世界里,提示词就是和AI沟通语言的桥梁,提示关键词常用于AI对话及AI绘画等相关场景,通过准确的使用关键词,你就能更好的让AI辅助自己的工作,其中的成分重要性不言而喻&…

黑客教程,从零基础入门到精通

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

c++标准模板(STL)(std::array)(三)

定义于头文件 <array> template< class T, std::size_t N > struct array;(C11 起 std::array 是封装固定大小数组的容器。 此容器是一个聚合类型&#xff0c;其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组…