一、抽象类
1.abstract关键字
作用
通过abstract关键字声明一个方法或者类为抽象方法或抽象类
注意
- private 不能和 abstract共同修饰一个方法
- final 不能和 abstract 共同修饰一个方法
- static 不能和 abstract 共同修饰一个方法
2.抽象方法
概念
主要指不能具体实现的方法并且使用 abstract 关键字修饰,也就是没有方法体
格式
访问权限 abstract 返回值类型 方法名(形参列表);
3.抽象类
概念
主要指不能具体实例化的类,并且使用abstract关键字修饰,也就是不能创建对象
不能实例化的原因
真正的抽象类实际上应该包含抽象方法,而抽象方法是没有方法体的。此时如果抽象类被实例化了,就能通过引用.的方法来调用抽象方法了,这样就会发生错误
特点
- 可以有成员变量、构造方法、成员方法、静态方法
- 可以有抽象方法,也可以没有抽象方法
- 拥有抽象方法的类必须是抽象类,故一般抽象类是指具有抽象方法且用abstract关键字修饰的类
- 当一个抽象类被继承后必须重写抽象方法,否则该类也需声明为抽象类
实际意义 - 不在于被创建而在于被继承
- 抽象类对子类具有强制性和规范性,因此叫做模板设计模式
二、接口
概念
- 所有方法都为抽象方法,比抽象类还抽象的类
- 定义接口的关键字是interface,定义类的关键字是class
特点
- 接口里面只能有常量
- 接口里面只能有抽象方法
- 接口里面不能使用protected和private访问控制符修饰抽象方法
- java8之前,接口增加方法,实现类中需要强制重写
- java8之后,允许出现非抽象方法(default修饰)和静态方法,两者都不会强制实现类实现相关方法
- java9之后,接口中允许出现私有方法
与类的关系
- 类与类之间,使用extends表达继承关系,仅支持单继承
- 类和接口的之间,使用implements表达实现关系,支持多实现
- 接口与接口之间,使用extends表达继承关系,支持多继承
抽象类和接口的主要区别
- 关键字不同,抽象类是abstract class,定义接口的关键字是interface
- 接口与普通类的关系是实现,关键字是implements,抽象类和普通类是继承,关键字是extends
- 抽象类支持单继承,而接口支持接口的多继承和类的多实现
- 抽象类中可以有构造方法,接口中不可以有构造方法
- 抽象类中可以有成员变量,接口中只可以有常量
- 抽象类中可以有成员方法,接口中只可以有抽象方法(java8之前)
三、内部类
概念
当一个类的定义出现在另外一个类的类体中,那么这个类叫做内部类,而这个类所在的类叫做外部类
实际作用
一个类的存在价值仅仅是为了某一个类单独服务,这时可以将这个类定义为所服务类的内部类,这样可以隐藏细节并且可以方便不通过ger和set方法直接访问外部类的私有成员
分类
1.普通内部类
概念
直接将一个类的定义放在另一个类的类体中
格式
访问控制符 class 外部类名 {
访问控制符 class 内部类名{
内部类体;
}
}
使用方式
- 普通内部类和普通类一样可以定义成员变量、成员方法、构造方法、构造块以及静态代码块等
- 普通内部类和普通类一样可以使用final或者abstract关键字修饰
- 普通内部类可以使用private或protected关键字修饰
- 普通内部类需要使用外部类对象来创建对象
- 当内部类访问外部类中与自己同名的成员变量或者成员方法时,需要使用外部类名.this.成员的方法
2.静态内部类
概念
使用static关键字修饰的内部类,隶属于类层级
格式
访问控制符 class 外部类名 {
访问控制符 static class 内部类名{
内部类体;
}
}
使用方式
- 静态内部类不能直接访问外部类的非静态成员
- 静态内部类可以直接创建对象
- 当静态内部类访问外部类中与本类内同名的成员变量或方法时,需要使用类名.的方式访问
3.方法内部类
概念
直接将一个类的定义放在方法体的内部时
格式
访问修饰符 class 外部类名{
访问修饰符 返回值类型 成员方法名(形参列表){
class 内部类的类名 {
内部类体
}
}
}
注意:局部内部类不能用访问控制符修饰
使用方式
- 局部内部类只能在该方法的内部使用
- 局部内部类可以在方法体的内部直接创建对象
- 局部内部类不能使用访问控制符和static关键字修饰符
- 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局部变量的声明周期不同所致
局部内部类使用外部方法的变量时是拷贝一份来使用,如果拷贝完成后,外部方法的局部变量
发生的修改,那内部类的拷贝数据不会改变,故需要定义为final或者默认final使用
4.匿名内部类
概念
指没有名字的内部类
格式
接口/父类类型 引用变量名 = new 接口/父类类型(){方法的重写;}
四、枚举类
概念
生活中某些事物的取值只有明确的几个固定值,此时描述这些事物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型
格式
枚举类型要求所有枚举值必须放在枚举类型的最前面
定义
- Java5开始增加的一个引用数据类型,使用enum关键字来定义枚举类型取代public static final修饰的常量
- 枚举值就是当前类的类型(也就是指向本类的对象),默认使用public static final 关键字共同修饰,因此采用枚举类型.的方式调用
- 枚举类可以自定义构造方法,但是构造方法的修饰符必须为private,默认也是私有的
- 所有枚举类都继承自java.lang.Enum类
方法
注:枚举类实现接口后需要重写抽象方法(啥意思?忘了,有时间回顾一下,做此标记)
五、注解
概念
注解又叫标注,是java5开始增加的一种引用数据类型
作用
本质上就是代码中的特殊标记,通过这些标记可以在编译、类加载以及运行时执行指定的处理
语法格式
访问修饰符 @interface 注解名称{注解成员;}
//自定义注解自动继承java.lang.annotation.Annotation接口
使用方式
- 通过@注解名称的方式可以修饰包、类、成员方法、成员变量、构造方法、参数、局部变量的声明等
- 注解中没有任何的成员,则这样的注解叫做标记注解/标识注解
- 注解体中只有成员变量没有成员方法,而注解的成员变量以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型
- 如果注解只有一个参数成员,建议使用参数名为value,而类型只能是八种基本数据类型、String类型、Class类型、enum类型及Annotation类型
元注解
概念
是一种基本注解,可以注解到注解上的注解
分类
- @Retention
应用到一个注解上用于说明该注解的生命周期
值:- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到JVM 中,默认方式
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到JVM 中,所以在程序运行时可以获取到它们
- @Documented
使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取时默认不包括注解内,用于指定被该注解将被javadoc工具提取成文档
注意:定义为@Documented的注解必须设置Retention值为RUNTIME - @Target
用于指定被修饰的注解能用于哪些元素的修饰
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中,如:泛型。(java8新增特性)
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中(java8新增特性) - @Inherited
并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超类的注解。 - @Repeatable
表示自然可重复的含义,从Java8开始增加的新特性
预制注解
概念
就是Java语言自身提供的注解
取值
@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明
@Override 限定重写父类方法, 该注解只能用于方法
@Deprecated 用于表示所修饰的元素(类, 方法等)已过时
@SuppressWarnings 抑制编译器警告