Java特殊类

本文详细介绍了Java中的抽象类、接口、内部类、枚举和注解的概念、特点及使用方式。抽象类主要用于定义规范,接口则更加强制性,内部类提供了封装和隐藏细节的能力,枚举用于表示有限的固定值集合,注解则作为代码中的特殊标记,用于编译时或运行时的处理。内容涵盖了关键字、方法、成员变量等多个方面,深入解析了这些概念在实际编程中的应用。
摘要由CSDN通过智能技术生成

一、抽象类

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类型

元注解

概念
是一种基本注解,可以注解到注解上的注解
分类

  1. @Retention
    应用到一个注解上用于说明该注解的生命周期
    值:
    • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视
    • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到JVM 中,默认方式
    • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到JVM 中,所以在程序运行时可以获取到它们
  2. @Documented
    使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取时默认不包括注解内,用于指定被该注解将被javadoc工具提取成文档
    注意:定义为@Documented的注解必须设置Retention值为RUNTIME
  3. @Target
    用于指定被修饰的注解能用于哪些元素的修饰
    在这里插入图片描述
    ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中,如:泛型。(java8新增特性)
    ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中(java8新增特性)
  4. @Inherited
    并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超类的注解。
  5. @Repeatable
    表示自然可重复的含义,从Java8开始增加的新特性

预制注解

概念
就是Java语言自身提供的注解
取值
@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明
@Override 限定重写父类方法, 该注解只能用于方法
@Deprecated 用于表示所修饰的元素(类, 方法等)已过时
@SuppressWarnings 抑制编译器警告

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值