Java-抽象类,枚举,接口。

一,抽象类

由 abstrack修饰的类,就成为抽象类。

【其他修饰符】abstrack class 抽象类名{

}

2、为什么要定义抽象类?

当我们在声明某个父类时,发现这个父类中存在这样的方法,该方法在父类中无法给出具体的合理的方法体实现,即无法给出一种适用于所有子类的通用的方法体实现,那么这样的方法,就必须声明为抽象方法。Java中规定,包含抽象方法的类,必须是抽象类。

抽象方法的声明格式:

【其他修饰符】 abstract 返回值类型 抽象方法名(【形参列表】); //抽象方法没有方法体

3,抽象类的特点和要求

·抽象类不能直接创建对象

·包含抽象方法的类,必须是抽象方法。但反过来,抽象类中可以没有抽象方法。

没有抽象方法的抽象类,意义,就在于不能创建它的对象。希望你创建它更加具体的子类的对象。

子类如果继承抽象类,那么必须重写抽象类中所有抽象方法,否则子类也得是抽象类。

抽象类中也可以有很多成员

  • 成员变量:静态变量、实例变量

  • 成员方法:

    • 抽象方法和非抽象方法

    • 静态方法和非静态方法

    • 构造器:无参构造和有参构造(被子类调用)

二,枚举

枚举是一种特殊的类,他的特殊之处在于,这种类的对象一般是固定的,有限的几个常量对象。

如何声明枚举类

JDK1.5之前

JDK1.5之前没有专门的枚举类型,没有关键字enum,但是也可以实现 把某个类的对象限定在固定的,有限的几个常量对象中。

  • 构造器私有化

  • 在当前类的内部提前创建好几个固定的常量对象

JDK1.5之后

为枚举类型单独设计了一个关键字enum,来代替class,表示特殊的class类型。

使用enum关键字声明的枚举类型:

  • 构造器默认就是私有的

  • 是不能有子类的,因为子类不能调用父类私有的构造器了

  • 必须在枚举类的==首行==,列出所有该类的常量对象。如果常量对象列表后面还有其他成员,必须在最后加;,如果后面没有其他成员,;可以省略。

  • 枚举类中的属性习惯上(不是强制要求)都会加final修饰。因为枚举类的对象都是常量对象,常量对象的属性通常也是不可修改的。

  • 默认枚举类的常量对象选择的是无参构造创建对象,也可以在常量对象后面加(),通常都省略()

  • 如果要用有参构造创建常量对象,需要在常量对象后面加(实参列表)

  • 它有一个默认的直接父类,java.lang.Enum,当然根父类仍然是java.lang.Object。enum声明的了,不能再手动继承别的类了。

    • 在Enum父类中,有两个成员变量 ordinal,name,分别代表枚举常量对象的下标和名称,可以通过name()和ordinal()获取它们的值

    • 在Enum父类中重写了Object类的toString,默认返回的是常量对象的名称。当然我们也可以再次重写toString方法。

    • 在Enum父类中还有一些其他方法...

  • 编译器还会给枚举类增加两个静态方法

    • public static 枚举类型 valueOf(String name):可以根据字符串类型的常量对象名,获取枚举对象

    • public static 枚举类型[] values():获取所有枚举类的常量对象

  • 从JDK1.5之后,switch开始支持枚举类型

为什么要声明枚举类型?

当项目中某个数据的值是多个中选择一个。例如:订单的状态(未发货、已发货、已收货、退货)。用户的状态(登录、注销等).

可以通过枚举类的常量对象,使得该数据的值得到统一。

不用new直接用

三,接口

什么是接口:

大的层面:

电脑USB接口 ==> 统一连接规范的意义。

Java中的接口 ==> 统一某个系列的操作的规范的意义。

小的层面:

  • 为了解决Java的单继承限制,提供了接口供我们使用

  • 事物与事物之间不全是is-a的关系,解决多个事物之间不是is-a的关系,但是它们具有相同的行为特征。

接口的声明格式:

【修饰符】 interface 接口名{

}

接口的特点

接口天生就是抽象的,因此他不能直接创建对象。

接口是用来被实现的,类可以实现接口,而且支持多实现。实现类实现接口后,必须重写(或实现)接口的所有抽象方法。

实现类可以同时继承父类又实现父接口,要继承在前,实现在后。

接口与接口直接可以是多继承。

接口中的成员是有限制的。它的成员和类有很大的不同。

接口没有构造器。

接口也没有普通的成员变量,如果要定义成员变量,只能是公共的静态的常量(这里的public static final可以省略)。

接口中要定义方法:

Java8之前,只能是公共的抽象方法(这里的public abstract可以省略)。

Java8版本开始,接口中允许定义公共的静态方法 (这里public static中public可以省略,static不能省略)和 公共的默认方法(这里public default 中public可以省略,default 不能省略)。

Java9版本开始,接口中允许定义私有的方法(private不可以省略)。

什么Java8之前,只能是公共的静态的常量和公共的抽象方法?

因为之前接口仅仅是作为规范的定义,它是比抽象类还要抽象的类型。

为什么Java8之后,为什么又要增加公共的静态方法和公共的默认方法呢?

  • 公共的静态方法:原来因为接口中不能定义有方法体的方法,所有通常会为接口单独定义一个工具类,里面全是静态方法,这些静态方法都是为这个接口的实现类服务的。例如:Collection接口和Collections工具类。这样的设计,造成了后期维护的成本增加,因为需要同时维护两个.java文件。因为静态方法本身就不需要该类的对象,所以有人提出,为这个接口服务的这些静态方法,可以直接放到接口中,这一点和接口不能创建对象不矛盾。遵循了高内聚的开发原则。

  • 公共的默认方法:按照Java8之前,接口中只能增加公共的抽象方法,一个旧的接口,一旦增加一个公共的抽象方法,会影响它所有的实现类,这是一个很危险的操作。所以,为了解决这个问题,接口中允许增加公共默认的方法。默认方法实现类是可以选择重新实现,或不实现它。

4、如何使用接口的成员

(1)公共的静态的常量

在接口的实现类的外面:

接口名.常量名

在接口的实现类中:直接使用即可

如果实现类或父类中声明了和接口同名的成员变量,那么在实现类中,也需要用 “接口名.常量名”以区分。

公共的抽象方法

必须new实现类的对象,才可以调用并执行它。

公共的静态方法

接口名.静态方法()
接口名.静态方法(实参列表)  

接口的静态方法不会继承到实现类中。唯一使用它的方式只有 接口名.静态方法。

父类的静态方法,可以通过父类名.静态方法,子类名.静态方法,父类或子类对象.静态方法都可以。推荐的是父类名.静态方法方式。

公共的默认方法

必须new实现类的对象,才可以调用并执行它。

当实现类的父类中有与父接口的默认方法签名相同(方法名相同,形参列表也相同),怎么办?

  • 默认亲爹优先原则

  • 可以手动选择父类的 super.方法, 选择父接口的 接口名.super.方法 ,也可以选择自己完全重写

当实现类同时实现了多个父接口,多个父接口中存在相同签名的默认方法,怎么办?

必须做出选择,即必须重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值