Java基础笔记一

一、弄清Java学习中的一些概念

1. JVM、JRE和JDK的关系

  1. JVM
    Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

  2. JRE
    Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

  3. JDK
    Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
    步骤

二、Java文件如何从编译到执行

总体来说从一个源文件到代码执行就4个步骤:编译->加载->解释->执行
步骤

1. 编译

目的:将源码文件编译成JVM可以解释的class文件。
过程:编译过程会对源代码程序做 「语法分析」「语义分析」「注解处理」等处理,最后才生成字节码文件。

2. 加载

在加载中又分为三个步骤:
【装载】:

  • 目的:把class文件装载到JVM中了,并创建出对应的Class对象以及类信息存储至方法区了。
  • 【装载时机】:为了节省内存的开销,并不会一次性把所有的类都装载至JVM,而是等到「有需要」的时候才进行装载(比如new和反射等等)
  • 【装载发生】:class文件是通过「类加载器」装载到jvm中的,为了防止内存中出现多份同样的字节码,使用了双亲委派机制(它不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上)
  • 【装载规则】:JDK 中的本地方法类一般由根加载器装载,JDK 中内部实现的扩展类一般由扩展加载器实现装载,而程序中的类文件则由系统加载器实现装载。

【连接】:

  • 目的:对class的信息进行验证、为「类变量」分配内存空间并对其赋默认值。
  • 【验证】:验证类是否符合 Java 规范和 JVM 规范
  • 【准备】:为类的静态变量分配内存,初始化为系统的初始值
  • 【解析】:将符号引用转为直接引用的过程

【初始化】:

  • 目的:为类的静态变量赋予正确的初始值。
  • 收集class的静态变量、静态代码块、静态方法至()方法,随后从上往下开始执行。
  • 如果「实例化对象」则会调用方法对实例变量进行初始化,并执行对应的构造方法内的代码。
    步骤

3. 解释

目的:把字节码转换为操作系统识别的指令
在解释阶段会有两种方式把字节码信息解释成机器指令码

  • 字节码解释器
  • 即时编译器(JIT)。
    JVM会对「热点代码」做编译,非热点代码直接进行解释。当JVM发现某个方法或代码块的运行特别频繁的时候,就有可能把这部分代码认定为「热点代码」

使用「热点探测」来检测是否为热点代码。「热点探测」一般有两种方式,计数器和抽样。HotSpot使用的是「计数器」的方式进行探测,为每个方法准备了两类计数器:方法调用计数器和回边计数器

这两个计数器都有一个确定的阈值,当计数器超过阈值溢出了,就会触发JIT编译。

即时编译器把热点方法的指令码保存起来,下次执行的时候就无需重复的进行解释,直接执行缓存的机器语言

4. 执行

操作系统把解释器解析出来的指令码,调用系统的硬件执行最终的程序指令。

5.总结

Java跨平台因为有JVM屏蔽了底层操作系统
Java源码到执行的过程,从JVM的角度看可以总结为四个步骤:编译->加载->解释->执行

  • 「编译」经过 语法分析、语义分析、注解处理 最后才生成会class文件
  • 「加载」又可以细分步骤为:装载->连接->初始化。
  • 「解释」则是把字节码转换成操作系统可识别的执行指令。
  • 「执行」调用系统的硬件执行最终的程序指令

三、面向对象

1.面向对象的三大特性

其中Java 面向对象编程三大特性:封装 继承 多态

【封装】
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

封装隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

【继承】
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

关于继承如下 3 点请记住:

  • 子类拥有父类非 private 的属性和方法。
  • 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。

【多态】
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:

方法重写(子类继承父类并重写父类中已有的或抽象的方法);

对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

posted @ 2024-03-13 19:55  YJQING  阅读(18)  评论(0)    收藏  举报