0023 Java学习笔记-面向对象-初始化代码块
初始化代码块
- 在18篇-类的基本要素中说到,类的三大成员:成员变量、构造方法、方法,初始化代码块是类的第4个成员
- 初始化块用于对类或者对象的初始化,
- 一个类的初始化块可以有0~多个,按先后顺序执行
- 跟实例方法-->类方法、实例变量-->类变量一样,也可以用static修饰初始化块,静态初始化块-->非静态初始化块
- 初始化块总是先于构造器执行
- 非静态初始化块
- 非静态初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之前执行
- 如果一段初始化代码对所有构造器完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中
- 在继承中,先后执行父类A的非静态块、构造器,再执行父类B的非静态块、构造器,最后才执行子类的非静态块、构造器
- 实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面
- 静态初始化块
- 静态初始化块用static修饰,又叫类初始化块
- 非静态块负责对对象执行初始化,而类初始化块负责对类进行初始化,因此类初始化块是在类初始化阶段就执行
- 静态块跟静态方法一样,不能访问非静态成员
- 在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类,最后执行子类的非静态块和构造器
- 因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了
- 下面通过一段代码,看看继承中的静态块、非静态块、构造方法的执行顺序
public class Test{
public static void main(String[] args) {
C c1=new C();
System.out.println("--------下面第二次创建C类对象---------");
C c2=new C();
}
}
class C extends B{
static {
System.out.println("C的静态代码块");
}
{
System.out.println("C的非静态代码块");
}
C(){
System.out.println("C的无参构造方法");
}
C(String str){
System.out.println("C的有参构造方法");
}
}
class B extends A{
static {
System.out.println("B的静态代码块");
}
{
System.out.println("B的非静态代码块");
}
B(){
System.out.println("B的无参构造方法");
}
B(String str){
System.out.println("B的有参构造方法");
}
}
class A{
static {
System.out.println("A的静态代码块");
}
{
System.out.println("A的非静态代码块");
}
A(){
System.out.println("A的无参构造方法");
}
A(String str){
System.out.println("A的有参构造方法");
}
}
输出为:
A的静态代码块
B的静态代码块
C的静态代码块
A的非静态代码块
A的无参构造方法
B的非静态代码块
B的无参构造方法
C的非静态代码块
C的无参构造方法
--------下面第二次创建C类对象---------
A的非静态代码块
A的无参构造方法
B的非静态代码块
B的无参构造方法
C的非静态代码块
C的无参构造方法
静态初始化块与静态成员变量的执行顺序
- JVM第一次使用某个类时,在准备阶段给所有静态成员分配内存,在初始化阶段初始化这些静态成员变量,就是执行初始化代码或者声明成员变量时指定的初始值,执行顺序与源代码中的顺序相同
- 按源代码中的先后顺序执行,见示例代码:
public class Test{
public static void main(String[] args) {
A a=new A();
System.out.println(a.num); //输出10,而不是6,说明先执行声明赋值6,然后才执行静态块赋值10
}
}
class A{
public static int num=6;
static{
num=10;
}
}
0023 Java学习笔记-面向对象-初始化代码块的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记 - 类方法与代码块的执行顺序
类的初始化顺序 使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注. class Parent { public static String p_StaticField = "父类 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 程序设计基础·Java学习笔记·面向对象(下)
Java程序设计基础之面向对象(下) (补充了上的一些遗漏的知识,同时加入了自己的笔记的ヾ(•ω•`)o) (至于为什么分P,啊大概是为了自己查笔记方便(?)应该是("` 3′") ...
- 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题
包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...
- 0020 Java学习笔记-面向对象-变量
变量分为哪些 成员变量:类里面,方法外面定义的变量 实例变量:没有用static修饰的变量,属于对象:存在期:创建实例-销毁实例:作用域:与该实例的生存范围相同 类变量:用static修饰的变量,属于 ...
随机推荐
- MongoDB的CRUD操作
1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...
- 5分钟学会使用Less预编译器
5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- C#基于两种需求向图片添加水印
使用场景 1.也就是大家经常用的,一般是图片的4个角落,基于横纵坐标来添加. 2.在图片内基于固定位置,文字始终居中.刚开始我基于第一种场景来根据水印汉字的长度来计算坐标,后来发现方法始终不可靠.现在 ...
- Sql Server函数全解(三)数据类型转换函数和文本图像函数
一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...
- CoCreateInstance调用返回代码0x80040154的一种解决方法
引言 前面的一篇博文中总结了开发Windows Thumbnail Handler的一些经验.在公司实际项目中,需要同时针对图片和视频实现缩略图.同时还要在图片和视频文件的顶部加上LOGO.像如下这样 ...
- 缓存技术Redis在C#中的使用及Redis的封装
Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server).Redis的键值可以包括字符串(string ...
- HTML相关
<td style="text-align:center;"> 让表格中的字居中 style="width:75px; margin-left:1100p ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- JavaScript中数组去除重复
方式一:常规模式 1.构建一个新的临时数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与临时数组对比 3.若临时数组中没有该元素,则存到临时数组中 //方式一: Array.p ...