Q:面向对象编程的四大特性及其含义?
抽象,封装,继承,多态
个人理解
抽象:现实世界中事物的共同特征提取出来的过程,把现实中的一个业务问题转换为面向对象领域的东西
封装:把抽象出来的属性,行为封装到类中,类中的(private)属性、行为不能被外界访问,封装好的模块应该满足高内聚低耦合
继承:是代码重用的一种方式,子类可以继承父类的部分属性、方法
多态:建立在继承之上,不同对象对同一消息做出不同的反应,多态的条件(继承,方法覆写,父类引用指向子类对象)
Q:String、StringBuffer和StringBuilder的区别?
String被设计为final类,不可以被继承,String是字符串常量,内部是一个final字符数组
/** The value is used for character storage. */
private final char value[];
即指向String的引用是不可变的,任何对String的操作(subString,indexOf,concat...)都不能改变这个字符串,这些操作会形成新的一个字符串对象,和原本的字符串是不同的地址
不可变有不可变的应用场景和好处(安全),比如说不可变对象作为临界资源,在多线程的情况下,不用担心该资源的改变,省去了锁的操作
StringBuffer和StringBuilder都是字符串变量,主要操作是append、insert
/**
* The value is used for character storage.
*/
char[] value;
StringBuffer是线程安全的(内部很多方法上都被synchronized关键字修饰),使用效率比较低,相对StringBuilder是非线程安全的,效率较高
Q:String a=""和String a=new String("")的的关系和异同?
两者都创建了一个空字符串
String a = "" 如果常量池中没有空串,则在常量池中创建
String a = new String(“”) 如果常量池中没有空串,则在常量池中创建,并且在堆中也创建一个空间
Q:Object的equal()和==的区别?
一样,都是比较的对象地址
Q:装箱、拆箱什么含义?
装箱:基本类型—》引用类型
拆箱:引用类型—》基本类型
Q:遇见过哪些运行时异常?异常处理机制知道哪些?
空指针异常、类型转换异常,算数异常,数组下标越界,OOM等
Q:什么是反射,有什么作用和应用?
反射:在运行时动态的获取类的属性、方法
eg:JDBC连接数据库加载驱动时:Class.forName("xxxxx")
Spring中很多地方使用到了反射,在xml中bean的配置,测试类中通过 application.getBean("xx")动态得得到该类得实例
特点:在编译时使用了不知道的类
Q:什么是内部类?有什么作用?静态内部类和非静态内部类的区别?
内部类本身是外部类的一个属性
分类:
成员内部类:private class InnerClass{}
静态内部类:static class staticClass{}
局部内部类:在方法内部的类
匿名内部类:
/**
匿名内部类没有名字,只能使用一次
*/
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类...");
}
});
非静态内部类使用时先创建外部类对象才能创建内部类对象,静态内部类可以直接创建
静态内部类只可以访问外部类的静态成员,非静态类都可以访问
非静态内部类有指向外部类的引用,静态内部类则没有
作用:控制作用域,节约代码(匿名内部类),实现多继承,扩展功能
Q:final、finally、finalize()分别表示什么含义?
final修饰变量-》常量,修饰方法-》不可被重写,修饰类-》不可被继承
finally异常捕获机制,try-catch-finallly,无论是否发生异常都会执行的代码块
finalize()回收对象
Q:重写和重载的区别?
都是多态性的体现
方法重载:方法名相同,形参表不同,编译时就能确定调用哪个方法(静态)
方法重写:函数声明部分完全相同,运行时才能确定调用哪个方法(动态)
Q:抽象类和接口的异同?
Q:为什么匿名内部类中使用局部变量要用final修饰?
Q:Object有哪些公用方法?
clone():创建一个对象的副本(深克隆/浅克隆)
getClass():获得运行时类
equal():判断对象是否相等
hashCode():返回该对象的hashcode
finalize():回收对象
线程同步的方法:wait(),notify(),notifyAll()