当前位置: 首页 > news >正文

【Java】代码块的细节你搞懂了吗(基础知识七)

 希望像唠嗑一样,one step one futher。

目录

(1)代码块的应用场景

 (2)代码块的细节

1.static 代码块只加载一次

 2.当调用类的静态成员时,类会加载

3. 使用类的静态成员时,static代码块会被执行,但普通代码块不会执行

4.创建对象时,静态成员、普通成员、 构造器的调用顺序

5.有继承关系时,静态成员、普通成员、 构造器的调用顺序

6.静态代码块中只能调用静态成员​


基于韩顺平老师的课进行Java知识的巩固练习 

(1)代码块的应用场景

 假设有以下雇员类,在该类的每个构造函数中输出“我是员工”这句话,不免有些重复并且造成内存浪费。

 public class Employee {private String name;private int id;private int salary;public Employee(String name) {System.out.println("我是员工");this.name = name;}public Employee(String name, int id) {System.out.println("我是员工");this.name = name;this.id = id;}public Employee(String name, int id, int salary) {System.out.println("我是员工");this.name = name;this.id = id;this.salary = salary;}}

如果用代码块则可以解决重复的问题,由此可以看出代码块可以初始化并且解决重复语句的问题(代码块执行顺序要比构造函数高)

 public class Employee {private String name;private int id;private int salary;{System.out.println("我是员工");}public Employee(String name) {this.name = name;}public Employee(String name, int id) {this.name = name;this.id = id;}public Employee(String name, int id, int salary) {this.name = name;this.id = id;this.salary = salary;}}

 (2)代码块的细节

1.static 代码块只加载一次

如果是普通代码块,每创建一个对象它就会执行一次代码块,而static代码块无论是创建多少个对象(>=1)都只会执行一次。

 2.当调用类的静态成员时,类会加载

注意创建子类对象时,父类也会被加载。先加载父类代码块,再加载子类代码块。当创建了一个对象时,调用该对象的静态成员时,类就会被加载。

3. 使用类的静态成员时,static代码块会被执行,但普通代码块不会执行

由下列看出,当没有创建对象时,使用类加载去访问静态成员时,static代码块也会被加载(只加载一次),但普通代码块不会被加载。

4.创建对象时,静态成员、普通成员、 构造器的调用顺序

 在创建对象时,调用顺序是这样的:先调用静态(属性或方法按顺序调用),然后是普通代码块和普通属性,最后才是构造器的调用。 

5.有继承关系时,静态成员、普通成员、 构造器的调用顺序

  

由下列程序可以观察到,如果有两个类是继承关系,两个类都有静态、普通、构造方法。创建一个子类对象,则执行的顺序是:

(1)先调用父类static,然后是子类static。先完成父子类的静态属性

(2)父类的普通方法,然后是父类的构造器,完成父类后。

(3)子类的普通方法,最后是子类的构造器,最后完成子类。

class Employee{static{System.out.println("Employee静态代码块");}public Employee() {System.out.println("Employee构造器");}
}
class Manager extends Employee{static{System.out.println("Manager静态代码块");}public Manager(){System.out.println("Manager构造器");}
}
class Test{public static void main(String[] args) {Manager manager = new Manager();}
}

 

6.静态代码块中只能调用静态成员

 由下图看出当在静态代码块中访问非静态成员是不允许的。但在普通代码块中则可以访问静态或者非静态成员。

http://www.lryc.cn/news/5408.html

相关文章:

  • 设计模式C++实现12:抽象工厂模式
  • 目标检测论文阅读:GraphFPN算法笔记
  • 实测2023款哪吒U-II,智驾功能对女司机很友好
  • Python自动化测试【软件测试最全教程(附笔记、学习路线)】,看完即就业
  • 2023/2/13总结
  • webSock前端
  • AcWing 3956. 截断数组(每日一题)
  • Android 一体机研发之修改系统设置————屏幕亮度
  • C++通用算法
  • Springboot停机方式
  • Linux perf_event_open 简介
  • Java给定两组起止日期,求交集
  • 数组的复制与二维数组的用法
  • JS判断两个table数据是否完全相等(判断两个数组对象是否完全相等)
  • 关于小程序,你想知道的这些
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-13
  • 【Linux】软件安装(三分钟教会你如何在linux下安装软件)
  • Fluent Python 笔记 第 10 章 序列的修改、散列和切片
  • 在中国程序员工作是青春饭吗?
  • Linux tcpdump
  • redis知识汇总(部署、高可用、集群)
  • 【手写 Vuex 源码】第十篇 - Vuex 命名空间的实现
  • 面试腾讯测试岗后感想,真的很后悔这5年一直都干的是基础测试....
  • 知识图谱 方法、实践与应用 王昊奋 读书笔记(下)
  • vue实现打印浏览器页面功能(两种方法)
  • 【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(Prometheus格式)
  • 【青训营】分布式定时任务简述
  • golang语言本身设计点总结
  • PTA L1-046 整除光棍(详解)
  • 将小程序代码转成uni-app代码