Java学习之继承二细节(学习重点)

news2024/9/25 1:25:57

目录

 继承细节

第一条

父类代码

子类代码

测试代码

运行结果

 第二条

第三条

第三条-1

第三条-2

 第四条

一、调用父类Base的无参构造器

 二、一个参数的构造器

 三、两个参数的构造器

 第五条

第六条

第七条

 第八条

 第九条

 第十条


 继承细节

第一条


子类继承了父类所有的属性和方法,但是私有属性不能在子类直接访问,要通过父类的public方法去访问

父类代码

package com.hspedu.entends_;

public class Base {//父类
    //四个属性,四个访问修饰符
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    //父类提供一个public方法,用于在子类访问父类中的private属性
    public int getN4() {
        return n4;
    }

    //默认的无参构造器
    public Base() {
        System.out.println("Base()....");
    }
    //四个方法,访问修饰符对应四个属性
    public void test100(){
        System.out.println("test100");
    }
    protected void test200(){
        System.out.println("test200");
    }
    void test300(){
        System.out.println("test300");
    }
    private void test400(){
        System.out.println("test400");
    }
    //父类提供一个public方法,用于在子类访问父类中的private方法
    public void callTest400(){
        test400();
    }

}

子类代码

package com.hspedu.entends_;

public class Sub extends Base{
    //子类独有的两个方法

    public Sub() {
        System.out.println("Sub()....");
    }
    public void sayOk(){
        //除了private属性和方法之外都可以访问
        System.out.println("n1=" + n1 + " n2=" + n2 + " n3=" + n3);
        test100();
        test200();
        test300();
        //通过父类的public方法访问private属性和方法
        System.out.println("n4=" + getN4());
        callTest400();
    }


}

在子类Sub类中不能直接访问父类Base中的private修饰的属性和方法(n4和方法test400())

解决办法:在父类中创建public方法,然后在子类中调用该方法

eg1:在Base中创建 getN4()

 在Sub中调用

 eg2:在Base中创建callTest400()

 在sub中调用

测试代码

package com.hspedu.entends_;

public class ExtendsDetail {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.sayOk();
    }
}

运行结果

 第二条

子类必须调用父类的构造器, 完成父类的初始化

tips:当我们在新建一个对象时,这个对象所在的类的构造器就会被调用

