五分钟手撕“三大特性”<继承>(下)

目录

一、protected 关键字

二、继承方式

三、final 关键字

四、子类的构造方法

五、this和super 

(一)相同点:

(二)不同点:

六、代码块的执行先后 


一、protected 关键字

在类与对象中提到过,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。

protected它是一种比较温和的权限,它既不会像private一样私密,也不会像public一样开放,它是介于中间的。在同一个包中可以使用,在不同包也能用(不过是子类)。 

// 为了掩饰基类中不同访问权限在子类中的可见性,为了简单类B中就不设置成员方法了
// extend01包中
public class B {
    private int a;
    protected int b;
    public int c;
    int d;
}
// extend01包中
// 同一个包中的子类
public class D extends B{
public void method(){
 // super.a = 10; // 编译报错,父类private成员在相同包子类中不可见
    super.b = 20; // 父类中protected成员在相同包子类中可以直接访问
    super.c = 30; // 父类中public成员在相同包子类中可以直接访问
    super.d = 40; // 父类中默认访问权限修饰的成员在相同包子类中可以直接访问
}
}
// extend02包中
// 不同包中的子类
public class C extends B {
public void method(){
 // super.a = 10; // 编译报错,父类中private成员在不同包子类中不可见
    super.b = 20; // 父类中protected修饰的成员在不同包子类中可以直接访问
    super.c = 30; // 父类中public修饰的成员在不同包子类中可以直接访问
  //super.d = 40; // 父类中默认访问权限修饰的成员在不同包子类中不能直接访问
}
}
// extend02包中
// 不同包中的类
public class TestC {
public static void main(String[] args) {
    C c = new C();
    c.method();
 // System.out.println(c.a); // 编译报错,父类中private成员在不同包其他类中不可见
 // System.out.println(c.b); // 父类中protected成员在不同包其他类中不能直接访问
    System.out.println(c.c); // 父类中public成员在不同包其他类中可以直接访问
 // System.out.println(c.d); // 父类中默认访问权限修饰的成员在不同包其他类中不能直接访问
}
}

 注意:父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了。

二、继承方式

 但是在现实生活中,我们的继承确是多种多样的:

但是Java只接受以下几种方式:

注意:Java中不支持多继承。 

三、final 关键字

我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系。

如果继承层 次太多, 就需要考虑对代码进行重构了. 如果想从语法上进行限制继承, 就可以使用 final 关键字。

final关键可以用来修饰变量、成员方法以及类。 

 1. 修饰变量或字段,表示常量(即不能修改)

final int a = 10;

a = 20; // 编译出错

2. 修饰类:表示此类不能被继承 

final public class Animal {

        ...

}

public class Bird extends Animal {

        ...

} // 编译出错

我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承。

3. 修饰方法:表示该方法不能被重写(后序的博客会介绍) 

四、子类的构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。 

public class Base {
public Base(){
    System.out.println("Base()");
}
}
public class Derived extends Base{
public Derived(){
// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
// 并且只能出现一次
    System.out.println("Derived()");
}
}
public class Test {
public static void main(String[] args) {
    Derived d = new Derived();
}
}
结果打印:
Base()
Derived()

注意:

1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法。

2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的 父类构造方法调用,否则编译失败。

3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。

五、this和super 

(一)相同点:

1.都是Java的关键字;

2. 只能在类的非静态方法中使用;

3.必须是构造方法中的第一条语句,并且不能同时存在

(二)不同点:

1.this既可以指子类也可以指父类,但是调用时优先子类,super只调用父类;

2.构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

六、代码块的执行先后 

代码块的三大总类:静态代码块实例代码块构造代码块

1.静态代码块:初始化静态变量;

2.实例化代码块:可用于在创建对象之前进行一些初始化操作;

3.构造方法:用于初始化对象的成员变量和执行其他操作。

注意:(构造方法和实例代码块区别就是构造方法需要public和类名,实例化代码块上面都不写)

那它们执行的顺序怎么样呢,代码如下:

