1.简单介绍一下关于继承和实现你的理解
(允许)Java中类与类之间的关系为继承,只能是单继承,但可以是多层继承,类与接口之间的关系为实现既可以単实现也可以多实现,接口与接口之间的关系为继承既可以单继承也可以多继承。
(不允许)不允许类多继承的主要原因是,如果A同时继承B和C,而B和C又同时有一个D的方法,A如何决定去继承哪一个呢?但是接口可以因为接口之间的关系全是抽象关系所以也就无所谓去继承谁了,所以接口可以继承多个接口
2.简单谈一下你对于抽象类还有接口的理解
(相同点)抽象类和接口都不能被实例化,要想实现接口或者继承抽象的普通子类必须实现这些抽象方法。
(不同点)抽象类中含有构造方法而接口中不含,抽象类中可以包含代码块和普通方法而接口中只能包含静态方法,默认方法和抽象方法,抽象类中的成员变量可以使任意类型的,但是接口中的成员变量只能是public static finally类型的而且必须赋值。
3.这里呢有一道关于线程的问题是(爱奇艺的面试题)
public class Thread1 {
public static void main(String[] args){
new Thread1().go();
}
public void go(){
Runnable r=new Runnable() {
@Override
public void run() {
System.out.println("foo");
}
};
Thread t=new Thread(r);
t.start();
}
}
这是一道很经典的线程题,在java多线程中实现多线程的方式有两种①extends Thread ②implements Runnable。这两种情况是我们最常见的,还有一种是由第二种变形而来的直接new Runnable(){},我们都知道java的接口是不可以实例化的,但代码中的new Runnable(){xxx}确是实例化了,为什么? 接口和抽象类不可以实例化是对的,这个是java语法规范来的,**而new Runnable(){}其实不是实例化Runnable接口来的,实际上一种内部类的一种简写** 在这里:
①首先构造了一个”implements Runnable “的无名local内部类(方法内的内部类)
②然后构造了这个无名local内部类的一个实例
③然后用Runnable来表示这个无名local内部类的type(OO多态)。 例如上面这段代码编译后你会看到其实是编译了两个类来的,如下:
其中Text2$1就是无名local内部内类,这个也就很好地解释了为什么在main()方法中new Runnable(){xxx}里面的调用main()方法中的变量的时候要用final关键字来修饰。
4.protected的访问权限是不是小于包的访问权限。
答案很显然不是的,因为我们知道Java类成员的控制访问权限关系是:public>protected>同包(default)>private,对于本题我给的建议是只要记住默认访问权限是整个package而protected是整个包还有其包含的子类也是很好区分这道题的。
5.简单介绍一下ThreadLcal类
ThreadLocal是采用哈希表的方法来为每个线程都提供一个变量的副本,ThreadLocal保证各个线程
数据的安全,每个线程的数据不会被另一个线程访问和破坏,还有就是我们要了解一下Synchronized用于线程之间的数据共享,而ThreadLoacl用于线程之间的隔离,ThreadLocal继承Object相当于没有继承什么人和特殊的,ThreadLocal没有实现任何接口,ThreadLocal并不是Thread而是Thread的局部变量