Java 基础(继承)

news2024/11/18 13:28:33

继承

  • 基础
    • 1. 继承的特点
    • 2. super关键字
    • 3. 继承中变量访问特点(就近原则)
    • 4. 继承中成员方法访问特点
    • 5. 继承中构造访问特点
      • 为什么子类中所有构造方法默认都会访问父类无参构造方法。
      • 如果父类中没有无参构造
    • 6. 重写
      • 概述
      • 应用
      • 注意事项
      • 方法重写和重载有什么区别?
    • 7. 静态代码块、构造代码块,构造方法的执行顺序
  • 面试题
    • 面试题1:变量访问原则 - 就近原则
    • 面试题2:一个类的静态代码块,构造代码块,构造方法的执行流程
    • 面试题3
    • 面试题4:一个类同时继承了一个类和一个接口,如果类和接口内有相同的方法,调用优先级

基础

1. 继承的特点

Java只支持单继承,不支持多继承。

2. super关键字

super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)

super和this的用法相似。
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。
在这里插入图片描述

3. 继承中变量访问特点(就近原则)

在子类方法中访问一个变量
子类局部范围查找
子类成员范围查找
父类成员范围查找
如果都没有就报错(不考虑父亲的父亲)

4. 继承中成员方法访问特点

子类成员范围查找
父类成员范围查找
如果都没有就报错(不考虑父亲的父亲)

5. 继承中构造访问特点

子类中所有构造方法默认都会访问父类无参构造方法。

为什么子类中所有构造方法默认都会访问父类无参构造方法。

因为子类会继承父类中的数据,可能还会使用父类中的数据,因此,子类初始化前,会先初始化父类。

如果父类中没有无参构造

可以通过super关键字显式调用父类有参构造,或父类添加无参构造

6. 重写

概述

子类中出现与父类一模一样的方法时(除了权限修饰符,权限修饰符大于等于不包括private,返回值类型,方法名和参数列表相同),会出现覆盖操作,称为重写

应用

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。

注意事项

私有方法不能被重写(父类私有成员子类不能继承)
子类方法权限修饰符大于等于父类(public>默认>私有)

方法重写和重载有什么区别?

方法的重写用在子类方法与父类方法一模一样时,除权限修饰符,返回值类型,方法名和参数列表都是相同的。
重载用在同一个类中各方法方法名相同,参数列表不同(与返回值类型没有关系)的情况。

7. 静态代码块、构造代码块,构造方法的执行顺序

父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法

面试题

面试题1:变量访问原则 - 就近原则

class Fu {
    public int num = 10;
    public Fu() {
        System.out.println("fu");
    }
}

class Zi extends Fu {
    public int num = 20;
    public Zi() {
        System.out.println("zi");
    }
    public void show() {
        int num = 30;
        System.out.println(num); //30
        System.out.println(this.num); //20
        System.out.println(super.num); //10
    }
}
class ExtendsTest {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}
 fu
 zi
 30
 20
 10

知识点:子类的所有构造方法执行前默认先执行父类的无参构造方法
知识点:访问成员变量的原则:就近原则(子类局部>子类成员>父类成员)。
this和super指向
this - 访问本类的成员
super - 访问父类的成员(可以理解为的)

面试题2:一个类的静态代码块,构造代码块,构造方法的执行流程

class Fu {
    static {
        System.out.println("静态代码块Fu");
    }

    {
        System.out.println("构造代码块Fu");
    }

    public Fu() {
        System.out.println("构造方法Fu");
    }
}

class Zi extends Fu {
    static {
        System.out.println("静态代码块Zi");
    }

    {
        System.out.println("构造代码块Zi");
    }

    public Zi() {
        System.out.println("构造方法Zi");
    }
}

class ExtendsTest2 {
    public static void main(String[] args) {
        Zi z = new Zi();
    }
}
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi

一个类的静态代码块,构造代码块,构造方法的执行流程
静态代码块 > 构造代码块 > 构造方法
父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法

解析

静态的内容是随着类的加载而加载:静态代码块的内容会优先执行。
构造代码块:在类中方法外出现(即在类中的成员位置),可以把多个构造方法方法中相同的代码存放到一起,用于对对象进行初始化。每次调用构造方法都执行,并且在构造方法前执行。
子类的所有的构造方法默认都会去访问父类的无参构造方法。

面试题3

class X {
    //成员变量(引用类型)
    Y b = new Y();
    //无参构造方法
    X() {
        System.out.print("X");
    }
}

