1、final、finally、finalize有什么不同?
final:
用来修饰变量时,如果值为基本类型,则不可修改,如果值为引用类型,那么引用不可修改,引用的对象是可以修改的。
用来修饰方法时,表示方法不可以重写。
用来修饰类时,表示class不可继承扩展。例如String类。
finally:
通常与try-finally、try-catch-finally一起用,保证finally中的代码一定被执行。通常在此部分进行释放资源、关闭JDBC连接等操作。不过使用try-with-resource会更好。
finalize:
当对象被筛选认为需要被回收时,会被执行finalize方法。此方法不推荐使用,目前已被标记为deprecated。
2、static的作用?
static修饰的变量叫静态变量,在类加载时,就会被加载到运行时常量池中,在类第一次初始化时被赋值。此类所有实例引用的静态变量都是同一个内存地址。类所有的实例都共享静态变量,可以通过类名来访问它。
static修饰的代码块叫静态代码块,在类加载中只会执行一次,它和静态变量按照先后顺序执行。
static修饰的方法是静态方法,不能被重写,不能使用this或super关键字,不能是抽象方法,可以直接使用类名来调用。表示这个方法是属于这个类的,而不是具体某个对象的。
static修饰的类是静态内部类。它不依赖外部类,且不使用外部类的非静态变量与方法。
运行顺序
父类的静态变量、静态语句块→子类的静态变量、静态语句块→父类的实例变量、普通语句块→父类的构造函数→子类的实例变量、普通语句块→子类的构造函数
3.String、StringBuffer、StringBuilder的区别
String是final类,不可变,拼接、裁剪都会产生新的String对象,相关操作效率比较低。
StringBuffer是一个线程安全的可修改字符序列,也因为线程安全,带来了额外的性能开销。
StringBuilder的功能和StringBuffer是一样的,去掉了线程安全的部分,是进行字符串拼接最快的。
在开发中避免创建重复的字符串,可以有效降低内存消耗和对象创建开销。Java6后的String有intern()方法,可以将相应字符串缓存起来。
4.什么是内部类?内部类的作用?
内部类是定义在类的内部的类。
作用:
- 提供更好的封装,只有外部类才能访问内部类。
- 内部类作为独立类,可以实现接口而不受外部类的影响。
- 便于回调函数的编写(匿名内部类)。
- 外部类不能直接访问内部类的属性和方法(需要通过内部类的实例),而内部类可以直接获取外部类的方法和属性。
5.反射的基本用法
获取类对象:
Class a = Class.forName("A");
Class b = A.class;
Class c = new A().getClass();
创建对象:
Class a = Class.forName("A");
//构造器
Constructor<A> c = a.getConstructor();
//实例化
A b = c.newInstance();
获取、设置变量
//访问属性
Field f1 = a.getDeclaredField("num");
//设置可访问
f1.setAccessible(true);
//设置属性
f1.set(b, 5);
getField()方法只能获得public属性,getDeclaredField()可以获得所有字段,除了继承来的字段。如果是private的属性,在设置前要加上setAccessible(true)
,否则会报IllegalAccessException:
异常。
获取、使用方法:
//获取方法
Method m = a.getMethod("setNum", int.class);
//对实例b使用方法
m.invoke(b, 6);
6.int和Integer的区别
int是基本数据类型,Integer是int的包装类,有一个int类型的字段存储数据,并提供了基本操作,还具有自动装箱和自动拆箱的功能。
自动装箱:Integer i = 1;
自动拆箱:iint j = i ++
7.谈谈对多态的理解
多态:父类引用指向子类对象。Super s = new Son();
关键是继承、重写、父类引用指向子类对象。
子类重写父类的成员方法后,调用此方法,实际上执行的是子类的方法。但是如果重写成员属性、静态属性、静态方法,执行的还是父类的。
8.抽象类和接口的区别
接口对行为进行抽象,是抽象方法的集合。其属性都是public static final的,方法只有抽象方法和静态方法。一个类可以实现多个接口,使用implements关键字。与其他类是HAS-A的关系。
抽象类用abstract修饰,目的是为了代码重用,与其他类是IS-A的关系。一个类只能继承一个抽象类,使用extends关键字。
9.重载和重写的区别
重载是在一个类中,方法名相同,但参数列表不同的方法。
重写是在继承体系中,子类重写父类的方法。
10.super的用法
- 访问父类的构造函数。
this()是调用本类的构造函数,super调用的是父类的。都只能写在第一行,且不能多次调用 - 访问父类的成员
如果子类覆盖了父类的方法,可以使用super来调用父类的方法
11.多线程的常用方法
启动线程
- 实现Runnable
public class A implements Runnable {
@Override
public void run() {
System.err.println("thread1");
}
}
// call
Thread t = new Thread(new A());
t.start();
- 继承Thread,重写run方法
public class A extends Thread {
@Override
public void run() {
System.err.println("thread2");
}
}
//call
Thread a = new A();
a.start();
- 匿名内部类
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.err.println("thread3");
}
});
t.start();
}
常见方法
Thread.sleep(t)
:当前线程暂停t毫秒
t.join();
:线程t加入到主线程中
t.setPriority()
:设置线程的优先级
Thread.yield()
:当前线程暂停,使其他线程可以占用CPU资源
t.setDaemon(true)
:将线程设为守护线程,当其他线程都停下时,就会自动结束守护线程。
网友评论