再次回顾这些基础内容,发现自己理解的又多了一点。对于一些之前很模糊的概念,渐渐的清晰起来。

抽象类与接口

抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化。接口仅仅是描述一种方法的规约,即只能通过某几个方法来操作对象,它把内部的实现隐藏到实现类中,自己仅仅关注使用而已。

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用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>

另外,泛型有几种定义方法:

  1. 泛型上限:Person<? extends Number> 接受继承Number的任何类
  2. 泛型下限:Person<? super Number> 接受Nunber以及其父类
  3. Person<?>可以接受任何类型,但是不能修改

参考 Java泛型深入理解

程序猿的日常——Java基础之抽象类与接口、枚举、泛型的更多相关文章

  1. 程序猿的日常——Java基础之equals与hashCode

    equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...

  2. 程序猿的日常——Java基础之clone、序列化、字符串、数组

    其实Java还有很多其他的基础知识,在日常工作技术撕逼中也是经常被讨论的问题. 深克隆与浅克隆 在Java中创建对象有两种方式: 一种是new操作符,它创建了一个新的对象,并把对应的各个字段初始化成默 ...

  3. Java基础之抽象类与接口

    Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...

  4. java基础(四)-----抽象类与接口

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...

  5. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  6. java基础之抽象类与接口的形式参数和返回值

    抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...

  7. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  8. JAVA基础知识|抽象类与接口类

    一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...

  9. Java基础之抽象类和接口

    今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...

随机推荐

  1. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  2. BZOJ1699: [Usaco2007 Jan]Balanced Lineup排队 - 线段树

    description 查询区间最大和最小 题解 线段树 愉悦身心啊 代码 #include<cstring> #include<cstdio> #include<alg ...

  3. cocos2d-js 安卓自定义本地通知功能

    安卓新手,笔记有理解不当的地方望指出,经过几天折腾终于可以实现类似ios的本地通知功能(ios就几行代码),可能有第三方sdk可以方便实现,暂时没去找 思路: 1. startService 和bin ...

  4. sqlserver中set IDENTITY_INSERT on 和 off 的设置方法

    sqlserver中set IDENTITY_INSERT on 和 off 的设置方法: 执行插入数据库插入数据时报了以下错误,我明明没有给主键set值但还是报错 解决方法如下: qlserver ...

  5. 2018.06.29 NOIP模拟 繁星(前缀和)

    繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...

  6. String、StringBuffer与StringBuilder之间区别(转)

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...

  7. C++之类和对象的使用(二)

    析构函数 析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一系列清理工作,使这部分内存可以被程序分配给新对象使用.对象生命周期结束,程序就自动执行析构函数来完成这些工作. 析构函数是一种 ...

  8. Python 字典(Dictionary) keys()方法

    Python 字典(Dictionary) keys() 函数以列表返回一个字典所有的键. 语法 keys()方法语法: dict.keys() 参数 NA. 返回值 返回一个字典所有的键. 实例 以 ...

  9. lpm_clshift ip仿真

    今天仿真了一下lpm_clshift ip 其中din为输入的信号,sh_out为输出的信号. 以上为IP的设置. 可以看到din 的00000010 对应的step的2,一个时钟后sh_out的输出 ...

  10. (转) MVC 中 @help 用法

    ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通 ...