java/javaee基础面试问题

时间:2021-07-28 19:04:13

1.面向对象和面向过程的区别对比:

面向对象易维护、易扩展、易复用,由于面向对象继承、封装、多态的特性,可以设计低耦合的系统易于维护,但因为类的实例化开销较大,所以面向过程性能更高,一般性能是最主要的因素时采用面向过程开发,它没有面向对象那么易维护易扩展易复用。

 

2.java语言的特点

跨平台、面向对象,支持多线程、支持网络编程。

 

3.JVM,JDK,JRE都是什么

jvm是运行java字节码的虚拟机,对不同的系统又不同的实现,让相同的代码在不同的机器上都能出一样的结果。

JRE是java的运行环境,它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。

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

 

4.什么是java字节码

jvm可以理解的代码就是字节码,(就是扩展名是.class文件),它不需要任何特定的处理器,只面向虚拟机。jvm和字节码实现一次编译随处运行。

 

5.从java代码到运行起来又哪些步骤?

java源代码通过jdk中的编译器编译生成jvm理解的lava字节码,然后jvm可以运行字节码。

 

6.java和c++区别是什么?

都是面向对象语言,都支持封装、继承和多态。c++可以操作指针,Java 不提供指针来直接访问内存。Java 的类是单继承的,C++ 支持多重继承;java的接口可以多继承。Java 有自动内存管理机制,不需要程序员手动释放无用内存。

 

7.构造器是否可以被重写?

构造器不可以,在继承的时候,子类也无法获得父类的构造器和私有的属性。一般要用父类的构造器都是用super,加载顺序?先加载父类吧,那super什么时候执行?

补充:可以重载。

 

8.说说面向对象

面向对象有封装、多态继承三个特征。

封装是属性私有化,对外提供访问的方法,继承可以通过继承父类实现方法的复用,多态是声明父类指向子类的实例。

好处是什么?常用的场景

 

9.String,StringBuffer,StringBuilder的区别,为什么String不可变

1.String是不可变的,StringBuffer,StringBuilder可变

2.线程安全上的差别,String因为不可变是线程安全的的,StringBuffer加了同步锁也是线程安全的,StringBuilder线程不安全。
使用上的选择:如果字符串不会更改,使用String类。如果字符串可以更改并且只能从单个线程访问,则使用a StringBuilder就足够了。如果字符串可以更改,并且将从多个线程访问,请使用StringBuffer。
 
10.java中定义一个不做事且没有参数的构造方法是干什么的?
java程序在执行子类的构造方法的时候,如果没有一个super明确调用一个父类的构造方法,就会调用父类无参数的构造方法,为了防止子类不写super发生编译错误,就加上一个没有参数的构造方法。
 
11.类可不可以不写构造方法?
如果类一个构造方法都没写,那默认会给它一个无参的。
 
12.接口和抽象类的区别:

  从设计层面上看,抽象类提供了一种 IS-A 关系,子类对象必须能够替换掉所有父类对象(里氏替换)。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。看不 明白

从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。

接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。

接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。

接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,从 Java 8 开始,接口也可以拥有默认的方法实现,因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。

备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。

 

13.对象相等和引用相等的区别:对象相等比较的是内存中的内容,引用比较的是地址

 

14.==和equals,==对于基本类型比较值,对于引用类型比较地址;equals方法如果没有被覆盖和==一样,如果被覆盖了就根据内容比较。42 == 42.0为什么是true

 

15.为什么重写equasl的时候也要重写hashCOde?

因为equals()用来判断两个对象是否等价,hashCode是根据对象的内容算出散列值,要求等价的两个对象散列值一定相等,所以 equals()的时候应该一起覆盖hashcode(),保证等价的两个对象散列值也相等。
 
16。线程,程序,进程
程序是静态的概念,是静态的代码,进程是程序的一次执行过程,是资源分配和调度的基本单位。
 
17.关于final关键字
 final修饰的基本类型数据,那么值不可改变,如果是引用类型,那么引用不可变。
 final修饰一个类,那么类不能被继承,
 final修饰的方法,在继承体系中可以防止子类重写。
 
18.java中的异常
异常的祖先是Throwable类,下面有Error和Exception两个子类,Error一般是程序运行时jvm出现的问题,比如oom,Exception是程序本身可以处理的异常。
finally哪怕try和catch里面有return也会执行。
 
19.什么是受检异常和非受检异常?
受检异常是编程错误,自己无法预料的,所有 RuntimeException和它的子类还有 Error,他们不需要不需要在编译的时候处理。
受检异常是可以恢复的,比如读写文件要catch IOException。
 
20.java序列化中有些字段不想序列化怎么办?
对不想序列化的变量用transient。
transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
 
21.static的用法:
 修饰变量和方法。被static修饰的东西放在方法区。
 静态代码块(静态代码块—>非静态代码块—>构造方法,该类不管创建多少对象,静态代码块只执行一次)
 静态内部类。
 静态倒包。
 
22.Java反射
 
23.对象的深浅拷贝
在拷贝的时候,如果对于基本数据类型进行值传递,对于引用数据类型进行引用传递,那么就是浅拷贝。
深拷贝是基本类型值传递,引用类型创建一个新对象,并复制其中的内容是深拷贝。
 
java中的clone(),来自Object类,无论深浅拷贝都用它。
https://segmentfault.com/a/1190000010648514
 
来自https://github.com/Snailclimb/JavaGuide