zoukankan      html  css  js  c++  java
  • 程序猿的日常——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泛型深入理解

  • 相关阅读:
    延时函数出错,volatile一例
    【转】STM32中的抢占优先级、响应优先级概念
    【转载】串口中怎样接收一个完整数据包的解析
    ARM-ContexM3/4组优先级和子优先级抢占规则
    【转载】Keil中的USE MicroLib说明
    线程让出实验【RT-Thread学习笔记 4】
    线程优先级抢占实验【RT-Thread学习笔记 3】
    RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
    熟悉RT-Thread的软硬件环境【RT-Thread学习笔记 1】
    RT-Thread下的串口驱动程序分析【转载】
  • 原文地址:https://www.cnblogs.com/xing901022/p/7747977.html
Copyright © 2011-2022 走看看