class Person {
    public String name;
    public int age;

public Person(String name, int age) {
    this.name = name;
    this.age = age;
    System.out.println("构造方法执行");
}

{
    System.out.println("实例代码块执行");
}

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

public class TestDemo {
public static void main(String[] args) {
    Person person1 = new Person("红红",10);
    System.out.println("============================");
    Person person2 = new Person("绿绿",20);
}
}

执行结果如下: 

静态代码块执行
实例代码块执行
构造方法执行
============================
实例代码块执行
构造方法执行

1. 静态代码块先执行,并且只执行一次,在类加载阶段执行

2. 当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

 那在继承中,它们的顺序呢?代码如下:

class Person {
    public String name;
    public int age;

public Person(String name, int age) {
    this.name = name;
    this.age = age;
    System.out.println("Person:构造方法执行");
}

{
    System.out.println("Person:实例代码块执行");
}

static {
    System.out.println("Person:静态代码块执行");
}
}

class Student extends Person{
public Student(String name,int age) {
    super(name,age);
    System.out.println("Student:构造方法执行");
}

{
    System.out.println("Student:实例代码块执行");
}

static {
    System.out.println("Student:静态代码块执行");
}
}

public class TestDemo4 {
public static void main(String[] args) {
    Student student1 = new Student("张三",19);
    System.out.println("===========================");
    Student student2 = new Student("gaobo",20);
}
public static void main1(String[] args) {
    Person person1 = new Person("红红",10);
    System.out.println("============================");
    Person person2 = new Person("绿绿",20);
}
}

执行结果:

Person:静态代码块执行
Student:静态代码块执行
Person:实例代码块执行
Person:构造方法执行
Student:实例代码块执行
Student:构造方法执行
===========================
Person:实例代码块执行
Person:构造方法执行
Student:实例代码块执行
Student:构造方法执行