上述代码的运行结果

 可以看到:因为我们新建了一个Sub类对象,所以子类Sub的构造器被调用,同时还会首先调用子类Sub的父类Base的构造器(语法:super()

第三条

第三条-1

当创建子类对象时, 不管使用子类的哪个构造器, 默认情况下总会去调用父类的无参构造器

eg:

子类

package com.hspedu.entends_;

public class Sub extends Base{
    
    public Sub() {
        System.out.println("子类Sub()构造器被调用....");
    }

    //当创建子类对象时, 不管使用子类的哪个构造器, 默认情况下总会去调用父类的无参构造器
    public Sub(String name) {
        System.out.println("子类Sub()构造器被调用....");
    }

 父类

package com.hspedu.entends_;

public class Base {//父类   
   
    public Base() {
        System.out.println("父类Base()构造器被调用....");
    }

运行测试 

package com.hspedu.entends_;

public class ExtendsDetail {
    public static void main(String[] args) {
        System.out.println("====创建第一个Sub对象====");
        Sub sub = new Sub();
     
        System.out.println("====创建第二个Sub对象====");
        Sub sub1 = new Sub("karry");
    }
}

运行结果

 总结:两个Sub对象,一个调用Sub()无参构造器,一个调用Sub(String name)构造器,同时两个对象都会首先调用父类的无参构造器

第三条-2

 如果父类没有提供无参构造器, 则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作, 否则, 编译不会通过

eg:

第一步:在Base中写一个有参构造器,覆盖了默认的无参构造器(此时子类中的构造器会报错)

 

There is no default constructor available in 'com.hspedu.entends_.Base':在父类Base中没有可用的默认构造器

第二步:解决方法,在子类Sub的构造器中指定父类Base的构造器

 将super("smith", 10);和super("karry",23);传参给父类中的Base(String name, int age)构造器,这个构造器就会被调用

第三步:为了更好理解,在父类的有参构造器中输出传入的参数

 运行结果

 第四条

如果希望指定去调用父类的某个构造器, 则显式的调用一下 : super(参数列表),类似上述例子中的super("smith", 10);

例子:父类有三个构造器:默认的无参构造器、两个参数的构造器、一个参数的构造器

public Base() {
        System.out.println("父类Base()构造器被调用....");
    }

    //有参构造器(两个参数的构造器)
    public Base(String name, int age){
        System.out.println("父类Base(String name, int age)构造器被调用...");
        System.out.println("name=" + name + " age=" + age);
    }
    //有参构造器(一个参数的构造器)
    public Base(String name){
        System.out.println("父类Base(String name)构造器被调用...");
        System.out.println("name=" + name);
    }

在子类里依次调用这个三个构造器


一、调用父类Base的无参构造器


1).什么都不写,系统默认会调用, 2).super();

 public Sub(String name,int age){
        //一、调用父类Base的无参构造器,有两种方法
        //1).什么都不写,系统默认会调用,2).super()
        super();
        System.out.println("子类Sub(String name,int age)构造器被调用");
    }

 结果

 二、一个参数的构造器

public Sub(String name,int age){
        
        //二、调用父类的一个参数的构造器
        super("ada");
      
        System.out.println("子类Sub(String name,int age)构造器被调用");
    }

 结果

 三、两个参数的构造器

public Sub(String name,int age){
       
        //三、调用父类两个参数的构造器
        super("ada",37);
        System.out.println("子类Sub(String name,int age)构造器被调用");
    }

 

 第五条

super 在使用时, 必须放在构造器第一行(super 只能在构造器中使用)
放在第二行时,IDEA会提示错误

 Call to 'super()' must be first statement in constructor body:super()必须在构造器的第一行

原因:一定是先执行完父类的构造器,再来执行子类的构造器(先有爸爸再有儿子)

第六条

super() 和 this() 都只能放在构造器第一行, 因此这两个方法不能共存在一个构造器


第七条

java 所有类都是 Object 类的子类, Object 是所有类的基类、超类
查看一个类的层级关系 ctrl + H

 

 第八条

父类构造器的调用不限于直接父类! 将一直往上追溯直到 Object 类(顶级父类)
继承自Object类是不用写明的,是隐藏的

构造器执行顺序 Object----->祖父类----->父类----->子类

创建一个TopBase类,让Base类继承TopBase

package com.hspedu.entends_;

public class TopBase {
    public TopBase() {
        System.out.println("TopBase()构造器被调用");
    }
}

此时在创建新的子类Sub的对象时,会追溯到Object类的构造器(什么都不输出)

 运行

 第九条

子类最多只能继承一个父类(指直接继承), 即 java 中是单继承机制。

Q:如何让A同时继承B和C?

A:A继承B,B继承C


 第十条

不能滥用继承, 子类和父类之间必须满足 is-a 的逻辑关系

Person is a Music? 答案是No,所以不能用继承

Cat is a Animal?  答案是Yes,所以不能用继承

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

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

相关文章

用DIV+CSS技术设计的美食主题网站(web前端网页制作课作业)美食餐饮网站设计与实现(HTML+CSS+JavaScript)

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

ImmunoChemistry艾美捷总细胞毒性试验试剂盒方案

ImmunoChemistry艾美捷总细胞毒性试验试剂盒是一种单管三色试验,用于定量评估细胞凋亡和坏死引起的细胞介导的细胞溶解活性。该试验采用绿色荧光细胞染色剂CFSE标记靶细胞,红色活/死活力染料7-AAD用于识别细胞毒性试验样品中存在的死细胞,橙红…

【前端验证】fork-join_none线程立即执行的一次代码优化记录

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵! 前言 【system verilog】fork-join_none与循环语句共同使用的行为探究 很早之前写过关于fork-join_none的探究文章,最近被人指出了一些错误: 我仔细理解了下他的意思,觉得确实…

电容笔和触控笔有什么区别?平价好用的电容笔排行榜

从导电材料、作用机理、用途等方面来看,电容笔与一般的触摸笔有很大区别。电容笔的笔头设计为中等大小,笔头材料通常更耐磨损。随着技术的发展,人们的生活水平越来越高,人们都想要一支更好用的电容笔,不管是图纸绘画&a…

Java真的不难(五十一)SpringBoot使用EasyExcel实现导出

EasyExcel: 大家好久不见! 一、什么是EasyExcel? EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档地址&#xf…

MAC安装redis的简单方法

使用mac的包管理工具brew一行命令搞定安装。若未安装brew,命令行先输入以下命令安装brew。 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" brew install redis6.2 brew services restart redis6.2 一、安装…

三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot【保姆级】

一、前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。 redis有两种高可用的方案: High availability with Redis Sentinel(哨兵)Scaling with Redis Cluster&…

FT 在图像处理中的应用

接上文:离散傅里叶变换(DFT) 四、二维傅里叶变换 在此之前,文章都是对 FT 的理论部分的科普推导,距离我们的实际应用还有一定距离 虽然之前提到函数时域时,都是默认我们以时间 t 作为自变量,但事实上自变量也可以是其…

小册上新 | 掌握 SpringBoot 场景整合,成为开发多面手!

只会 SpringBoot 还远远不够 SpringBoot 的强大不言而喻,其底层 SpringFramework 强大的 IOC 容器和 AOP 机制,加之 SpringBoot 的自动装配,使得 SpringBoot 成为当今 JavaEE 开发中最受欢迎,以及使用范围极其广泛的基本技术。 …

[附源码]计算机毕业设计JAVA领导干部听课评课管理系统

[附源码]计算机毕业设计JAVA领导干部听课评课管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM…

设计模式之美——DRY原则 和 迪米特法则

DRY原则 Don’t Repeat Yourself。中文直译为:不要重复自己。即,不要写重复的代码。 我们主要讲三种典型的代码重复情况:实现逻辑重复、功能语义重复和代码执行重复。 实现逻辑重复 public class UserAuthenticator {public void authenti…

Web(二)html5基础-表格高级样式的设置

第1关_表格高级样式设置相关概念 第2关_设置表格的外边框样式 编程要求 根据提示,在右侧编辑器补充代码,在右侧编辑器中的Begin - End区域内补充代码,具体要求是: 1.添加table标签及属性,使得表格的宽度为100&#x…

CAS号:81075-03-8,H2N-AYA-OH

血管紧张素-1转换酶抑制剂(IC₅₀14.2 μM)Ala-Tyr已作为酪氨酸源应用于大鼠静脉营养。二肽AY是肝衰竭患者肠外营养的有效Tyr来源。 Inhibitor of angiotensin-1 converting enzyme (ACE), IC₅₀ 14.2 μM. Ala-Tyr has been used as a tyrosine source in intravenous nutrit…

设置ZIP文件打开密码的两种方法

使用WinRAR缩包ZIP文件时,有两种方式来设置打开密码,我们可以根据不同需要选择不同的方法。 方法一: 在压缩文件的时候同时设置打开密码,只设置当下压缩的ZIP文件。 首先,鼠标选择需要压缩的文件,然后点…

推荐一个基于Springboot + Vue 开发的前后端分离博客

基于Springboot Vue 开发的前后端分离博客 博客介绍 本博客是参考 [风丶宇] 大佬的博客更新而成,感谢大佬提供的页面,然后定制新增部分功能,是个非常值得新手入门学习的Java规范化编程案例! 在线地址 项目链接: h…

【附源码】计算机毕业设计JAVA忆居民宿管理

【附源码】计算机毕业设计JAVA忆居民宿管理 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

Yolov4 训练数据常见的问题

1.Failed to load module"canberra-gtk-module" 解决办法:安装对应的module sudo apt-get install libcanberra-gtk-module 2.Killed 注意:造成killed问题的可能性比较多,这里我只记录我是如何解决的 。 解决: 首先是…

膜拜,华为内部都在强推的783页大数据处理系统:Hadoop源代码pdf

前言 都说程序员工资高、待遇好, 2022 金九银十到了,你的小目标是 30K、40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算难。然而,提升…

数据结构和常用排序算法复杂度

1.顺序表 插入操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数n/2 删除操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数(n-1)/2 按值查找时间复杂度 最好O(1),最坏O(n),平…

数据库DQL数据查询语言

文章目录DQL数据查询语言语法:基础查询语法:WHERE子句使用AND"与"和OR"或"来连接多个条件进行查询IN(列表):等于列表其中之一(在列表中)NOT IN(列表):不在列表中,不能等于列表中的所有项BETWEEN...AND...:在一个范围之内DISTINCT去重操作。在结…