JVM&JDK&JRE

JVM

Java 虚拟机(JVM)是运⾏ Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM 实现是 Java 语⾔“⼀次编译,随处可以运⾏”的关键所在。

==JVM 并不是只有⼀种!只要满⾜ JVM 规范,每个公司、组织或者个⼈都可以开发⾃⼰的专属JVM。==

JDK和JRE

JDK 是 Java Development Kit 缩写,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。

JRE 是 Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的⼀些基础构件。但是,它==不能⽤于创建新程序==。

字节码

JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的⽂件),它不⾯向任何特定的处理器,只⾯向虚拟机。

Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点。

字节码并不针对⼀种特定的机器,因此,Java 程序⽆须重新编译便可在多种不同操作系统的计算机上运⾏。

Java 是编译与解释共存的语⾔?

Java程序从代码到运行:
.java -> javac编译 -> .class -> 解释器&JIT (编译器) -> 机器码 -> 运行

JIT 属于运⾏时编译。当 JIT 编译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以直接使⽤。机器码的运⾏效率肯定是⾼于 Java 解释器的。

JDK 9 引⼊了⼀种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各⽅⾯的开销。

Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?

自增自减运算符


int a=0,b=1;

a = b++;
a = ++b;

==符号在前先加减;符号在后后加减==

字符型常量和字符串常量的区别

  • 形式:
    • 字符型常量: 单引号引起的⼀个字符
    • 字符串常量: 双引号引起的 0 个或若⼲个字符
  • 含义:
    • 字符型常量: ⼀个整型值( ASCII 值),可以参加表达式运算
    • 字符串常量: ⼀个地址值(该字符串在内存中存放位置)
  • 内存:
    • 字符型常量: 只占 2 个字节
    • 字符串常量: 占若⼲个字节

静态方法与实例方法区别?

1.调用方式:

静态方法:
类名.方法名 / 对象.方法名

实例方法:
对象.方法名

总结: ==调⽤静态⽅法可以⽆需创建对象==

2.访问类成员是否存在限制

静态方法:
只允许访问静态成员变量静态方法

实例方法:
没有限制

重载和重写的区别?

重载

发生在同一个类中(或父类与之类之间),方法名必须相同,参数类型\个数\顺序不同,方法返回值和修饰符可以不同.

==重载就是同⼀个类中多个同名⽅法根据不同的传参来执⾏不同的逻辑处理==

重写

⽅法的重写要遵循”两同两⼩⼀⼤”

  • 必须相同
    • 方法名
    • 参数列表
  • 小于等于
    • 子类方法返回值比父类方法返回值
    • 抛出异常范围
  • 大于等于
    • 访问修饰符

不能重写情况

  • 父类方法修饰符private\final\static,但是通过static修饰的方法可以再次声明
  • 构造方法不能重写

==重写就是⼦类对⽗类⽅法的重新改造,外部样⼦不能改变,内部逻辑可以改变==

⭐重写的返回值类型

  • 引用类型
    • 可以返回引用类型的子类
  • void和基本数据类型
    • ==返回值重写时不可修改==

可变⻓参数

可变长参数只能作为方法的最后一个参数,前面也可以没有任何参数!

public static void method1( String ... args ){
// ...
}

public static void method2( String a , String ... args ){
// ...
}

遇到⽅法重载的情况怎么办呢?

优先匹配固定参数的⽅法,因为固定参数的⽅法匹配度更⾼

基本类型和包装类型的区别

  • 成员变量包装类型不赋值就是null,而基本类型有默认值且不是null
  • 包装类型可以用于泛型,而基本类型不可以
  • 相比对象类型,基本数据类型占用空间小
  • 存放位置
    • 基础类型
      • 局部变量存在Java虚拟机的
      • 成员变量存在Java虚拟机的
    • 包装类型
      • 存在Java虚拟机的 (包装类型属于对象类型)

补充内容

三区介绍截图:

基本介绍:

成员变量是在 中定义的变量

局部变量是在 方法 中定义的变量

包装类的缓存机制

Byte\Short\Integer\Long 包装类型默认数字[-128,127]相应类型缓存数据;

Character 创建[0,127]范围的缓存数据;

Boolean 直接返回TrueFalse;

Float和Double 没有实现缓存机制;

Integer 源码

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}

问题-输出结果True还是False :

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);

结果是: False

Integer i1 = 40发生装箱,代码等价于Integer i1 = Integer.valueOf(40), i1 使用的是缓存,而Integer i2 = new Integer(40)创建了一个新对象.

装箱拆箱何时发生

Java中的装箱和拆箱—这一篇全了解

Integer i = 10;  //装箱: 自动根据数值创建对应的 Integer对象,这就是装箱
int n = i; //拆箱: 自动将包装器类型转换为基本数据类型

==所有整型包装类对象之间值的⽐较,全部使⽤ equals ⽅法⽐较==

⼀个类没有声明构造⽅法,该程序是否能正确

答: ⼀个类没有声明构造⽅法,也可以执⾏

一个类即使没有声明构造方法也会有默认的不带参数的构造方法.

如果重载了有参的构造方法,需要把无参的构造方法写出来,无论是否用到,因为一旦添加自己的构造方法,Java就不会在默认添加无参的构造方法.

构造方法特点,是否可以Override

构造方法特点:

  • 名字与类名相同
  • 没有返回值,不能使用void声明构造方法
  • 生成类的对象自动执行

构造方法不能override(重写),但是可以overload(重载).

面向对象的三大特征

  • 封装
  • 继承
  • 多态

接口和抽象类的共同特点及区别

共同特点

  • 不能实例化
  • 可以包含抽象方法
  • 可以默认实现方法(jdk8 之后可以用default关键字定义默认方法)

区别

  • 接口用作对类行为的约束,实现了某个接口具有对应的行为;抽象类主要用户代码复用,强调所属关系.
  • 一个类只能继承一个类,但可以实现多个接口
  • 接口中的成员变量只能public static final类型的,不能修改且必须有初始值;抽象类中成员变量默认default,可在子类中重新定义,也可以重新赋值.

引用拷贝和浅拷贝区别

深拷贝和浅拷贝区别了解吗?什么是引用拷贝?·

== 和 equals() 区别

==与equals?hashCode与equals?