Java常见问题收集
正在学习, 持续更新,欢迎大佬指正
Java 虚拟机 (JVM - Java Virtual Mechine)
简述Java语言跨平台原理
Java虚拟机处于机器和编译程序之间,在任何平台上都提供给编译程序一个共同的接口。它的主要任务是装载class文件并且执行其中的字节码。Java源程序首先被编译生成一个字节码(bytecode)中间表现形式,然后Java虚拟机对得到的字节码加以解释执行。虽然不同平台有不同的虚拟机,但是编译的字节码文件是相同的。且Java虚拟机在整个JDK中处于最底层,负责于操作系统的互交,屏蔽操作系统的环境,提供一个完整的java运行环境。它只需把字节码翻译成为对应的机器语言,这样Java程序就可以在多种平台上不加修改地运行。
Java实现方法(补充Java语言跨平台原理)
Java实现方法 Java有两种实现方法:Java方法和本地方法。Java方法是由Java 语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码,保存在动态连接库中,格式是各个平台专有的,它是联系Java程序和底层主机操作系统的连接方法。Java方法与平台无关,但是本地方法却不是,运行中的 Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。通过本地方法, Java程序可以直接访问底层操作系统的资源,使程序和特定的平台相关,一个本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主机系统的任何一个Java平台上运行。
Java基础
char型变量中能不能存贮一个中文汉字,为什么?
可以。因为Java中char类型变量占用两个字节,采用的也是占用两个字节的Unicode编码。而Unicode编码字符集中是包含中文字符的,所以char型变量是可以存储汉字的。但是如果某个特殊的汉字没有被包含在unicode编码字符集中,那么这个char型变量中就不能存储这个特殊汉字。
补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。
&和&&的区别
&(按位与)和&&(逻辑与)都可以作为逻辑运算符。他们最大的区别在于,&&具有短路功能,就是当第一个表达式为false就不再计算第二个表达式。而&没有短路功能,则需要计算两个表达式。
除此之外,还有一个不同就是,&&不支持位运算,而&还可以用作位运算符表示按位与操作,就是两个表达式的值按二进制位展开,对应的位(bit)按值进行“与”运算。
==和equals()的区别
在比较基本数据类型时(int, char等),“==” 可以用来比较该值是否相同,而equals() 无法比较基本数据类型变量。
在比较两个对象时, “==” 是对所指向对象的地址进行比较,即引用是否相同;而 equals() 是对字符串的内容进行比较,即地址上的值是否相同。
GC介绍
不再使用的内存空间应当进行回收。JVM提供了一种系统线程跟踪储存空间的分配情况。并在JVM空闲时,检查并释放那些可以被释放的内存空间。(忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。)
数据类型
整型: byte, short, int, long; 浮点: float, double, 字符型char, 布尔型 boolean
权限修饰符
访问修饰符 | 同一个类 | 同包 | 不同包,同子类 | 不同包。不同子类 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
Java面向对象
面向对象是相对于面面过程来说,指的是把相关的数据和方法组织成为一个整体来看待,更高层次来进行系统建模,更贴近事物的自然运行模式。从执行者到指挥者的转变。
封装性:所有的内容对外部不可见 (getter/setter)
继承性:将其他的功能继承下来继续发展
多态性:方法重载本身就是一个多态性的体现
多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
接口和抽象类的区别
- 接口要被类实现, 可以多实现;抽象类要被子类继承,不能多继承。
- 接口只能声明抽象方法;而抽象类中既可以声明抽象方法,也可以写非抽象方法。
- 接口里定义的变量只能是公共的静态的常量(public static final);而抽象类中的变量是普通变量。
- 抽象类中可以包含static方法 ,但是接口中是不允许的。(因为静态方法不能被子类重写,因此接口中不能声明静态方法)
- 接口不能有构造方法;而抽象类可以有。
正在学习, 持续更新,欢迎大佬指正