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

抽象类与接口

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

参数

抽象类

接口

默认的方法实现

它可以有默认的方法实现

接口完全是抽象的。它根本不存在方法的实现

实现

子类使用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;List 替换成List

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

泛型上限:Person 接受继承Number的任何类

泛型下限:Person 接受Nunber以及其父类

Person可以接受任何类型,但是不能修改

参考 Java泛型深入理解

查看原文

发表评论

返回顶部暗黑模式