Java基础常见面试题:
1. String s1 = new St## 标题ring(“abc”) 在内存中创建了几个对象?
答案:一个或者两个,使用new关键字在堆中创建一个对象,另外,,首先确认’abc’有没有在常量池中创建,如果没在常量池中有的话,就会在常量池中再创建一个对象。所以1或2.
2.String为什么是不可变的对象?jdk源码的String是如何定义的?为什么要这么设计?
先了解一下何为不可变对象?不可变对象就是一旦创建后,其对象内部的状态不能被修改,不可变对象需要遵循下面几条原则:
- 不可变对象的内部属性都是final的.
- 不可变对象的内部属性都是private的.
- 不可变对象不能提供任何可以修改内部状态的方法,setter方法也不行.
- 不可变对象不能被继承和拓展.
下面说一下Stirng如何设计成不可变的?
String 类是一种对象,它是独立于 Java 基本数据类型而存在的,String 你可以把它理解为字符串的集合,String 被设计为 final 的,表示 String 对象一经创建后,它的值就不能再被修改,任何对 String 值进行修改的方法就是重新创建一个字符串。String 对象创建后会存在于运行时常量池中,运行时常量池是属于方法区的一部分,JDK1.7 后把它移到了堆中。
不可变对象不是真的不可变,可以通过反射来对其内部的属性和值进行修改,不过一般我们不这样做。
3.static 关键字是干什么用的?谈谈你的理解?
static 是 Java 中非常重要的关键字,static 表示的概念是 静态的,在 Java 中,static 主要用来
- 修饰变量,static 修饰的变量称为静态变量、也称为类变量,类变量属于类所有,对于不同的类来说,static 变量只有一份,static 修饰的变量位于方法区中;static 修饰的变量能够直接通过 类名.变量名 来进行访问,不用通过实例化类再进行使用。
- 修饰方法,static 修饰的方法被称为静态方法,静态方法能够直接通过 类名.方法名来使用,在静态方法内部不能使用非静态属性和方法
static 可以修饰代码块,主要分为两种,一种直接定义在类中,使用 static{},这种被称为静态代码块,一种是在类中定义静态内部类,使用 static class xxx 来进行定义。 - static 可以和单例模式一起使用,通过双重检查锁来实现线程安全的单例模式。
final 关键字是干什么用的?说一下你的理解?
final 是 Java 中的关键字,它表示的意思是 不可变的,在 Java 中,final 主要用来
- 修饰类,final 修饰的类不能被继承,不能被继承的意思就是不能使用 extends 来继承被 final 修饰的类。
- 修饰变量,final 修饰的变量不能被改写,不能被改写的意思有两种,对于基本数据类型来说,final 修饰的变量,其值不能被改变,final 修饰的对象,对象的引用不能被改变,