1.Java创建对象的几种方式
(1)使用new关键字(调用构造方法);
(2)使用Class类的newInstance方法(调用构造方法);
(3)使用Constructor类的newInstance方法(调用构造方法);
(4)使用clone方法(不调用构造方法);
(5)使用对象反序列化方法(不调用构造方法);
2.抽象类和接口的区别
抽象类:
抽象类不能创建实例对象;
含有抽象方法的方法的类必须定义为抽象类;
抽象类中的方法不一定为抽象方法;
抽象类中定义的抽象方法必须在子类中实现,所以不能有抽象构造方法和抽象静态方法;
如果子类中没有实现抽象父类的所有抽象方法,则该子类也要声明为抽象类;
抽象类与接口的区别:
(1)抽象类可以有构造方法,接口中不能存在构造方法;
(2)抽象类中可以有普通成员变量、常量、静态变量,接口中只有常量(默认修饰符为public static final);
(3)抽象类中可以有普通方法,抽象方法,静态方法,而接口中只含有抽象方法(默认修饰符为public abstract);
(4)抽象类中的抽象方法的访问修饰符可以是public和protected,而接口中的抽象方法访问修饰符只能是public;
(5)一个类可以实现多个接口,但只能继承一个抽象类;
3.Java泛型的概念,好处及各JDK版本之间的区别
泛型是JDK1.5引入的,其本质是参数化类型,这种参数类型可以用在类,方法,接口的创建中,分别称为泛型类,泛型方法,泛型接口;
泛型的好处在于编译时检查类型安全,并且所有的强制转换都是自动的和隐式的,提高了代码重用率,避免在运行时出现ClassCastException;
JDK1.5引入了泛型在编译时进行类型检查,JDK1.7泛型则具备了自动推断能力,例:
JDK1.5写法
List<String> list = new ArrayList<String>();
JDK1.7写法
List<String> list = new ArrayList<>();
4.类型擦除的概念
泛型是通过类型擦除来实现的,泛型擦除具体来说就是在编译成字节码时首先进行类型检查,接着进行类型擦除,接着如果类型擦除和多态性发生冲突时就在子类中生成桥方法解决,接着如果调用泛型方法的返回类型被擦除则在调用该方法时插入强制类型转换。
5.Java中的限定通配符与非限定通配符
限定通配符对泛型类型进行限制,泛型中有两种限定通配符,一种是 <? extends T> 来保证泛型类型必须是 T 的子类来设定泛型类型的上边界,另一种是 <? super T> 来保证泛型类型必须是 T 的父类来设定类型的下边界,泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。
非限定通配符 <?> 表示可以用任意泛型类型来替代,可以在某种意义上来说是泛型向上转型的语法格式,因为 List<String> 与 List<Object> 不存在继承关系。
6.List<Object>与List原始类型之间的区别
(1)原始类型和带泛型参数类型 <Object> 之间的主要区别是在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,通过使用 Object 作为类型可以告知编译器该方法可以接受任何类型的对象(比如 String 或 Integer)。
(2)我们可以把任何带参数的类型传递给原始类型 List,但却不能把 List<String> 传递给接受 List<Object> 的方法,因为会产生编译错误。