- 220101
- 1. “一次编写,到处运行“?
- 2. 一个Java文件里可以有多个类吗(不含内部类)?
- 3.说一说你对Java访问权限的了解
- 4. 介绍一下Java的数据类型
- 5. int数据范围
- 6. 全局变量、局部变量
- 7. 实例变量默认值
- 8. 为啥有包装类
- 9. 自动装拆箱的应用场景
- 10. 对Integer/Double如何判断相等
- 11. int和Integer有什么区别,二者在做==运算时会得到什么结果?
- 12. 面向对象是?
- 13. 它的三大特征是?
- 14. 封装是什么?为什么要有?
- 15. 多态是什么?
- 220102
- 16. Java中的多态是怎么实现的?
- 17. 为何只能单继承?
- 18. 重写和重载的区别?
- 19. 构造方法能否重写?
- 20. Object类中的方法
- 21. hashCode()和equals()的关系
- 22. 为何要重写hashCode()和equals()
- 23. ==和equals()有何区别
- 24. String方法
- 25. String能否被继承?
- 26. String和StringBuffer区别?
- 27. StringBuffer和StringBuilder区别?
- 28. 创建字符串时,推荐new还是”“?
- 29. 对字符串拼接的理解
- 30. 字符串相加的底层如何实现
- 31. String a = "abc"; ,说一下这个过程会创建什么,放在哪里?
- 32. new String("abc") 是去了哪里,仅仅是在堆里面吗?
- 33. 接口和抽象类有什么区别?
- 34. 接口中可以有构造函数吗?
- 35. 谈谈你对面向接口编程的理解
- 36. 遇到过异常吗,如何处理
- 37. 说一说Java的异常机制
- 38. Java的异常接口
- 39. finally是无条件执行吗?
- 40. 在finally中return会发生什么?
- 41. 对static关键字的理解
- 42. static修饰的类能不能被继承
- 43. static和final区别
- 44. 对泛型的理解
- 45. 泛型擦除是什么
- 46. List super T>和List extends T>有什么区别?
- 47. Java反射机制
- 48. Java反射在实际项目中有哪些应用场景?
- 49. 说一说Java的四种引用方式
答:JVM(java虚拟机)是实现Java跨平台的关键,充当桥梁。不同平台需要安装不同JVM,无需改动Java程序。
2. 一个Java文件里可以有多个类吗(不含内部类)?答:可以。只能有一个被public修饰的类,主类名必须与java文件名一致。
3.说一说你对Java访问权限的了解答:对成员变量/成员方法:
private:该成员可以被该类内部成员访问;
default:该成员可以被该类内部成员访问,也可以被同一包下其他类的成员访问
protected:该成员可以被该类内部成员访问,也可以被同一包下其他类的成员访问,还可以被其子类访问
public:任意包下,任意类的成员进行访问。
对类:
4. 介绍一下Java的数据类型default:同一包下其他类访问
public:任意包下任意类访问
答:基本数据类型:(前七种均可互相类型转换)
| 数据类型 | 数据范围 |
|---|---|
| byte | 1字节(8位) -27——27-1 |
| short | 2字节(16位) -2^15—— 2 ^15-1 |
| int | 4字节(32位) -2^31—— 2 ^31-1 |
| long | 8字节(64位) -2^63—— 2 ^63-1x |
| -3.4*10^38 ~ 3.4*10^38。 | |
| double | 8字节(64位) -1.8*10^308 ~ 1.8*10^308。 |
| char | 2字节(16位)u000 — ufff。 |
| boolean | 不同JVM有不同实现机制 |
引用数据类型:(本质是指针)要了解引用及引用对象存放的位置。
5. int数据范围数组、类、接口
答:4字节 32位 -231-231-1。
6. 全局变量、局部变量答:变量分为局部变量和成员变量。
成员变量
在类内定义;有默认初始值;static修饰的成员变量叫类变量,存储于方法区,生命周期与类相同;未被static修饰的成员变量叫实例变量,存储与对象所在的堆内存,生命周期跟对象相同。
局部变量
7. 实例变量默认值在方法里定义;无默认初始值;存储与栈内存,作用范围结束,空间自动释放。
答:
| 变量 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0F |
| double | 0.0 |
| char | ‘u0000’ |
| boolean | false |
答:Java是面对对象的语言,但8中基本数据类型不具备对象的特性,为了解决这个问题,Java为每个基本数据类型定义了一个对应的引用类型,就是包装类。
9. 自动装拆箱的应用场景答:自动装箱:把一个基本类型的数据直接赋值给对应包装类型。
自动拆箱:把一个包装类型的数据直接赋值给对应基本类型。
例如:参数为包装类型,数据为基本类型,直接传入。
10. 对Integer/Double如何判断相等答:无法比较。数据类型不同不能用==。转为char比较时,浮点数带小数点,整数不带。Compare to只能对相同类型进行比较。
11. int和Integer有什么区别,二者在做==运算时会得到什么结果?答:一个基本数据类型,一个包装类。比较时直接拆箱,==返回true,否则返回false。
12. 面向对象是?答:它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。尽可能运用人类的自然思维方式,将事物抽象地表示为系统中的类,作为系统的基本构成单元,这使得软件系统的组件可以直接映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌。
13. 它的三大特征是?答:封装、继承、多态。封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
14. 封装是什么?为什么要有?答:将对象的状态信息隐藏在对象内部,使得外部无法进行直接操作和修改。
可以实现以下目的:
- 隐藏类的实现细节;
- 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;
- 可进行数据检查,从而有利于保证对象信息的完整性;
- 便于修改,提高代码的可维护性。
答:即向上转型。Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,由系统自动完成。
当把一个子类对象直接赋给父类引用变量时,例如 baseClass obj = new SubClass();,这个obj引用变量的编译时类型是baseClass,而运行时类型是SubClass,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。
220102 16. Java中的多态是怎么实现的?答:将参数设为父类型,传参时可以传入父类型的某个字类型的实例,实现多态。
17. 为何只能单继承?答:Java中一个类只能有一个直接父类,而不能直接继承多个父类,但可以有任意多个间接父类。因为若两个父类中包含相同的方法时,子类在调用该方法或重写该方法时就会迷惑。
18. 重写和重载的区别?答:重写:子类重写父类允许访问的方法(除private、final、static外)。”两同两小一大“,方法名,参数必须相同;异常范围、返回值类型要小于等于父类方法;修饰符要大于等于父类方法。
重载:同一类中、父类子类间。方法名必须相同,其余可不同。
19. 构造方法能否重写?答:不能,构造方法必须与类名相同。如若子类重写父类构造方法,则子类中会有与类命不同的构造方法,矛盾。
20. Object类中的方法答:
| 方法名 | 作用 |
|---|---|
| Class> getClass() | 返回该对象的类 |
| boolean equals(Object obj) | 判断两个对象是否相等 |
| int hashCode() | 返回hashCode值 |
| String toString() | 返回字符串表示 |
答:hashCode返回该对象的hashCode值,equals则是判断两对象是否相同。即hashCode相等,equals不一定为true;若equals若为true,hashCode一定相等。
22. 为何要重写hashCode()和equals()答:默认的equals判断方法和我们实际需求往往不一致。hashCode通常与equals有联动关系,故需要一同重写。
23. ==和equals()有何区别答:==
-
基本数据类型: 判断值
-
引用数据类型: 判断两个对象的内存地址是否相同
equals
-
Object默认比较内存地址
-
重写后根据用户需求
答:可以看看部分方法的源码
- String[] split(String regex):以指定的规则将此字符串分割成数组;
- String trim():删除字符串前导和后置的空格;
- int indexOf(String str):返回子串在此字符串首次出现的索引;
- int lastIndexOf(String str):返回子串在此字符串最后出现的索引;
- boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;
- boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;
- String toUpperCase():将此字符串中所有的字符大写;
- String toLowerCase():将此字符串中所有的字符小写;
- String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子串;
- String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。
答:不能,由final修饰,是个不变类。
26. String和StringBuffer区别?答:String:不变类,一旦被创建,不可改变,直至被销毁。
StringBuffer:其对象代表一个字符序列可变的字符串,可使用toString转为String对象。
27. StringBuffer和StringBuilder区别?答:其对象均代表一个字符序列可变的字符串,但StringBuffer是线程安全的,StringBuilder时非线程安全的,性能略高。
28. 创建字符串时,推荐new还是”“?答:”“创建时,JVM会用常量池来管理这个字符串;new会创建对象,JVM会先使用常量池来管理直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。
29. 对字符串拼接的理解答:‘+’适用于两者均为直接量、StringBuilder适用于字符串包含变量且不要求线程安全、String Buffer适用于字符串包含变量且要求线程安全、String.concat适用于包含变量的2个字符串拼接。
30. 字符串相加的底层如何实现答:若为直接量,则编译器会直接优化为一个完整的字符串。若包含变量,则编译器会使用StringBuilder进行优化,自动创建StringBuilder实例并调用append方法。
31. String a = “abc”; ,说一下这个过程会创建什么,放在哪里?答:JVM使用常量池管理字符串直接量。执行过程:西安检查常量池中是否已经存在”abc“,若没有则存入常量池;若有,则复用,引用赋值给变量a。
32. new String(“abc”) 是去了哪里,仅仅是在堆里面吗?答:先将abc存入常量池,再创建String对象,保存在堆内存里,然后堆中对象数据再指向常量池中直接量。
33. 接口和抽象类有什么区别?答:接口是一种规范,规定能够调用哪些服务,该如何调用。抽象类体现了一种模板式设计,可以作为多个子类的抽象子类。
接口中只能包含抽象方法、静态方法、默认方法和私有方法,只能定义静态变量,不能定义普通成员变量,不包含构造器,不包含初始化块,可以实现多继承,即一个类可以直接实现多个接口。抽象类可以包含普通法,可以定义静态变量、普通成员变量,可以包含构造器、初始化块。
二者均无法被实例化,只能被实现和继承。他们都可以包含抽象方法,而其子类都必须实现这些抽象方法。
34. 接口中可以有构造函数吗?答:不可以。 参看33
35. 谈谈你对面向接口编程的理解答:可以降低耦合,提高系统可扩展性和可维护性。
36. 遇到过异常吗,如何处理答:捕获异常(try catch)、处理异常、回收资源
37. 说一说Java的异常机制答:处理异常的语句有try、catch、finally。try负责包裹业务代码,catch负责捕获和处理异常,finally用于回收资源。
当出现异常,系统会创建一个异常对象,由JVM需寻找可以处理该异常的catch块,并将异常对象交由它处理。除此之外,还可以使用throw主动抛出异常,交由JVM处理。而异常机制会逐层向外传递,直到main方法,则JVM终止程序,打印异常跟踪栈的信息。
38. Java的异常接口答:Throwable是顶层父类,直接子类分别是Error、Exception。
Error是错误,一般与虚拟机相关,无需使用catch捕获,无需抛出
Exception是异常,被分为Checked异常、Runtime异常。RuntimeException及其子类的实例被称为Runtime异常,其余都是Checked异常。Checked异常必须被显式处理,否则编译就会发生错误。Runtime异常则无需显式声明抛出,如需捕获,也可使用try catch实现。
39. finally是无条件执行吗?答:是,不论什么情况,finally总是被执行。除非在try…catch块中使用System.exit(1)直接退出执行。
40. 在finally中return会发生什么?答:finally中一般不要使用是方法终止的语句,如return、throw等,使用后会使try catch中的return、throw失效。因为在try catch块中遇到return、throw不会立刻执行,而是去找异常处理流程中是否包括finally块,若没有,则立刻执行终止方法。否则要先执行finally中的语句。
41. 对static关键字的理解答:可用于修饰类中的成员变量、方法、初始化块、内部类(接口、枚举),被其修饰的成员就是类成员,它属于类,并不属于单个对象。类成员不能访问实例成员。
42. static修饰的类能不能被继承答:可以。可用来修饰内部类,成为静态内部类。
43. static和final区别答:static可以修饰成员变量、方法、初始化块、内部类
类变量:属于类,存储在方法区,并不存储在堆中,建议通过类名访问。
类方法:属于类,建议通过类名访问。
静态块:类加载时被隐式调用,之后不会被调用
静态内部类:它内部包含静态和非静态成员。它不能访问外部类的实例成员,只能访问外部类的静态成员。
final可以修饰类、变量、方法
final类:不可被继承
final变量:一旦获得初始值,不可被修改
final方法:不可被重写
44. 对泛型的理解答:
泛型类:public class xxx
泛型接口:public interface Generator
泛型方法:public static
答:当把具有泛型信息的对象赋值给没有泛型信息的变量时,<>中的所有信息都会被擦除。
46. List super T>和List extends T>有什么区别?答:?是类型通配符,List>代表元素类型未知的List
List super T> 代表设置?的下限,即必须是T的父类
List extends T>代表设置?的上限,必须是T的字类。
47. Java反射机制答:反射使得运行中的Java程序可以获取自身信息,可以操作类或对象的内部属性。JVM在运行时才动态加载类/调用方法,访问属性,无需事先知道运行对象是谁。
- 获得Class对象
- 判断某个对象是否为某个类的实例,还可访问成员
- 创建实例
答:使用JDBC,使用反射加载驱动;框架配置是解析出的类是字符串,需要利用反射机制实例化;AOP的实现方案是在程序运行时创建目标对象的代理类,必须由反射机制实现。
49. 说一说Java的四种引用方式答:包括强引用、软引用、弱引用、虚引用。目的在于让程序员决定某些对象的生命周期,并且有利于JVM进行gc。
强引用:创建对象并赋值给引用变量,永远不会被垃圾回收
类似String str = 'abc'就是强引用
软引用:常用于内存敏感的程序里,只要内存足够,便不会被回收;一旦内存空间不足,就会被回收。
用SoftReference表示软引用
弱引用:相比软引用,级别更低,只要JVM进行垃圾回收,无论内存是否充足,都会被回收。
用WeakReference表示弱引用
虚引用:类似于完全没有引用,用于跟踪对象被垃圾回收的状态,必须和引用队列联合使用。
用PhantomReference表示软引用



