Java基础面经知识总结上

Java基础面经知识总结上,第1张

基础概念与常识 JVM vs JDK vs JRE

JVM是运行Java字节码的虚拟机,针对不同系统有特定的实现(Windows,Linux,MacOs)。
JDK是功能齐全的Java SDK,包括JRE和编译器(javac)和工具(如javadoc和jdb)。能够创建和编译程序。
Jre是Java运行环境,他是运行已编译Java程序所需要的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构建。但是不能用于创建新程序。

什么是字节码?采用字节码的好处是?

在Java中,JVM可以理解的代码就叫字节码(即扩展名为.class的文件),它面向虚拟机,而不是特定的处理器。因此,Java程序无须编译便可在多种不同的 *** 作系统的计算机上运行。

    .java --> javac编译 --> .class文件 --> 解释器 & JIT --> 机器可理解的代码 --> 系统OS
  • 需要注意的是, .class->机器码 这一步,是JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行。所以说Java是解释与编译共存的语言。
Java与C++的区别?

共同点:

  • Java和C++都是面向对象的语言,都支持封装、继承、多态。

不同点:

  • Java不提供指针来直接访问内存,更加安全
  • Java的类是单继承,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承
  • Java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放内存
  • C++同时支持方法重载和 *** 作符重载,但是Java只支持方法重载( *** 作符重载增加了复杂性,这与Java最初的设计思想不符)
基本语法 字符型常量和字符串常量的区别?
  • 形式:字符常量是单引号引起的一个字符,字符串常量是双引号引起的0个或若干个字符
  • 含义:字符常量是一个整型值(ASCII值),可以参见表达式运算;字符串常量代表一个地址(该字符串在内存中的存放位置)
  • 占内存大小:字符常量只占两个字节;字符串常量占若干个字节
标识符和关键字区别

标识符是名字,关键字是被赋予特殊含义的标识符

静态方法为什么不能调用非静态成员?
  • 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才会存在,需要通过类的实例对象去访问。
  • 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法 *** 作。
静态方法和实例方法有何不同?
  • 调用方式:在外部调用静态方法时,可以使用类名.方法名的方式,也可以使用对象.方法名的方式,而实例方法只有后面这种方式。也就是说,调用静态方法无需创建对象。但是,一般不用对象.方法名的方式调用,因为静态方法不属于类的某个对象而是属于这个类。
  • 访问类成员是否存在限制:静态方法在访问本类成员时,只能访问静态成员(即静态变量和静态方法),不允许访问实例成员(即实例成员和实例方法),而实例方法不存在这个限制。
重载与重写的区别

重载是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当前子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆
盖父类方法

重载:

  • 同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。

重写:重写发生在运行期,是子类对父类允许访问的方法的实现过程进行重新编写。

  • 方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或者相等,抛出的异常范围小于等于父类,访问修饰符大于等于父类。(两同两小两大)
  • 如果父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够再次被声明
  • 构造方法无法被重写

综上:重写就是子类对父类方法的重新改造,外部样子不变,内部逻辑可以改变。

区别重载方法重写方法
发生范围同一个类子类
参数列表必须修改一定不能修改
返回类型可修改子类方法返回值类型小于等于父类方法返回值类型
异常可修改子类异常类小于等于父类异常类
访问修饰符可修改一定不能做更严格的限制(可以降低限制)
发生阶段编译器运行期
可变长参数

从Java5开始,Java支持定义可变长参数。可变长参数只能作为函数的最后一个参数,但其前面可以有也可以没有其他参数,可变长的范围指的是0个或者多个。

8种基本数据类型
基本类型位数字节默认值取值范围
byte810
short1620
int3240
long6480L
char162‘u0000’
float3240f
doule6480d
boolean1false

注意:

  1. Java里使用long类型的数据一定要在数值后面加上L,否则将作为整型解析。
  2. char a = 'h'char:单引号,String a = "Hello"String:双引号。String不是基本数据类型
基本数据类型和包装类型的区别?
  • 包装类型不赋值就是null,而基本类型有默认值且不是null
  • 包装类型可用于泛型,而基本类型不可以
  • 基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被static修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有的对象实例都存在于堆中。
  • 相比于对象数据类型,基本数据类型占用的空间非常小。

注意:基本数据类型放在栈中是一个常见的误区!基本数据类型的成员变量如果没有被static修饰的话(不建议这么使用,应该使用基本数据类型对应的包装类型),就放在堆中。

equals==

所有包装类对象之间的比较,全部使用equals方法比较

说明:对于Integer var = ?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但这个区间外的所有数据,都会在堆上产生,并不会复用已有对象,所以,推荐使用equals进行判断。
举例:

Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 true

Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// 输出 false

Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false
  • 两种浮点类型的包装类Float,Double并没有实现常量池技术。
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)会直接创建新的对象。
自动拆箱与装箱
  • 装箱:将基本数据类型用他们对应的引用类型包装起来
  • 拆箱:将包装类型转换为基本数据类型
    举例
Integer i = 10;  //装箱
int n = i;   //拆箱

参考:
https://javaguide.cn/java/basis/java-basic-questions-01.html
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
https://www.educba.com/oracle-vs-openjdk/
https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/732452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存