java基础面试题

 JVMJREJDK的关系

1.JDK(Java Development Kit),java开发工具包,它是一种用于构建在 Java 平台上发布的应用程序、applet 和组件的开发环境。其中包括了Java编译器、JVM、大量的Java工具以及Java基础API。
我们在安装了JDK之后,在bin目录下,存放了许多开发工具。常用的有javac.exe(编译工具),将java文件编译成字节码文件(后缀为.class);java.exe(运行工具),运行编译后的字节码文件。

2. JRE
JRE(Java Runtime Environment),java运行环境 。包含JVM标准实现及Java核心类库。它不包含任何开发工具-编译器、调试器和其它工具。

3. JVM
JVM(Java Virtual Machine),JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”

4. 三者之间的关系
JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。
JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。

 注意:JVM并不代表可以执行class,因为JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar

java 有哪些数据类型?

 

int的取值范围为:-2^31 ---- 2^31-1 ,即:-2147483648 - 2147483647
那么为什么会这样取值呢?
在计算机当中数据都是以01二进制形式存储的,而整型变量int占的是4个字节,一个字节8位,也就是32位,所以一个整型变量在计算机当中其实可以用32位的二进制来表示。

Integer a = 1000,Integer b = 1000,a==b 的结果是什么?那如果 a,b 都为1,结果又是什么?

Integer a = 1000,Integer b = 1000,a==b 结果为「false」

Integer a = 1,Integer b = 1,a==b 结果为「true」

这道题主要考察 Integer 包装类缓存的范围,「在-128~127之间会缓存起来」,比较的是直接缓存的数据,在此之外比较的是对象

BigDecimal在使用double或者float这些浮点数据类型时,会丢失精度,String、int则不会

 

 

 问题就处在 doubleToRawLongBits 这个方法上,在jdk中double类(float与int对应)中提供了double与long转换,doubleToRawLongBits就是将double转换为long,这个方法是原始方法(底层不是java实现,是c++实现的)。double之所以会出问题,是因为小数点转二进制丢失精度。BigDecimal在处理的时候把十进制小数扩大N倍让它在整数上进行计算,并保留相应的精度信息。所以,在涉及到精度计算的过程中,我们尽量使用String类型来进行转换。

创建对象有哪些方式

  • 1、new关键字
Person p1 = new Person();
  • 2.Class.newInstance
Person p1 = Person.class.newInstance();
  • 3.Constructor.newInstance
Constructor<Person> constructor = Person.class.getConstructor();
Person p1 = constructor.newInstance();
  • 4.clone
Person p1 = new Person();
Person p2 = p1.clone();
  • 5.反序列化
Person p1 = new Person();
byte[] bytes = SerializationUtils.serialize(p1);
Person p2 = (Person)SerializationUtils.deserialize(bytes);

抽象类和接口有什么区别

  • 抽象类要被子类继承,接口要被子类实现。
  • 抽象类可以有构造方法,接口中不能有构造方法。
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量,它的变量只能是公共的静态的常量
  • 一个类可以实现多个接口,但是只能继承一个父类,这个父类可以是抽象类。
  • 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
  • 抽象级别(从高到低):接口>抽象类>实现类。
  • 抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。
  • 抽象类的关键字是abstract,接口的关键字是interface

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  • 假如有一个接口,五个实现类,现在的需求可能要往接口加一个方法,这样就要改动五个实现类,但需求只需要改动其中两个实现类,可以再定义一个抽象类去实现这个接口,在抽象类中新增这个方法,然后其他两个实现类实现这个抽象类就好了,或者使用 Java 8 中的新特性,在接口中新增默认方法或者静态方法

static

static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建
对象,也可以去访问

重载(Overload)和重写(Override)的区别。重载的方法能 否根据返回类型进行区分?

重写:

1.发生在父类与子类之间2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

重载:
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

1.重载Overload是一个类中多态性的一种表现 2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序) 3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

深拷贝和浅拷贝区别是什么?

  • 浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
  • 深克隆:既克隆基本类型变量,又克隆引用类型变量;

浅拷贝如何实现呢?

Object类提供的clone()方法可以非常简单地实现对象的浅拷贝。

深拷贝如何实现呢?

  • 重写克隆方法:重写克隆方法,引用类型变量单独克隆,这里可能会涉及多层递归。
  • 序列化:可以先讲原对象序列化,再反序列化成拷贝对象。

try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

常见的异常类有哪些?

NullPointerException:空指针异常;
SQLException:数据库相关的异常;
IndexOutOfBoundsException:数组下角标越界异常;
FileNotFoundException:打开文件失败时抛出;
IOException:当发生某种IO异常时抛出;
ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
NoSuchMethodException:无法找到某一方法时,抛出;
ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

 

待更。。。。。

posted @ 2022-04-14 15:59  Nausicaa0505  阅读(34)  评论(0编辑  收藏  举报