前言
随着对Java学习的不断深入,愈发意识到无论是SSM框架、SpringBoot又或者是SpringCloud微服务架构,都是建立在Java基础上的,Java基础对于日后的发展与提升意义重大,因此回过头来结合面试题来对Java基础做一个总结,用于回顾复习与提升自己,同时也作为自己之后的面试复习资料。
1. 面向对象的特征有哪些方面?
- 抽象:抽象是忽略一个主题中与当前目标无关的内容,以便于能够更加充分地注意与当前目标有关的内容。抽象并不打算了解所有的内容,只是选择其中的一部分,并不关心具体的细节。抽象包括两个方面,过程抽象和数据抽象。
- 封装:封装就是将过程和数据包裹起来,对数据的访问只能通过已经定义好的接口。面向对象计算始于这一基本概念,即现实世界可以被描绘为一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其它对象。
- 继承:继承是一种联结类的层次结构,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
- 多态:多态是指允许不同类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,因此很好的解决了应用程序函数同名的问题。
2. 作用域public、private、protected写以及不写时的区别?
作用域 | 当前类 | 同包类 | 子孙类 | 其他类 |
public | √ | √ | √ | √ |
private | √ | × | × | × |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
- public修饰的成员变量和函数可以被当前类、子孙类、同包类以及任意其他类访问。
- private修饰的成员变量和函数只能在当前类中被访问。
- protected修饰的成员变量和函数能被当前类、子孙类以及同包类访问。
- 不写作用域修饰符时默认为default,但是这个单词不能写出,否则会报错
3. String 是最基本的数据类型吗?
String不是最基本的数据类型,String是引用类型,底层维护的是char类型的数组
4. short s1=1; s1=s1+1;有什么错?short s1=1; s1+=1;有什么错?
执行short s1=1;
后s1的类型:
short s1 = 1; s1 = s1 + 1;
对于short s1 = 1; s1 = s1 + 1;
来说,在进行s1= s1 + 1;
运算时会自动提升表达式的类型为int
,所以将int
类型的变量赋予short
类型的变量s1会出现类型转换的错误
short s1 = 1; s1 += 1;
对于short s1 = 1; s1 += 1;
来说,+=是Java语言规定的运算符,Java编译器会对其进行特殊的处理,因此可以正确编译
5. Java 有没有goto?
goto是Java中的保留字,现在没有在Java中使用
6. int 和Integer 有什么区别?
- Integer是int类型的包装类,int则是Java的一种基本数据类型。
- Integer变量必须实例化之后才能使用,而int类型的变量不需要。
- Integer实际是对象的引用,当new一个Integer对象时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
- Integer的默认值是null,int的默认值是0.
7. &和&&的区别?
&即可以作为位运算符表示按位与运算,也可以作为逻辑运算符,&&只能作为逻辑运算符,表示逻辑与(and),有短路(当左侧判断条件为false时就不会去执行右侧的判断条件)的作用。
当&作为逻辑运算符时即使左侧条件为false
也会去执行右侧的条件,而&&左侧的条件为false
时就不会去执行右侧的判断条件。
8. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?
- 条件操作只能操作布尔型类型的数据,而逻辑操作不仅可以操作布尔型的数据,而且可以操作数值类型的数据。
- 逻辑操作不会产生短路。
9. Stack 是什么?
Stack称为栈,是一种线性集合,也可以说是一种操作受限的线性表,其添加和删除元素都按照先进后出(后进先出)的原则来处理。
10. switch是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
switch(express)中,express 是一个整数表达式,支持的参数参数有:byte、int、short、char、String与enum(枚举类型)。
11. 数组有没有length()方法? String有没有length()方法?
数组没有length()方法,有length的属性。String有length()方法。
12. 构造器Constructor 是否可被Override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
13. String 类是否可以被继承?
String类是final类,因此不可以继承。
14. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里是值传递还是引用传递?
这里是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
15. String和StringBuffer的区别?
相同点:String和StringBuffer类都可以储存和操作字符串( 即包含多个字符的字符数据 )。
不同点:String类提供了数值不可改变的字符串。而StringBuffer类提供的字符串可以进行修改。
16. String、StringBuffer、StringBuilder的区别?
可变与不可变:
- Stirng对象是不可变的
- StringBuffer和StringBuilder的对象是可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder类中也是使用字符数组保存字符串,但是并未使用final修饰,因此StringBuffer和StringBuilder为可变的。
是否多线程安全:
- String中的对象是不可变的,因此线程安全。
- StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。
- StringBuilder并没有对方法进行加同步锁,因此线程是不安全的。
如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer
17. Overload 和Override的区别? Overloaded的方法是否可以改变返回值的类型?
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,可以说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
18. 描述一下JVM加载Class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
19. Java中会存在内存泄漏吗?
会;Java中可能会存在无用但可达的对象,这些对象不能被GC 回收,导致耗费内存资源。
20. 静态变量和实例变量的区别?
静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。
21. 是否可以从一个static方法内部发出对非static方法的调用?
不可以。static方法是静态方法,是属于类的方法,非static方法是属于对象的方法。因为非static方法是要与对象关联在一起的,必须在创建出一个对象后,才可以通过这个对象调用非static方法;而static方法可以直接通过类名来调用,不需要创建对象。也就是说,在一个static方法被调用时,还可能没有创建任何实例对象,此时如果从static内部发出对非static方法的调用,非static方法是无法关联到对象的
22. GC 是什么? 为什么要有GC?
GC是垃圾收集(Gabage Collection)
因为内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
23. String s = new String(“str”);创建了几个String Object?
两个对象,一个是"str",一个是指向“str”的引用对象s。
24. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?
接口可以继承接口,抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。
25. 一个“.java”源文件中是否可以包含多个类(非内部类)?有什么限制?
可以,但是必须只有一个类名与文件名相同。
26. 内部类可以引用他包含类的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的内容。
27. 在Java中一个类被声明为final 类型,表示了什么意思?
表示该类不能被继承,是顶级类。
28. 字符串操作:如何实现字符串的反转及替换?
可以使用字符串构造StringBuffer的对象,然后调用StringBuffer中的reverse方法即可实现字符串的反转。调用replace方法即可实现字符串的替换。
29. 怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串?
示例代码:
String str = "世纪末的架构师"; String result = new String(str.getBytes("GB2312"),"ISO-8859-1");
30. Java中的异常处理机制的简单原理和应用?
当Java程序违反了Java的语义规则时,Java虚拟机就会将发生的错误表示为一个异常。违反语义规则包括两种情况。
- 一种是Java类库内置的语义检查。例如数组下标越界,会引发
IndexOutOfBoundsException
访问null的对象时就会引发NullPointerException
。 - 另一种情况就是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw 关键字引发异常。
所有的异常都是java.lang.Thowable 的子类