类加载联想java代码块1

今天想做spring的类加载的实验,所以恶补下java类加载的知识,看了深入理解java虚拟机211页的示例中的静态代码块,突然想到疯狂java里面总结非静态代码块总结得很好,当时自己看了之后感觉豁然开朗,但是现在只有一点印象,只记得是好像和构造方法有关,编译器处理的时候会优化。而这个非静态代码块的作用的印象,真是一点都没有啊。

学习就是这样,不总结,不温习,别说知新,永远是用的时候疲于学习,用完一无所有,所以我觉得每天总结下自己的学习,作为日志博客记载。不求人家共鸣,只求自己写的自己回头看的,能体会现在写博客的心境,并且愿意时常回头温习自己的日志。

非静态代码块的作用是作用是对象初始化的过程中,初始化数据域的一种机制(java核心技术1p130)。对象在初始化之前,成员域的定义在类方法区(方法区中的运行时常量池放的就是成员变量,接口,方法的描述应该是非静态方法;其他部分是类描述,常量,静态变量,静态方法等吧深入理解java虚拟机p41)中。基本类型有自己的默认值,引用类型为空,因为属于类,所以会在对象初始化前赋值。所以String类型默认是null,boolean默认是false。其次是定义变量的时候指定初始值和非静态代码块指定初始值(非静态代码块初始化非静态变量)。两者初始化的顺序与书写的顺序一致。其次是构造方法(疯狂的javap28)。疯狂的javap30中指出了编译器实际是讲赋值部分都提取到构造器中。

有非静态代码块。我觉得静态代码块是对类的初始化的时候,初始化静态数据域的一种机制。java核心技术1p131中就指出了可以使用静态的初始化块对静态域初始化。这里java核心技术将代码块称为初始化块可以看出,代码块的作用就是初始化域。类的初始化即是类加载的时候,java核心技术指出。类的第一次加载的时候,将会进行静态域的初始化。因此又回到类加载的问题上。

类什么时候加载呢?

深入理解java虚拟机p210指出了五种情况下类会被初始化,类初始化之前必须尽力加载、验证、准备阶段。

1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令的时候,如果累没有进行初始化,则要对类进行初始化。要初始化就要加载。实例化对象,读取或设置类的静态字段,调用一个类的静态方法。

2.利用反射对类进行调用的时候。

3.初始化子类,必要先初始化父类。

4.虚拟机启动,用户指定的执行类(main方法类)。

5.看不懂。。。。

(本文为看书总结和自己猜想)

原文地址:https://www.cnblogs.com/startery/p/9893564.html

时间: 2024-10-12 22:09:46

类加载联想java代码块1的相关文章

夯实Java基础系列7:一文读懂Java 代码块和执行顺序

目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块简介 Java代码块使用 局部代码块 构造代码块 静态代码块 Java代码块.构造方法(包含继承关系)的执行顺序 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github

java代码块的理解

最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合,以{}的形式出现,共有4中形式: 1.类的方法体 这是我们最常见的一种java代码块,形式如下: 1 public class Boke { 2 public void say(){ 3 System.out.println("我就是代码块的内容啦"); 4 } 5 } say的方法体{

08 java代码块的概述和分类

08.01_面向对象(代码块的概述和分类) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解). 局部代码块:只要是和局部有关系的,都是和方法有关系的 局部变量:在方法声明上或者在方法内部 构造代码块与类变量谁在前先加载谁 ,所有静态的东西(静态方法和静态变量都是)只加载一次,就是在类文件加载的时候加载,类文件释放的时候释放,加载顺序为,静态,–>–>构造代码块或局部变量

Java——代码块

前言 在程序编写之中可以直接使用{...}定义的一段语句就是代码块.根据代码块的位置以及关键字的不同可以分为4种:普通代码块.构造块.静态块以及同步代码块(多线程相关).下面将先介绍前3种以及Java类的初始化顺序: 普通代码块 构造块 静态块 Java类的初始化顺序 对于一个类(没有继承)的初始化情况 对于有继承的情况 普通代码块 写在方法里面的代码块就是普通代码块 public static void main(String args[]){ { int num = 0; } int num

Java 代码块,普通代码块,构造代码块,静态代码块

学习Java中… 刚刚学到了Java的代码块,虽然很简单 还是记下吧! 左音 2016-03-16 ----------------- // 执行优先级:静态代码块 > mian方法 > 构造代码块 > 构造方法 // 静态代码块不论是否实例化都会执行一次,不会重复执行 // 构造代码块实例化时执行 1.普通代码块 // 普通代码块在方法或语句中 1 public class CodeBlock { 2 3 public static void main (String[] args)

java代码块执行顺序

1.测试类 public class Demo extends SuperDemo { //静态代码块 static{ System.out.println("this is static block"); } //普通代码块 { System.out.println("this is normal block"); } //默认构造函数 public Demo(){ System.out.println("this is demo constructor

面试趣闻之java 代码块 静态代码块 构造方法 执行顺序

初级程序员总会遇到这样的问题,代码块 静态代码块 构造方法 执行顺序 父类 public class ClassSup { public ClassSup(){ System.out.println("父类构造器"); } static { System.out.println("父类静态代码块"); } { System.out.println("父类代码块"); } public void mathod01(){ System.out.pri

java代码块 静态、非静态

Java虚拟机的内存分区:Java栈.堆.方法区.本地方法栈.PC寄存器.还有一个常量池的概念,虚拟机会为每种类型分配一个常量池,而不是实例. 例如有一个类有很多子类,那么在父类定义的final变量,在子类是不能被改变的.可以说明是在类型上分配的. 被static修饰的变量或者方法是属于类本身,而不属于类的实例.在类被加载进虚拟机的时候就已经初始化了,他存在与方法区,方法区和堆区的时候是共享的,因此他被设计为线程安全的.假设同时有两个线程都企图访问一个名为A的类,而这个类还没有被转入虚拟机,此时

08-02 Java 代码块,代码块执行的先后顺序问题

代码块 /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造方法执行前,都会先执行构造代码块. 作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化. 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了. 作用:一般是对类进行初始化. 面试题? 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 -