面试第一弹
1. 抽象类和接口的异同
- 相同点:
- 两者都不能被实例化
- 引用都可以指向子类对象
不同点:
方法实现:抽象类可以有实现的方法,而接口不存在方法的实现
构造器:抽象类可以有构造器,而接口不能有
修饰符:抽象类的普通成员变量可以被方法可以被private、public、default、protected修饰,抽象方法可以被public、default、protected修饰;而接口的变量默认被public static final 修饰,方法只能被public abstract修饰
继承:抽象类只能单继承、而接口可以多实现;抽象类通过extends继承,接口通过implements实现
添加新的方法:抽象类中可以不重写、而接口必须要重写
2.方法重写和重载
- 重载:重载是在同一个类中有多个同名但是参数列表不同的方法
- 重写:重写是子类定义与父类方法名相同、参数列表相同、返回值相同的方法
3.常见运行时异常(在java.lang包下)
java.lang.NullPointerException
空指针异常:调用未初始化的或不存在的对象
java.lang.ClassNotFoundException
指定类不存在
java.lang.IndexOutOfBoundsException
索引越界异常,访问某个序列的索引值大于等于序列长度
java.lang.ClassCastException
类型转换异常
4.反射
什么是反射?
指程序可以访问、检测和修改它本身的状态和行为的一种能力
这种能力有什么用?(用来做什么事)
获取类型的相关信息(Class对象的信息,成员变量、方法)
获取Class对象的三种方式:
1.对象.getClass()
2.类.class
3.Class.forName("权限类名")
第一种方式需要创建对象、第二种方式需要导入包,一般需要第三种方式
动态调用方法
//获取方法并调用,如: Method append = forName.getDeclaredMethod("append", String.class); append.invoke(instance, " 99009");
动态构造对象
//获取构造器实例化对象,如: StringBuilder instance = (StringBuilder)forName.getConstructor().newInstance(); instance.append("1232");
从程序集中获取类型(?)
5.线程安全的单例模式
//静态内部类的方式 public class Singleton { private Singleton() {} public static Singleton getSingleton() { return lazyHolder.singleton; } private static class lazyHolder { private static final Singleton singleton = new Singleton(); } }
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() {} public static Singleton getSingleton() { return singleton; } }
public class Singleton { private static Singleton singleton; private Singleton() {} public static synchronized Singleton getSingleton() { if (singleton == null) singleton = new Singleton(); return singleton; } }
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
6.其他问题 ---后续
- 表连接方式
- mvc工作流程
- ioc容器和mvc容器的区别
- 设计模式
- Restful 接口