 通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行

2、父类实例代码块和父类构造方法紧接着执行

3、子类的实例代码块和子类构造方法紧接着再执行

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二维码门楼牌管理应用平台建设:网格化管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台的实际应用四、二维码门楼牌管理应用平台的前景展望 前言 随着信息技术的飞速发展,二维码门楼牌管理应用平台的建设已成为城市网格化管理…

第十四届蓝桥杯省赛C/C++大学B组真题-飞机降落

思路&#xff1a;根据数据范围N<10猜测用DFS剪枝&#xff0c;因为菜狗不会状压dp。根据题目&#xff0c;一般这种飞机的题都会用到贪心的思想。思想是每架飞机都要卡极限最早降落时间&#xff0c;从而保证后面的飞机能够有充足时间降落。 代码参考博客MQy大佬有详细解答 #i…

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*;

Java面试八股文(JVM篇)(❤❤)

Java面试八股文_JVM篇 1、知识点汇总2、知识点详解&#xff1a;3、说说类加载与卸载11、说说Java对象创建过程12、知道类的生命周期吗&#xff1f;14、如何判断对象可以被回收&#xff1f;17、调优命令有哪些&#xff1f;18、常见调优工具有哪些20、你知道哪些JVM性能调优参数&…

统计大写辅音字母

题目&#xff1a; 英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序&#xff0c;统计给定字符串中大写辅音字母的个数。 输入格式&#xff1a; 输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式&#xff1a; 输出在一行中给出字符串中大写…

Golang数据类型

文章目录 数据类型的基本介绍基本数据类型整数类型字符类型浮点数类型复数类型布尔类型string类型 常量类型转换基本数据类型相互转换基本数据类型与string的转换 指针类型值类型和引用类型 数据类型的基本介绍 数据类型的基本介绍 Go中的每一种数据都定义了明确的数据类型&…

Mac电脑版鼠标连点工具 RapidClick for Mac

RapidClick for Mac是一款方便实用的自动点击工具&#xff0c;可以帮助Mac用户在使用电脑时轻松、快速地进行鼠标操作。它可以模拟人类手指点击的动作&#xff0c;让您的鼠标点击变得更加快捷高效&#xff0c;大大提升了工作和游戏的效率。 RapidClick for Macv1.5.1激活版下载…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

C++ 使用共享内存的进程通信方式模拟生产者消费者模型

编码环境如下 系统环境&#xff1a;linux 信号量&#xff1a;使用Linux操作系统的SystemV信号量 生产者代码如下 #include <iostream> #include <sys/sem.h> #include <sys/shm.h> #include <string.h>#define SEM_KEY 0x5678 #define SHM_KEY 0xAB…

(2022级)成都工业学院数据库原理及应用实验七: 数据库安全

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、创建数据库hospital,在hospital数据库中创建科室表De…

mac电脑mysql下载与安装

mysql下载地址 历史下载地址 MySQL :: Download MySQL Community Server (Archived Versions) mac 版下载 mac版本分为 Intel 处理器 和 M系列处理器。 从 8.0.26开始&#xff0c; mysql 支持M系列处理器。 以前的都只有Intel 处理器的。 Intel 处理器选择 x86_64 M 系列处理…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…

AI算力集群网络规模与集群算力发展分析

GPU集群网络、集群规模、集群算力 在过去十年中&#xff0c;60% 的创业公司在五年内失败。现在&#xff0c;成功的几率提高了 30%&#xff0c;达到 90%&#xff01;加入我们的创业加速器&#xff0c;提升您成功的可能性。 一、引言 在生成式 AI 和大模型的时代&#xff0c;我…

【管理】杨三角模型

企业成功 成功 战略 X 组织能力 1&#xff09;组织能力对于企业的重要性是和战略一样的&#xff1b; 2&#xff09;组织能力必须与战略适配&#xff0c;才能共同造就企业的成功。 员工思维&#xff1a;员工愿不愿意参与战略落地的实践&#xff1f;员工每天所关心、追求和重视的…

你会写SAP技术规格说明书(Specification)吗

有些小伙伴可能还在发愁技术规则说明书应该写什么&#xff0c;做了张思维导图&#xff0c;包含了所有RICEFW。 R - Report - 报表 I - Interface - 接口 C - Conversion - 数据转换 E - Enhancement - 增强 F - Form - 表单 W - Workflow - 工作流

数据结构面试常见问题:什么是二叉树?如何进行二叉树的遍历?

二叉树的介绍 二叉树是一种特殊的数据结构&#xff0c;它的每个元素都有零个、一个或两个子元素。这些元素被称为节点&#xff0c;每个节点都有一个值&#xff0c;以及两个指向其子节点的链接。 这种结构就像一个家族树&#xff0c;每个节点都有一个父节点&#xff08;除了顶…

Linux(引导过程与服务控制)

目录 1.linux操作系统引导过程 1.1引导过程总览 ​编辑1.2 linux操作系统的引导过程 1.3 系统初始化进程 1.4 Systemd单元类型 1.5 运行级别所对应的systemd目标 2.排除启动类故障 2.1 修复MBR扇区故障 2.2 实例&#xff1a;修复MBR扇区故障 2.3 实例&#xff1a;…

【MIT6.S081】Lab4: traps(详细解答版)

实验内容网址&#xff1a;https://xv6.dgs.zone/labs/requirements/lab4.html 本实验的代码分支&#xff1a;https://gitee.com/dragonlalala/xv6-labs-2020/tree/traps2/ Backtrace 关键点:trapframe、栈 思路&#xff1a; 这道题的关键是栈结构&#xff0c;先阅读xv6中关于栈…

Kafka导航【Kafka】

Kafka导航【Kafka】 前言版权推荐Kafka随堂笔记 第三章 生产者3.4生产者分区3.4.1.分区好处3.4.2 生产者发送消息的分区策略3.4.3 自定义分区器 3.5 生产经验——生产者如何提高吞吐量3.6 生产经验——数据可靠性3.7 生产经验——数据去重3.7.1 数据传递语义3.7.2 幂等性3.7.3生…

python爬虫笔记1

1 爬虫介绍 爬虫概述&#xff1a; 获取网页并提取和保存信息的自动化程序 1.获取网页 2.提取信息 css选择器 xpath 3.保存数据&#xff08;大数据时代&#xff09; 4.自动化 爬虫&#xff08;资产收集&#xff0c;信息收集&#xff09; 漏扫&#xff08;帮我发现漏洞&#xff…