JVM学习笔记4:方法调用

重载与重写

  • 重载的方法在编译阶段完成识别,调用是根据参数声明类型选择重载方法。选择分三个阶段:

    • 在不考虑对基本类型自动装拆箱(auto-boxing,auto-unboxing),以及可变长参数的情况下选取重载方法;
    • 如果在第 1 个阶段中没有找到适配的方法,那么在允许自动装拆箱,但不允许可变长参数的情况下选取重载方法;
    • 如果在第 2 个阶段中没有找到适配的方法,那么在允许自动装拆箱以及可变长参数的情况下选取重载方法。
  • 如果 Java 编译器在同一个阶段中找到了多个适配的方法,那么它会在其中选择一个最为贴切的,而决定贴切程度的一个关键就是形式参数类型的继承关系。

  • 下面代码中第一次调用会是函数2,因为null可以匹配object和string,但是因为string是Object的子类,所以编译器认为string合适。

JVM学习笔记3:类加载

知识点

  • 基本步骤:经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化,同样不能使用。
  • 引用类型与CLR基本一致,泛型会被编译为特定类型的代码。类和接口是字节码。数组类是由 Java 虚拟机直接生成的,这个似乎没有CLR中对标的东西。
  • 加载用的字节流可以来自java编译后的class,也可以是网络比如网页中内嵌的小程序 Java applet。字节流我理解就是IL,而且从结果看也确实就是这个东西。

JVM学习笔记2:类型

Boolean

  • Java中的Boolean类型在JVM中映射为int类型。“true”被映射为整数 1,而“false”被映射为整数 0。因此,将原本声明为 boolean 类型的局部变量,赋值为除了 0、1 之外的整数值,在 Java 虚拟机看来是“合法”的。

  • 对于存储 boolean 数组的字节码,Java 虚拟机需保证实际存入的值是整数 1 或者 0。

  • 对于下面的代码来说,第一个if是true,第二个是false。因为第一个是在true是1的情况下,等于问的是“吃过几碗饭”,而第二个if是问“吃了一碗饭吗”。

JVM学习笔记1:概述

JVM解决什么问题

  • JVM在我的理解与CLR是一回事,本身还是为了解决java代码无法直接编译为机器码。
  • 对标C#,类型的动态推导等功能是在运行时做的,因此无法做到AOT。就需要虚拟机来做这个事情了。
  • 如虚函数实现多态这样的情况,JVM中可以简单的获得当前应该调用哪个实现函数,从而优化代码的执行。
  • 最后,使用虚拟机可以做到代码不考虑具体在哪个平台运行的问题,实现跨平台使用。

侯捷C++学习笔记:对象的创建和销毁

概述

  • 本文会记录CPP中对象的创建和销毁的过程中的细节

big three函数

  • 拷贝构造函数
  • 拷贝赋值函数
  • 析构函数

用途:这三个函数是在类中包含了指针的情况下使用的。

  • 当有一个成员变量是一个指针时,就有了给这个变量赋值的问题。如果这个赋值需要深拷贝,那么就需要申请内存空间。这样在析构函数中就需要对指针进行delete。
  • 这个成员变量可以是在对象构造函数中被赋值的,比如是个拷贝构造函数。也可以是在拷贝赋值函数中被赋值的。

侯捷C++学习笔记:Object Model

composition & delegate & inherit 的构造和析构顺序

侯捷C++学习笔记:Reference

本质

  • 通过指针实现,所以本质就是指针

侯捷C++学习笔记:偏特化

什么是偏特化

  • 泛化(泛型)的反义
  • 分为个数的偏特化和范围的偏特化

数量偏特化

  • 举个例子,如果有如下class的定义,第一个class的就是泛型的,而第二个class,也是两个参数,但是第一个参数是个确定类型的,第二个是泛型的。这样就叫个人的偏特化。这固定类型的位置必须是从左至右的,不能跳着写。

侯捷C++学习笔记:类型转换

自己转换为别的类型

  • 做法:使用operator关键字,无需返回值,函数名称就是返回值。如有需要加上const修饰。

侯捷C++学习笔记:面向对象

Composition

  • 组合
  • 其实就是一个类(Container)中包含了另一个类的实例(Component),注意是实例。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×