文章目录
Java语言的特点
1.简单易学
2.面向对象(封装,继承,多态)
3.跨平台(JVM)
4.多线程
5.可靠性
6.安全性
7.支持网络编程
8.编译与解释并存
JVM和JDK、JRE
JVM
JVM是Java虚拟机,通过运行字节码文件实现Java的跨平台。JVM在不同的系统上是有不同的版本的。最终都是使用同一份字节码编译程序,实现“一次编译,随处运行。”
JVM是一种规范!!!
JDK
JDK是Java开发工具包。JDK包括JRE,编译器和工具。能够创建和编译程序。
JRE
JRE是Java运行时环境。JRE包括JVM,Java类库,Java命令和其他基础构件。但是不能用来创建新程序。
什么是字节码?采用字节码的好处是什么?
JVM可以理解的代码叫做字节码。字节码只面向虚拟机。
好处:通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题(解释型语言是逐行解释逐行执行所以效率会比较低),同时保留了解释型语言可移植的特点。Java通过JVM和字节码文件实现了跨平台的特性。
Java程序运行过程
注:字节码——>机器码:JVM类加载器首先把字节码文件载入内存,通过解释器逐行解释执行。但是有一些代码是需要经常调用的,我们称之为热点代码。这样的过程就很浪费时间,后来引入了JIT(just in time )编译器,在JIT完成第一次编译时,生成的机器码会自动保存下来。由此提高Java程序的执行效率。
HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。
JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
编译型语言和解释型语言
编译型 :编译型语言 会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
解释型 :解释型语言会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
注释的几种形式
1.单行注释
2.多行注释
3.文档注释
注:我们编写代码时应当注重提升代码本身的可读性,例如使用易读的函数名和变量名。
关键字和标识符
关键字:
标识符:程序、类、变量、方法等的名字 。
注意 :虽然 true, false, 和 null 看起来像关键字但实际上他们是字面值,同时你也不可以作为标识符来使用。
如果一个方法前没有任何修饰符,则默认会有一个修饰符 default,但是这个修饰符加上了就会报错。
静态方法为什么不能调用非静态成员
1.静态方法时属于类的,在类加载到内存时完成初始化。
2.非静态成员属于实例对象,只有在对象实例化后才存在。
3.所以在静态方法中调用此时并不存在的非静态成员变量属于非法行为。
重载与重写的区别
重载是方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。,做出不同的处理。
重写是指子类重新编写父类的方法,参数列表必须相同。
注:重写
1.方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
2.如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被重载。
3.构造方法无法被重写
4.如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。
什么是可变长参数?
可变长参数就是在调用方法的过程中不确定有多少的同类型的参数,用…来表示。可变参数只能作为函数的最后一个参数,其前面可以有也可以没有任何其他参数。如果有方法的重载,优先匹配固定长度的参数。
例如
public static void method1(String... args) {
//......
}
Java的八种基本数据类型
6 种数字类型:
4 种整数型:byte、short、int、long
2 种浮点型:float、double
1 种字符类型:char
1 种布尔型:boolean。
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
基本类型和包装类型的区别?
1.包装类型不赋值就是null,基本类型有默认值。
2.包装类型可用于泛型,基本类型不可以。
3.基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表中,未被static修饰的基本数据类型的成员变量存放在堆中。
4.包装类型属于对象类型,几乎所有对象实例都存在于堆中。
为什么说是几乎所有对象实例呢? 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存
包装类型的缓存机制了解么?
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。两种浮点数类型的包装类 Float,Double 并没有实现缓存机制。
如何理解值传递和引用传递?
值传递是将形参的值拷贝一份传入方法中去,方法结束时,原来的值并不会改变。但是如果传入的是一个引用地址,Java会创造一个副本指向同一个地址,这时候去改变被指向地址的内容时原来的数据也会被改变。
==和equals有什么区别?
1.==比较的是基本类型时是比较值是否相等,比较引用类型时是比较地址是否相等。
2.equals不能用于比较基本类型,通常用于比较对象是否相等。equal是Obeject类中的方法,所有对象都可以重写这个方法来自定义对象的比较方式。
如何理解自动拆箱和装箱
拆箱:包装类型-》基本类型
装箱:基本类型-》包装类型
// 自动装箱
Integer a = 100;
// 自动拆箱
int b = a;
自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX);
自动拆箱,相当于Java编译器替我们执行了Integer.intValue(XXX);
频繁的拆装箱会影响系统的性能。例如:
// 这里应该使用 long 而不是 Long
Long sum = 0L;