java 1.8
接口 关键字interface和implements
final修饰的变量赋值有三种方式:执行顺序,静态代码块,定义属性,构造代码块,也就是static{},赋初始值,static可以省略,只用{},然后是构造函数,如果被final修饰,则构造函数不能赋值。被final修饰的对象,仅仅是引用不能改变,但内部的属性可以修改。
接口中可以定义变量,默认的是 public static final修饰,自定义修饰无效,可以直接省略所有修饰符。实现类中可以直接使用属性值,用法和自生属性一样,不用示例去访问。但用实例和类名可以访问,接口中属性值只能直接赋值,不支持构造代码块和构造函数。private和protected修饰会报错。接口对外开放,自身的定义,所以都必须是public。
接口中可以定义静态方法,但只能通过类名加方法名访问,因为静态方法不能被继承也不能被实现,所以只用定义的类才拥有该方法。
接口中可以定义默认方法,用于扩展接口的功能,不用修改所有的实现类,用default修饰,在实现类的实例中可以直接使用,如果实现的多个接口中有相同的default方法,则实现类必须重写该方法。否则会编译报错。
接口可以继承接口,同名方法可以正常使用。接口用extends继承接口。
接口方法的修饰词默认是public,且只能为public,private和protected会报错,缺省默认为public。
实现多个接口的时候用逗号,隔开。
抽象类 关键字abstract class
抽象类不能直接实例化。
抽象类定义public abstract class + 类名,需要使用class关键字,子类使用extends继承抽象类,extends末尾有一个s。
抽象方法不能是静态的。
抽象类的抽象方法不能是private,可以是protected和缺省。
抽象类可以实现接口,且可以把接口的方法定义为抽象方法。
抽象类可以继承抽象类,抽象类可以不用实现被继承的抽象类方法。
普通类也是使用extends继承抽象类。
枚举类 关键字enum
枚举类编译后生成.class文件,反编译后是一个类,继承java.lang.Enum类。
枚举类型不能继承其它的类,因为已经继承了Enum类。
构造函数只能为私有,private修饰。属性和其它方法可以用protected,public和缺省。
访问枚举类型,使用类名.values(),将枚举类转变为一个枚举类型的数组,Light[] L = Light.values();for (Light aLight : Light.values()){}。values并不是Enum类中的方法,是编译器插入的static方法,enum实例向上转型为父类Enum时候,values()就不可访问。
注解类 关键字Annotation,使用@interface声明注解
1.@Target,表示注解使用的位置,ElementType.CONSTRUCTOR(构造函数),METHOD(方法),PARAMETER(方法参数),LOCAL_VARIABLE(局部变量),FIELD(字段,枚举的常量),ANNOTATION_TYPE(注解),PACKAGE,TYPE(类,接口,枚举,注解),jdk1.8新增TYPE_PARAMETER,标注类型参数,TYPE_USE可以标注任何类型名称
2.@Retention,存在的时间,RetentionPolicy.SOURCE,CLASS,RUNTIME,源码,编译,运行时,编译阶段的源码阶段注解依旧有效。
3.@Documented,加上此注解后,被修饰的注解使用后会被加入到javadoc中,javadoc是java文档,写在类和方法上面的注释,包括摘要,用途,时间,参数,版本,链接,返回值,异常等等信息,通过idea的tools->generate Javadoc可以导出文档,可以是html格式的。正常情况下,javadoc不包含注解信息。
4.@Inherited 继承,a类使用了被@Inherited元注解修饰的注解,那么继承了a类的子类也拥有该注解,即a使用了注解,b也继承了该注解。但是接口不会继承接口的注解,类不会继承接口的注解。
注解的作用,帮助编译检查,例如@override,@SuppringsWarnings注解,利用默认值,全局配置信息,与场景有关的使用注解保存,与场景无关的用xml,yuml等文件保存。可以利用反射自定义注解处理器,用注解中的信息生成实例,或者帮助处理其他事情。可以添加到javadoc中,可以作为标识。
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.CLASS)
public @interface Annotation {
String value() default "aa";
}
//使用
@Annotation(value = "bb")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
public <@TypeParameterAnnotation U> T foo(T t) {
return null;
}
//TYPE_USE可以使用在任何地方
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeUseAnnotation {
}
public static @TypeUseAnnotation class TypeUseClass<@TypeUseAnnotation T> extends @TypeUseAnnotation Object {
public void foo(@TypeUseAnnotation T t) throws @TypeUseAnnotation Exception {
}
}
a.compareTo(b), a>b返回正数,a=b返回0,a<b返回负数。
package-info.java文件手动创建,命名智能由字母数字,下划线和$组成,这里有-,命名是无效的,因此在类里面也定义不了public class package-info,因为‘-’是无效的字符,
package-info.java用来添加包级注解,友好类和包常量,缺省值为友好类和友好常量,文件中不能使用任何范围修饰符public,protected,private,只能是缺省值,称为包类,包公共使用的类,强调的是包访问权限,包常量定义在友好类中,java文件中不能直接定义变量。提供包注释,共三种功能。包级注释可以对整个包起到影响,定义的友好类在包中和普通类一样使用。
/**
*注释写这里
* Domain classes used to produce the JSON and XML output for the RESTful services.
* <p> * These classes contain the JAXB annotations. *
* @since 1.0
* @version 1.1
*/
@PkgAnnotation //注解写这里
package com.company;
interface car{}
class people{}
Package pkg = Package.getPackage("com.company");
Annotation[] annotations = pkg.getAnnotations(); //通过这个方式获取包的注解