> 文档中心 > java基础面试

java基础面试

接口关键字:interface
接口定义了你要实现某种功能的规范,
接口成员
1、接口的方法都是抽象方法,默认使用public abstract 修饰,不能修改。
2、接口的变量都是静态常量,默认使用public static final修饰,不能修改。
3、接口中的常量必须在声明时赋值,常量名称全大写。

接口的用法
接口不能被创建对象,接口中的抽象方法由实现类实现。实现类使用implements实现接口,可以同时实现多个接口,使用逗号分割。

JAVA类具有单继承,多实现的特点。每个类只能继承一个父类对象,但是可以实现多个父接口,顺序为:先继承,在实现。

那么接口的作用是什么呢?
1、Java单继承的原因所以需要曲线救国作为继承关系的一个补充。
2、把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。
3、定义接口有利于代码的规范。(接口分离原则)

抽象类:abstract
把相同的属性和方法抽象到一个类中,子类只需要继承父类。
普通类是描述对象的某一类事物的抽象,而抽象类则是更高层次对具有相同特征的一批普通类进行抽象。
abstract class 类名{undefined
public abstract void 抽象方法名称();
}
抽象类的特点:
1.抽象类不能直接用new来实现
2.必须使用abstract修饰符去修饰
3.抽象类里可以有普通方法
4.抽象类里的抽象方法使用abstract修饰符去修饰,抽象方法没有方法体。(交给子类实现)
5.抽象类会被间接创建,因为在创建子类对象时先创建的是父类对象,这样抽象类作为父类会被间接的实例化,所以抽象
类也有构造器。
6.如果抽象类中具有抽象方法,子类必须实现抽象方法

******子类继承了抽象类,就必须重写抽象类中的所有方法注意:abstract只能修饰对象成员,不能修饰静态成员,抽象方法权限修饰符不能为private,final。抽象类不能被直接创建对象实例,只能被子类继承。

注意:

java抽象类的构造方法和普通类的构造方法一样,都是用来初始化类。只是抽象类的构造方法不能直接调用,因为抽象类不能实现实例。但是一旦一个普通类继承了抽象类 便也可以在构造函数中调用其抽象类的构造函数也可以使用其方法。

抽象类和普通类的区别
1、抽象类不能被直接创建实例对象,普通类可以。
2、抽象类中可以有抽象方法,也可以没有抽象方法,普通类不能有抽象方法。
3、如果抽象类继承其他抽象类,可以不用重写其父类的抽象方法,普通类继承抽象类必须重写抽象方法。

接口和抽象类的相同点
1、抽象类和接口都不能被直接实例化,他们都需要被继承或实现。(类和抽象类中间是继承关系,类和接口是实现关系,接口和接口之间可以有继承关系)
2、接口和抽象类都可以包含抽象方法,实现或继承他们的普通类必须重写抽象方法。
3、抽象类和接口,都可以体现在多态中,作为变量数据类型接收子类实例对象。

接口和抽象类的不同点
1、用途不同:
抽象类中抽取了多个子类的共性,作为模版存在,用于被子类继承实现代码复用。
接口定义了某种功能的规范,当类需要新增其功能时,只需要实现接口,重写接口的规范(抽象方法)即可,同时接口也弥补了java单继承的缺陷。
2、接口里只能包含抽象方法,抽象类则可以包含普通方法和抽象方法。
3、接口不能定义静态方法,抽象类可以(jdk1.8之后可以)。
4、接口中的成员变量是静态常量,
使用public static final修饰。抽象类则可以定义静态常量,也可以定义非静态成员变量。
5、接口不能被创建为对象,不含构造器,抽象类可以被实例化为对象,抽象类具有构造器。
抽象类是可以被实例化,子类对象创建的时候,创建抽象类父类对象。
抽象类是可以有静态代码块,构造代码块,构造器方法,抽象类就既可以有实例成员、也可以有静态成员。

抽象类强调的是从属关系,接口强调的是功能。最后一张表格说明问题~~
在这里插入图片描述
问题2:怎么自定义注解

Java内置元注解说明

@Retention(RetentionPolicy)
用来标识注解的生命周期(如果@Retention不存在,默认为CLASS)
RetentionPolicy.SOURCE 仅编译期
RetentionPolicy.CLASS (默认) 仅class文件
RetentionPolicy.RUNTIME 运行期
通常我们自定义的Annotation都是RUNTIME所以,务必加上@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType)
可以定义Annotation能够被应用于哪些注解
ELementType.TYPE 类或接口
ELementType.FIELD 字段
ElementType.METHOD 方法
ElementType.PARAMETER 方法参数
ElementType.CONSTRUCTOR 构造方法

@Target可以接收ElementType数组:

@Target([      ElementType.METHOD,      ElementType.FIELD])

表示被修饰的注解可以应用于方法和字段上

@Documented标识注解是否成为api的一部分@Inherited(了解,应用不广泛)使用@Inherited定义子类是否可继承父类定义的Annotation,例如B继承了A,A添加了注解C(该注解被@Inherited修饰),那么B也添加了注解C(可以获取注解C上的信息)@Inherited仅针对@Target(ElementType.TYPE)类型的annotation有效(类),并且仅针对class的继承,对interface的继承无效

@Repeatable (了解,应用不广泛,可以定义注解是否可以重复)
注解默认只能直接修饰某个元素一次,如果修饰了多次那么会出现编译异常,如果想要注解在某个元素上出现多次,可以使用@Repeatable