class Y {
    //无参构造方法
    Y() {
        System.out.print("Y");
    }
}

public class Z extends X {
    //成员变量(引用类型)
    Y y = new Y();
    //无参构造方法
    Z() {
        //super(); //它仅仅表示要先初始化父类数据,再初始化子类数据。
        System.out.print("Z");
    }
    public static void main(String[] args) {
        new Z();
    }
}
 YXYZ

知识点:一个类的初始化过程
Student t = new Student();
创建一个对象都在内存中做了什么事情?

  1. 先将硬盘上指定位置的Student.class文件加载进内存。
  2. 执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量t。
  3. 在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
  4. 在该实体空间中进行属性的空间分配,并进行了默认初始化。
  5. 对空间中的属性进行显示初始化。
  6. 进行实体的构造代码块初始化。
  7. 调用该实体对应的构造函数,进行构造函数初始化。
  8. 将首地址赋值给t,t变量就引用了该实体。(指向了该对象)
    知识点:子父类的初始化过程
    先进行父类初始化,然后进行子类初始化。

面试题4:一个类同时继承了一个类和一个接口,如果类和接口内有相同的方法,调用优先级

public interface A {
    default void show(){
        System.out.println("接口的方法");
    }
}
public class B {
   public void show(){
       System.out.println("优先调用类的方法");
   }
}
public class Test extends B implements A{
    public static void main(String[] args) {
        Test t = new Test();
        t.show();  //调用类的方法
    }
}

如果一个类同时继承了一个类和一个接口,如果类和接口内有相同的方法,那么创建对象调用的时候,会优先使用类的方法。如果子类重写,使用子类的方法

来源:https://www.runoob.com/w3cnote/java-extends.html
面试题来源:https://www.cnblogs.com/chenmingjun/p/8449506.html
一个类的初始化过程:https://blog.csdn.net/weixin_42638178/article/details/115805522

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

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

相关文章

ssm的校园单车自行车租赁系统|租车系统计算机专业毕业论文java毕业设计开题报告

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssm的校园单车租赁系统》该项目采用技术:jsp springmvcspringmybatis cssjs等相关技术,前端页面使用了EasyUI框架&#…

【Redis】分布式锁基础

1. 集群下的线程并发安全问题 当项目形成集群时,每个 JVM 有一个锁监视器,这些锁监视器彼此间不互通,因此会出现集群下的线程并发安全问题,如下图所示: 2. 分布式锁 分布式锁是解决集群下的线程安全问题的方案&#…

Google Earth Engine(GEE)——image.select(...).rgbToHsv is not a function

本错误涵盖了好多错误,主要的原因就是函数不明确,不知道如何使用,以及函数的参数的设定,所以这里大家要先去看函数,另外,最主要的问题就是影像集合和影像要区分开,否则就会出现xxx is nor a function。这里我们用要注意!!! 提示: Line 9: image.select(...).rgbTo…

YApi跨域插件cross-request无法使用的解决方案

cross-request遇到的问题 最近在使用cross-request插件会收到一些报错信息: Manifest version 2 is deprecated, and support will be removed in 2023. See https://developer.chrome.com/blog/mv2-transition/ for more details. 以上信息是说Google推出了Man…

ADI的DSP开发软件:CCES软件的使用说明(很早期写的一点心得)

CCES 是 ADI 最新的 DSP 开发环境,全称是 Cross Core Embedded Studio,我从 2012 年的1.0.1 版开始使用,也曾经写过一个非常详细的软件安装文档,现在来详细的说一说 CCES 软件的使用操作。下面是我列出来的标题,一个一…

点成分享 | 为什么动物细胞培养大都需要二氧化碳培养箱

在进行动物细胞体外培养的过程中,培养条件苛刻,仅在环境因素方面除了要有严格的无菌环境、适合的温度、渗透压、相对湿度等,维持细胞周围的气体环境和pH稳定也十分重要。 动物细胞的体外培养需要理想的气体环境和适宜的pH环境。众所周知&…

Python中的type和object详解

这篇博客主要描述Python的新风格对象(new-style objects)&#xff0c;如下&#xff1a; <type type>和<type object>分别是什么&#xff1f;用户自定义的类和实例之间是怎么联系的&#xff1f;它们和内置类型又是怎么联系的&#xff1f;什么是元类(metaclasses)&a…

npm安装慢 ,卡在sill idealTree buildDeps不动

