程序猿的日常——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>

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

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

参考 Java泛型深入理解

本文转自博客园xingoo的博客,原文链接:程序猿的日常——Java基础之抽象类与接口、枚举、泛型,如需转载请自行联系原博主。

相关文章
|
5月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
163 2
|
3月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
344 98
|
5月前
|
消息中间件 缓存 前端开发
从资损百万到零事故:Java 接口幂等设计的艺术与实践
在分布式系统中,重复请求常引发严重资损,如支付双扣、库存超卖等问题,其根源在于接口缺乏幂等性设计。本文通过真实案例揭示幂等性的重要性,并详解8种主流解决方案,涵盖唯一请求ID、乐观锁、悲观锁、状态机等,帮助开发者构建稳定系统,保障业务一致性。无论你是架构师还是开发工程师,都能从中获得实战指导,有效规避重复调用带来的风险。
431 2
|
5月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
4月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
176 11
|
3月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
242 0
|
4月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
329 10
|
5月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
321 23
|
5月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
306 12

热门文章

最新文章