Java 面试题基础(一)
- 前言
- 1、面向对象的特征有哪些方面?
- 2、访问修饰符的作用范围?
- 3、Java有哪些数据类型?
- 4、float f = 3.4; 是否正确?
- 5、short s1 = 1; s1 = s1 + 1;对吗? short s1 = 1; s1 += 1; 对吗?
- 6、int 和 Integer 有什么区别?
- 7、& 和 && 的区别?
- 8、static关键字有什么作用?
- 9、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
- 10、switch支持的数据类型?
- 11、数组有没有 length() 方法?
- 12、构造器(constructor)是否可被重写?
- 13、两个对象值相同(x.equals(y) == true),hash code也相同吗?
- 14、String 类是否可以继承?
- 15、值传递和引用传递的区别?
- 16、String 和 StringBuilder、StringBuffer 的区别?
- 17、重载和重写的区别,重载的方法和返回类型有关吗?
- 18、char 型变量中能不能存贮一个中文汉字,为什么?
- 19、抽象类(abstract class)和接口(interface)有什么异同?
- 20、Java 中会存在内存泄漏吗,请简单描述?
- 总结
前言
最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。
如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!
1、面向对象的特征有哪些方面?
- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义好的接口;
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类);
- 多态:特点是有继承/实现的关系;方法重写(子类重写父类的方法);有父类引用指向子类对象
- 抽象:特点是抽象类不能实例化,只能通过子类实例化;子类必须重写父类的所有抽象方法;不能与private、final、static共存。
2、访问修饰符的作用范围?
修饰符 | 当前类 | 同一个包 | 同一个包的子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | x |
default | √ | √ | x | x |
private | √ | x | x | x |
类的成员不写访问修饰时默认为 default。
抽象接口成员方法默认是public abstract 修饰的
抽象成员属性默认是public static final 修饰的
3、Java有哪些数据类型?
基本数据类型只有8 个:byte、short、int、long、float、double、char、boolean ;
除了基本类型,剩下的都是引用类型,类、接口、数组、集合(String和枚举也是类)。
4、float f = 3.4; 是否正确?
不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型会造成精度损失。
需要强制类型转换 float f = (float)3.4; 或者写成 float f = 3.4F。
5、short s1 = 1; s1 = s1 + 1;对吗? short s1 = 1; s1 += 1; 对吗?
第一个不对,1是int类型,因此 s1+1 运算结果也是int型,需要强制转换类型才能赋值给 short 型。
第二个正确,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
6、int 和 Integer 有什么区别?
Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
基本类型 | byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|---|
包装类型 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
7、& 和 && 的区别?
逻辑与&运算符 和 短路与&&运算符:二者都要求运算符左右两端的布尔值都是true,整个表达式的值才是 true。
而短路与&&运算符,如果&&左边的表达式的值是 false,右边的表达式就不会运算了,直接返回false。
8、static关键字有什么作用?
static修饰的变量或方法,可以通过类名直接访问,而不必创建对象。
静态变量或方法在内存中只有一个副本,而不是每次创建新的对象时都会创建一个新的副本。
9、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是 -11,
四舍五入的原理是在参数上加 0.5 然后进行下取整。
Math.random()方法是产生随机数字。
10、switch支持的数据类型?
switch支持的数据类型 byte、short、int、char、enum枚举,从 Jdk 1.7 开始,也支持字符串(String),
但是长整型(long)在目前所有的版本中都是不支持的。
11、数组有没有 length() 方法?
Java中数组没有 length()方法,只有 length 的属性。
String 有 length()方法。
JavaScript 中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。
12、构造器(constructor)是否可被重写?
构造器不能被继承,因此不能被重写,但可以被重载。
13、两个对象值相同(x.equals(y) == true),hash code也相同吗?
相同,但反过来不一定,因此重写equals方法,必须也重写hashCode方法。
14、String 类是否可以继承?
String 类是 final 修饰的类,不可以被继承。
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {
15、值传递和引用传递的区别?
1、值传递改变形参的值不会影响实参的值,比如基本数据类型和String;
2、引用传递改变形参的值会影响实参的值,比如引用数据类型(类/接口/数组/集合)。
public static void main(String[] args) {UserDTO userDTO = new UserDTO("张三");int[] arr = {10};String a = "a1";this.test(userDTO, arr, a);System.out.println(userDTO.getName()); //输出:李四System.out.println(arr[0]); //输出:20System.out.println(a); //输出:a1
}
public static void test(UserDTO userDTO, int[] arr, String a){userDTO.setName("李四");arr[0] = 20;a = "a2";}
16、String 和 StringBuilder、StringBuffer 的区别?
- 1.基本区别
String的对象不可变,StringBuffer和StringBuilder的对象是可变的;
(String为字符串常量,而StringBuilder和StringBuffer均为字符串变量) - 2.性能区别
三者中StringBuilder执行速度最快,StringBuffer次之,String最慢; - 3.安全区别
String、StringBuffer是线程安全的,StringBuilder是线程不安全的
(如果程序是单线程使用StringBuilder效率高,如果是多线程使用StringBuffer或者String)。
- 共同点:
1.三者在java中都是用来处理字符串的;
2.三个类都被final修饰,因此都是不可继承的;
3.StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
17、重载和重写的区别,重载的方法和返回类型有关吗?
方法的重载(Overload)和重写(Override)都是实现多态的方式。
- 重载:发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载,重载和返回类型没有关系;
- 重写:发生在子类与父类之间,重写要求子类与父类有相同的返回类型,而且不能比父类声明更多的异常。
18、char 型变量中能不能存贮一个中文汉字,为什么?
char类型可以存储一个中文汉字,因为在Java中,char是用来存储Unicode编码的,一个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。当然,如果某个汉字没有包含在Unicode字符集中,那么是不能被char型变量存储的。
19、抽象类(abstract class)和接口(interface)有什么异同?
相同:1. 抽象类和接口都不能够实例化,即不能通过new创建对象;
2. 子类都需要对其中的抽象方法(没有方法体)全部进行实现,否则该类仍然需要被声明为抽象类。
3.都可以定义抽象方法、普通方法(都可以重写)和普通变量;
4. 都可以定义静态方法或静态变量(必须通过类或接口直接点方法名或变量名使用)
不同:1. 抽象类只能通过extends继承1个,接口通过implements可以实现多个;
2. 抽象类可以有构造函数,接口不可以;
3. 接口的静态变量或普通变量都必须是public final,抽象类随意。
20、Java 中会存在内存泄漏吗,请简单描述?
内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。
理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但被引用的对象,这些对象不能被 GC 回收,因此也会导致内存泄露的发生。
总结
都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!