1.JDK 和JRE的区别
JDK 是 Java Development Kit 的缩写,是功能齐全的JavaSDK,拥有JRE的一切,还有编译器(javac)和工具(javadoc和jdb),能够创建和编译程序。
JRE是Java运行时环境,它是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机,Java类库,Java命令和其他的一些基础构件。 (不能用于创建新程序)
2.static和final的区别
static
- static可以修饰属性、方法、内部类、代码段
- static修饰的属性初始化在类加载的时候(编译期),初始化之后可以修改
- static修饰的属性所有对象共享这一个值(并且唯一)
final
- final可以修饰属性、方法、类、局部变量
- final修饰的属性的初始化可以在编译器也可以在运行期,初始化后不能改变
- final修饰的属性表明是一个常量
- final修饰的方法不能在子类中被重写
- final修饰的类不能被继承
3.静态方法为什么不能调用非静态成员?
- 静态方法是属于类的,在类加载时分配内存,可以通过类名直接访问。而非静态成员属于实列对象,只有在对象实列化之后才存在,需要通过类的实例化进行访问。
- 在非静态成员不存在时,静态方法已经存在了,此时调用在内存中不存在的非静态成员是非法的。
4.为什么静态方法不能访问this和super?
静态方法是存储在静态区的,静态区会随着类加载器一起加载到内存中,此时并没有运行程序,也就没有实例化对象。而this
是表示当前对象的,super
表示父类的对象,没有实例化对象,因此也就不存在this
和super
5.抽象类和接口的区别
-
成员的区别
- 抽象类:
有构造方法,用于子类实例化
成员变量:可以是变量也可以是常量
成员方法:可以是抽象的,也可以是非抽象的 - 接口:
构造方法:没有
成员变量:只能是常量。默认修饰符:public static final
成员方法:JDK1.7只能抽象。默认修饰符 public abstract
JDK1.8可以用default
和static
开头的具体方法
-
类和接口的关系区别
- 类与类: 继承关系,只能单继承
- 类与接口:
实现关系,可以单实现,也可以多实现,类还可以在继承一个类的同时实现多个接口 - 接口与接口:
继承关系,可以单继承,也可以多继承
-
设计理念区别
- 抽象类里面定义的都是一整个继承体系中的共性内容
- 接口是一个功能的集合,类似一个工具,需要使用就通过实现使用,是一种定义出来的规则和约束。
6.选择使用接口和抽象类的依据
- 抽象类关注对象是什么,比如手机、电脑、平板 三个类 的抽象类可以是 电子类,三者都是电子产品,都有CPU。接口关注对象能做什么,比如发消息、打电话,前者手机、电脑、平板都可以,而后者只能手机和平板。(因此可以实现两个接口,类需要哪个接口就实现哪个)
- 由于单继承并且抽象类需要编写子类的所有共性,因此抽象类功能丰富,但是成本较高。接口在功能上弱化很多,但是成本低,方便使用。
7.String StringBuffer StringBuilder的区别和联系
- String在JDK1.8之前底层是被final修饰的char型数组,且string对象也被final修饰,string不可继承和修改。
public final class String
{
private final char value[];
}
StringBuffer
和StringBuilder
均继承抽象类AbstractStringBuilder
,底层实现是char类型的数组,没有被final修饰是可以改变的,区别在于StringBuffer
的方法都是被synchronized
修饰的,是线程安全的,适合多线程环境,但是执行效率较低- 对于字符串的拼接,String每次都会生成一个新的String对象到堆中,极大的消耗了内存,当内存不足进行垃圾回收会影响系统性能,而
StringBuffer
和StringBuilder
的append方法返回的是自身,节约了资源
注: JDK1.8之后String
、StringBuffer
、StringBuilder
底层实现全改成了 byte类型的数组
public final class String
{
private final byte[] value;
}