Java基础知识拾遗、类加载机制

Wesley13
• 阅读 459

  注意:刚学java不要用ide!!!!!!!!!!不然学几个月,连关键字都不会写!!!!!!!!!!!

  直接量:程序通过源代码直接给出的值,只包括基本数据类型,String,null类型,int a=5;5就是直接量。

  当程序第一次使用某个字符串直接量时,会使用常量池缓存该字符串直接量。

  常量池:在编译期被确定,并被保存在已编译的.class文件中的一些数据,包括字符串、类、方法、接口中的常量。

  常量:用final修饰的基本数据类型,类名、方法名、参数名。

  对于int a=5; 这个数据是放在栈中的,不是常量,没放在常量池。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  Java运行机制:

  写的代码.java是源代码,不可执行,必须编译为字节码文件.class。

  cmd中:编译:javac -d . A.java

      运行:java A

  A.class在硬盘中,运行A.class,会在内存中创建一个JVM虚拟机,然后把A.class调入到JVM中,在其中CPU做调度。

类加载机制:

  加载→链接→初始化,又分为:

    加载→验证→准备→解析→初始化→使用,其中验证、准备、解析为链接的内容。

      加载:将.class字节码文件加载到内存中,并将静态数据转换为方法区的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据    结构的访问入口。

      验证:确保加载的内容符合JVM规范,有没有安全问题。

      准备:为类变量(就是static变量)分配内存,并且为其赋默认值,比如static int a=3,这时赋的是int a=0;3是在初始化的时候赋的值。

      解析:将虚拟机常量池中的符号引用变为直接引用,类名也是常量。

    初始化:执行类构造器的<clinit()>方法的过程,cl是class的意思,init是初始化的意思,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块 (static{})中的语句合并产生的。

类的主动引用(一定会发生类的初始化):

  1、new一个类的对象。

  2、调用类的静态成员(除了field常量)和静态方法。

  3、当虚拟机启动Hello.java,则一定会初始化Hello类,说白了就是先启动Hello类的main方法。

  4、当初始化一个类,如果父类没有初始化,那么先初始化父类。

类的被动引用(不会发生类的初始化):

  1、当访问一个静态域时,只有真正声明这个静态域的类才会被初始化。

  2、通过数组定义类引用,也不会初始化。

  3、引用常量不会触发类的初始化(常量在编译阶段就放入常量池了)。

Java基础知识拾遗、类加载机制

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
面试字节我被String类的问题给问死了!
""是怎么连接字符串的?(JDK1.7及以上)总结:使用""连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。对于编译时常量,在编译后直接计算出字符串的值,而不会在运行时创建临时的StringBuilder对象来完成字符串连接。在循环中对String对象进行连接,应该直接使用StringBuilder代替"",这样
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Stella981 Stella981
2年前
Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
!(https://oscimg.oschina.net/oscnet/up1aa4ada0efc8a144d35d25b3443d951c7e3.JPEG)SPI全称为ServiceProviderInterface,是一种服务发现机制。当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类。所以在程序中并没有直接指定使用接口
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java虚拟机类加载机制
概述  虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。  与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都在程序运行期间完成的,这种策略虽然会稍微增加一些系统性能开销,但是会为Java应用程序
Wesley13 Wesley13
2年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
2年前
Java 基础语法
常量:在程序运行期间,固定不变的量常量的分类:1.字符串常量:凡是用双引号引起来的部分,叫做字符串常量,例如:"abc","hello","123"2.整数常量:直接写上的数字,没有小数点,例如:100,200,0,2503.浮点数常量:直接写上的数字,有小数点,