java面试小册(1)
【A】:
重载(方法名称一样但是参数列表不同)。
重写(一个方法重写父类的一个方法或多个方法)。
在方法重写时,子类方法不能使用比父类更严格的访问级别。如,父类是protected,子类就不能改为private
Java内部类
【Q】:Java内部类
【A】:
一个类内部定义的类,包括成员内部类,局部内部类,匿名内部类和静态内部类。内部类可以访问外部类的成员变量和方法,甚至包括私有的成员。
主要作用: 封装,访问外部类成员,简化代码,事件处理。
实际上内部类只是编译层面的概念,经过编译器后内部类会提升为外部顶级类,JVM中是没有内部类的概念。
JDK8新特性
【Q】:JDK8新特性
【A】:
用元空间替代了永久的。JDK8把JRockit虚拟机和Hostspot虚拟机融合。而JRockit没有永久代,所以把Hotspot永久代给去了(本质是因为永久代效率太低)。
Lambda表达式。
日期类。引入的新的日期类都是不可变的,一旦被创建就不能被修改。使用了ZonedDateTime,OffsetDateTime,ZoneId等,简化了时区。
接口默认方法,静态。
Steam流式接口。提供了一种更高效而易于使用的方法来处理数据集合。支持链式操作,惰性求值和并行处理。
Optional。可以处理NullPointerException问题。
CompletableFuture。异步编程模型,简化了异步任务的编写和管理。
JDK动态代理是是基于接口实现的,所以要求代理类,一定要定义接口。
CGLIB是基于ASM字节码生成工具,通过继承的方法生成目标的子类来实现代理类,所以要注意final方法,不可以被继承。
JDK动态代理实现原理:首先通过实现InvocationHandler接口得到一个切面类。然后利用Proxy根据目标的类加载器,接口和切面实现一个代理类。最后再由代理类,把所有接口调用的方法转化到切面类invoke()方法上,放射到代理类。
注解是一种标记,提供一种元数据的机制。不影响程序的运行,但可以通过框架和工具进行处理。
注解就是一种特殊的接口,以@interface为关键字。
编译时通过javax.annotation.processing包进行注解处理器开发。运行时,使用放射机制访问注解,通过Class.getAnnotation()或Field.getAnnotation等方法来获取注解信息。
元注解(注解的注解):
@Retention定义注解的保留范围:SOURCE尽在源码中存在,编译时被抛弃。Class存在编译后的class文件,但不可以运行。RUNTIME运行时可用,可以通过放射机制访问。
@Target指定注解可以用于哪些元素:TYPE类接口,枚举值。FIELD字段(包括枚举常量)。METHDO方法。PARAMER方法参数。CONSTRUCTOR构造方法。LOCAL_VARIABLE局部变量。ANNOTATION_TYPE注解类型。RACKAGE包。
@Inherited表示注解是否可以被继承。
Java的放射机制是指在运行时获取类的结构信息(如方法,字段,构造函数)并且操作对象的一种机制。反射机制提供了在运行时动态创建对象,调用方法,访问字段等功能,而无需在编译时知道这些类的具体信息。
不需要在编译时就知道类的信息,可以动态创建对象,不需要在编译时就知道对象类型。