先说结论&#xff1a;node的默认镜像是国外的&#xff0c;修改镜像为国内地址。 报错截图&#xff1a; Failed to check for updates&#xff0c;开始以为是版本问题&#xff0c;并没有理会&#xff0c;直接创建项目&#xff0c;结果卡在了sill idealTree buildDeps&#xff08…

有关于torch.autograd.grad

torch.autograd模块给用户提供了一个自定义求导的接口。torch.autograd.grad可以手动地将loss对某部分参数进行梯度求导&#xff0c;特别适用于debug和观测。 笔者经常使用这个接口用于观测模型优化出现问题时&#xff0c;梯度值是否出现异常&#xff1b;以及用于代替tensorbo…

检验基础的 JavaScript 面试题

1. 下面代码的输出是什么&#xff1f; function sayHi() {console.log(name);console.log(age);var name "Lydia";let age 21; }sayHi(); A: Lydia 和 undefined B: Lydia 和 ReferenceError C: ReferenceError 和 21 D: undefined 和 ReferenceError 答案: D…

12月编程语言排行榜公布!一起来看变化!

2022年迎来了最后一个月&#xff0c;我们可以看到&#xff0c;在这一年中编程语言起起伏伏&#xff0c;有的语言始终炙手可热&#xff0c;而有的语言却逐渐“没落”… 日前&#xff0c;全球知名TIOBE编程语言社区发布了12月编程语言排行榜&#xff0c;有哪些新变化&#xff1f…

一篇博客搞定深度学习基本概念与反向传播

目录 深度学习的发展过程 深度学习的步骤 定义Neural NetWork 全前向连接 softmax介绍 定义loss函数 定义优化器选择最优参数optimization 反向传播Backpropagation 深度学习介绍 反向传播视频 深度学习的发展过程 perceptron(liner model)感知机——线性模型 perc…

ESP32入门基础之资源管理

文章目录1 ESP32-DevKitC V4&#xff08;ESP32-WROVER-E&IE&#xff09;板载资源2 FreeRTOS任务内存使用监控1 ESP32-DevKitC V4&#xff08;ESP32-WROVER-E&IE&#xff09;板载资源 ESP32-DevKitC V4 入门指南 esp32-devkitc开发板参数对比 在工程中使用函数查询可用…

HTML学生个人网站作业设计:基于HTML+CSS+JavaScript设计多用途的图文展示博客HTML模板(16页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

IPv4/IPv6协议分析 实验报告

实验名称&#xff1a; IPv4/IPv6协议分析实验 一、实验预习 1、实验目的 利用抓包工具&#xff08;Wireshark/Windump/Sniffer&#xff09;抓取IPv4/IPv6分组&#xff0c;以进一步熟悉和理解IPv4/IPv6格式规范与IP协议的工作原理 2、实验内容…

HBase Windows 安装

一、写在前面 在安装HBase之前&#xff0c;我们需要先安装JDK和Hadoop&#xff0c;具体JDK和Hadoop的安装我前面已经做过了&#xff0c;需要的话&#xff0c;请看我的另一篇博客&#xff1a;Hadoop Windows 安装 还是那句话&#xff0c;在安装HBase之前&#xff0c;我们需要搞清…

IDEA 一些实用性的设置(Doing)

文章目录设置鼠标滑轮修改字体大小设置自动导包和删包功能设置显示代码行号和方法间的间隔符设置忽略大小写提示设置文件多行显示tabs设置默认字体、字体大小和行间距设置鼠标滑轮修改字体大小 file——setting&#xff08;快捷键&#xff1a;CtrlAltS&#xff09;——editor—…

ELK(搜索与分析技术栈)

一、介绍 ELK其实并不是一款软件&#xff0c;而是一整套解决方案&#xff0c;是三个软件产品的首字母缩写&#xff0c;Elasticsearch&#xff0c;Logstash 和 Kibana。这三款软件都是开源软件&#xff0c;通常是配合使用&#xff0c;而且又先后归于 Elastic.co 公司名下&#…

HTML学生个人网站作业设计成品 HTML+CSS肖战明星人物介绍网页 web结课作业的源码

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

并发与竞争(三)自旋锁

文章目录自旋锁的概念什么是自旋锁&#xff1f;自旋锁的API函数&#xff08;一&#xff09;自旋锁的使用步骤其他自旋锁API函数&#xff08;二&#xff09;自旋锁的注意事项内核中自旋锁的实例自旋锁死锁写代码临界区在哪&#xff1f;最简单的实现逻辑完整实现自旋锁的概念 什…