java基础面试题以及答案整理
1、Java有哪些数据类型
- 基本数据类型:【数值型:整数类型(byte,short,int,long)、浮点类型(float,double)】、【字符型(char)】、【布尔型(boolean)】;
- 引用数据类型:类(class)、接口(interface)、数组([])
其中基本数据类型
2、java中的访问修饰符
访问修饰符,主要用于设置类、属性、方法的访问级别,有以下四种:
修饰符 | 同一个类 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
public(公共的) | Y | Y | Y | Y |
protected(受保护的) | Y | Y | Y | |
default(默认的) | Y | Y | ||
private(私有的) | Y |
3、运算符&和&&的区别
两个运算符,都是与运算
&运算符不会短路,只有左右两端的表达式的布尔值,都是true,整个表达式是true;
&&运算符是短路
,左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算;
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
4、final 有什么用?
- 被final修饰的类不可以被继承;
- 被final修饰的方法不可以被重写;
- 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的;
5、final finally finalize区别;
-
final
可以修饰类、变量、方法
;修饰类表示该类不能被继承;
修饰方法表示该方法不能被重写;
修饰变量表示该变量是一个常量不能被重新赋值;
-
finally
一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法
finally代码块中;表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。 -
finalize
是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
6、this关键字的用法
this相当于是指向当前对象本身;
- 引用当前对象的方法、成员变量;
- 指向当前对象本身;
public class TestEntity {
private Integer age;
public TestEntity() {
}
public TestEntity(Integer age) {
this();
this.age = age;
}
public TestEntity setAge(Integer age) {
this.age = age;
return this;
}
}
7、break ,continue ,return 的区别及作用
-
break 跳出总上一层循环,不再执行循环(结束当前的循环体)
-
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
-
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
8、面向对象的特征有哪些方面
封装
:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
继承
:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
关于继承如下 3 点请记住:
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法(方法的重写)。
多态
:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
9、方法的重写与重载
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,如果父类方法访问修饰符为private则子类中就不是重写。
10、构造器(constructor)是否可被重写(override)
构造器不能被继承,因此不能被重写,但可以被重载。
11、== 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。
基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址;
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
- 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
- 类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
public static void main(String[] args) {
// String中的equals方法是被重写过的,比较的是对象的值
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
System.out.println(a == b);// false,非同一对象
System.out.println(a.equals(b)); // true
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
System.out.println(aa == bb); // true
System.out.println(42 == 42.0);// true
}
12、为什么重写equals时必须重写hashCode方法?
hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等的
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖;
13、java是值传递吗?
值传递;
当传的是基本类型时,传的是值的拷贝,对拷贝变量的修改不影响原变量;
当传的是引用类型时,传的是引用地址的拷贝,但是拷贝的地址和真实地址指向的都是同一个真实数据,因此可以修改原变量中的值;
当传的是String类型时,虽然拷贝的也是引用地址,指向的是同一个数据,但是String的值不能被修改,因此无法修改原变量中的值;
14、String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
可变性:
String类中使用字符数组保存字符串,private final char value[]
,所以string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。
线程安全:
String中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。