程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点。对于一些之前很模糊的概念,渐渐的清晰起来。
抽象类与接口
抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化。接口仅仅是描述一种方法的规约,即只能通过某几个方法来操作对象,它把内部的实现隐藏到实现类中,自己仅仅关注使用而已。
参数 |
抽象类 |
接口 |
---|---|---|
默认的方法实现 |
它可以有默认的方法实现 |
接口完全是抽象的。它根本不存在方法的实现 |
实现 |
子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 |
子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 |
抽象类可以有构造器 |
接口不能有构造器 |
与正常Java类的区别 |
除了你不能实例化抽象类之外,它和普通Java类没有任何区别 |
接口是完全不同的类型 |
访问修饰符 |
抽象方法可以有public、protected和default这些修饰符 |
接口方法默认修饰符是public。你不可以使用其它修饰符 |
main方法 |
抽象方法可以有main方法并且我们可以运行它 |
接口没有main方法,因此我们不能运行它。 |
多继承 |
抽象方法可以继承一个类和实现多个接口 |
接口只可以继承一个或多个其它接口 |
速度 |
它比接口速度要快 |
接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 |
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 |
如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
枚举
平时代码中总是有一些特殊的变量,这些变量有一些类似的特点。比如程咬金的被动技能是舍生忘死,一技能是爆裂双斧;钟无艳的被动技能是石之炼金,一技能是狂飙突进。如果每次都用字符串的形式,代码就会显得很乱。这时候就可以使用enum,enum枚举不仅仅可以表示简单的形式,还可以封装复杂的类型。
比如:
public enum KingHeros {
ChengYaojin,
ZhongWuYan,
LiBai;
}
public class KingHerosTest1 {
public static void main(String[] args) {
System.out.println(KingHeros.ZhongWuYan);
System.out.println(KingHeros.valueOf("ZhongWuYan"));
System.out.println(KingHeros.values());
System.out.println(KingHeros.ZhongWuYan.equals(KingHeros.valueOf("ZhongWuYan")));
caseTest(KingHeros.ZhongWuYan);
}
/**
* switch的使用
* @param kingHeros
*/
public static void caseTest(KingHeros kingHeros){
switch (kingHeros){
case ChengYaojin:
System.out.println("我是程咬金");
break;
case ZhongWuYan:
System.out.println("我是钟无艳");
break;
case LiBai:
System.out.println("我是李白");
break;
default:
System.out.println("我是NPC");
}
}
}
输出内容:
ZhongWuYan
ZhongWuYan
[Lxingoo.test.KingHeros;@452b3a41
true
我是钟无艳
上面只是枚举最简单的用法,它还可以支持复杂的类型。
public enum KingHeros {
ChengYaojin("程咬金","舍生忘死","爆裂双斧"),
ZhongWuYan("钟无艳","石之炼金","狂飙突进");
private String name;
private String beidong;
private String yijineng;
private KingHeros(String name, String beidong, String yijineng){
this.name = name;
this.beidong = beidong;
this.yijineng = yijineng;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBeidong() {
return beidong;
}
public void setBeidong(String beidong) {
this.beidong = beidong;
}
public String getYijineng() {
return yijineng;
}
public void setYijineng(String yijineng) {
this.yijineng = yijineng;
}
public void 自我介绍(){
System.out.println("我叫"+name+",我的被动是"+beidong+",我的一技能是"+yijineng);
}
}
public class KingHerosTest1 {
public static void main(String[] args) {
KingHeros.ChengYaojin.自我介绍();
KingHeros.ZhongWuYan.自我介绍();
}
}
输出内容是
我叫程咬金,我的被动是舍生忘死,我的一技能是爆裂双斧
我叫钟无艳,我的被动是石之炼金,我的一技能是狂飙突进
这种枚举的使用方法可以良好的组织代码,非常有用。
参考 java枚举
泛型
泛型是类型参数化的一种使用方法,最常用在集合类中。如果阅读集合类的代码,可以看到大量的泛型。
泛型只是在编译期起作用的一种机制,主要是为了限制集合类存储的类型。以免一个集合内既有字符串又有数字,结果在使用的时候会有很大的困扰。如果使用泛型会有一个叫做反醒擦除的概念,就是再编译期间,把泛型擦出掉,替换成对应的类型。比如List<?>
替换成List<Object>
;List<? extends Number>
替换成List<Number>
。
另外,泛型有几种定义方法:
- 泛型上限:Person<? extends Number> 接受继承Number的任何类
- 泛型下限:Person<? super Number> 接受Nunber以及其父类
- Person<?>可以接受任何类型,但是不能修改
参考 Java泛型深入理解
- Redis实现分布式锁
- Mybatis分页插件PageHelper的配置和使用方法
- 另类保存微信公众平台历史消息的方法 - 星标消息
- CentOS环境下Docker私有仓库搭建
- spark三种连接join
- 用firebug给firefox添加信任链接
- Elasticsearch索引别名、Filtered索引别名、Template
- 追本溯源:Oracle 只读表空间的探索实践
- firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?
- spark-streaming集成Kafka处理实时数据
- 使用spark与MySQL进行数据交互的方法
- python分布式环境下的限流器
- commons-pool与commons-pool2连接池(Hadoop连接池)
- Glusterfs 文件系统
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- php微信公众号开发之翻页查询
- php 中phar包的使用教程详解
- php微信公众号开发之快递查询
- Scrapy框架介绍之Puppeteer渲染的使用
- Keras设置以及获取权重的实现
- Java自动化测试(Android app界面元素 33)
- 太厉害了,这款开源类库可以帮你简化每一行代码
- Linux ps和pstree命令知识点总结
- CentOS7上以rpm方式安装JDK8
- linux DMA接口知识点详解
- Linux中使用crond工具创建定时任务的方法
- Linux which命令的具体使用
- Linux安装Python3.8.1的教程详解
- linux压缩文件命令zip的实例用法
- centos下samba文件夹共享服务器配置详解