首页 > 编程语言 >学习笔记070——Java中【泛型】和【枚举】

学习笔记070——Java中【泛型】和【枚举】

时间:2024-12-15 10:27:37浏览次数:7  
标签:Java String 070 void Time 泛型 new public

文章目录

1、泛型

Generics 是指在定义类的时候不指定类中某个信息(属性/方法返回值)的具体数据类型,而是用一个标识符来替代,当外部实例化对象的时候再来指定具体的数据类型。

集合和数组相比较,优势在于长度可以随时改变,集合中存储的数据类型是灵活的,不固定。

1.1、为什么要使用泛型?

使用泛型可以确保集合中数据的统一性,同时它又兼具很好的灵活性

package com.southwind.test;

import java.util.ArrayList;

public class Test3 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        for (int i = 0; i < list.size(); i++) {
            int num = list.get(i);
            System.out.println(num);
        }
    }
}

1.2、泛型的应用

在自定义类中添加泛型,基本语法

public class 类名<泛型标识1,泛型标识2...>{
	private 泛型标识1 id;
	
	public 泛型标识2 test(){
		return (泛型标识2) new Object();
	}
}

自定义一个表示时间的类 Time

package com.southwind.test;

public class Time<T> {
    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}
package com.southwind.test;

public class Test4 {
    public static void main(String[] args) {
        Time<Integer> time1 = new Time<>();
        time1.setValue(10);
        System.out.println("现在的时间是" + time1.getValue());
        Time<String> time2 = new Time<>();
        time2.setValue("十点");
        System.out.println("现在的时间是" + time2.getValue());
    }
}
package com.southwind.test;

public class Test5 {
    public static void main(String[] args) {
        Time2<String,Integer,Float> time = new Time2<>();
        time.setHour("十点");
        time.setMinute(10);
        time.setSeconde(10.0f);
        System.out.println("现在的时间是" + time.getHour() + ":" + time.getMinute() + ":" + time.getSeconde());
    }
}
package com.southwind.test;

public class Time2<H,M,S> {

    private H hour;
    private M minute;
    private S seconde;

    public H getHour() {
        return hour;
    }

    public void setHour(H hour) {
        this.hour = hour;
    }

    public M getMinute() {
        return minute;
    }

    public void setMinute(M minute) {
        this.minute = minute;
    }

    public S getSeconde() {
        return seconde;
    }

    public void setSeconde(S seconde) {
        this.seconde = seconde;
    }
}

静态成员不能用泛型来修饰,非静态成员变量可以用泛型。

静态成员变量在类加载的时候就存入到内存中了,没有类型,所以无法存入,就不能定义为静态的。

静态方法可以使用泛型

private static Object hour;
public static<H> H getHour() {
    return (H)hour;
}

1.3、泛型通配符

String 和 Integer 在泛型引用中不能转换为 Object,多态在泛型引用中不生效

package com.southwind.test2;

import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        test(list1);
        ArrayList<Integer> list2 = new ArrayList<>();
        test(list2);
    }

    /**
     * 既可以传入String类型的集合
     * 也可以传入Integer类型的集合
     */
    public static void test(ArrayList<?> list){
        
    }

}

1.4、泛型上限和下限

使用泛型的时候可以通过泛型上限和下限对数据类型的范围进行扩充

泛型上限

表示实例化时的具体数据类型,可以是上限类型的子类或者上限类型本身,用 extends 关键字来修饰。

泛型下限

表示实例化时的具体数据类型,可以是下限类型的父类或者下限类型本身,用 super 关键字来修饰。

基本语法:

泛型上限:类名<泛型标识符 extends 上限类名>
泛型下限:类名<泛型标识符 super 下限类名>
package com.southwind.test2;

public class Time<T> {
    public static void main(String[] args) {
        test(new Time<Number>());
        test(new Time<Byte>());
        test(new Time<Integer>());
        test2(new Time<String>());
        test2(new Time<Object>());
    }

    /**
     * 参数的泛型只能是Number或者它的子类,Number、Byte、short、Integer...
     */
    public static void test(Time<? extends Number> time){

    }

    /**
     * 参数的泛型只能是String或者它的父类,String和Object
     */
    public static void test2(Time<? super String> time){

    }
}

1.5、泛型接口

我们在定义类的时候可以使用泛型,定义接口的时候同样可以使用泛型。

public interface MyInterface<T>{
	public T getValue();
}

实现泛型接口有两种方式,一种是实现类在定义时继续使用泛型标识,另一种时实现类在定义时直接给出具体的数据类型。

1、实现类继续使用泛型

package com.southwind.test3;

public class MyImplement<T> implements MyInterface<T> {

    private T obj;

    public T getObj() {
        return obj;
    }

    public void setObj(T obj) {
        this.obj = obj;
    }

    @Override
    public T getValue() {
        return null;
    }
}

2、实现类给出具体的数据类型

package com.southwind.test3;

public class MyImplement2 implements MyInterface<String> {
    
    private String obj;

    public String getObj() {
        return obj;
    }

    public void setObj(String obj) {
        this.obj = obj;
    }

    @Override
    public String getValue() {
        return null;
    }
}

实现类继续使用泛型,在具体实例化的时候需要给出具体的数据类型。

实现类给出具体的数据类型,在具体实例化的时候不需要给出具体的数据类型。

package com.southwind.test3;

public class Test {
    public static void main(String[] args) {
        MyImplement<String> myInterface = new MyImplement<>();
        MyImplement2 myInterface1 = new MyImplement2();
    }
}

2、枚举

Enum 是一种有确定取值区间的数据类型,本质上就是一个类,简洁、安全、方便。

枚举的值被约束到一个特定的范围,只能从这个范围内取值。

package com.southwind.test3;

public enum WeekEnum {
    MONDAY,TUESDAY,WEDENSDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
package com.southwind.test3;

public enum  ResponseEnum {
    SUCCESS(0,"成功"),
    ERROR(-1,"失败");

    private Integer code;
    private String msg;

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    ResponseEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
package com.southwind.test3;

public class Test2 {
    public static void main(String[] args) {
        System.out.println(ResponseEnum.SUCCESS.getCode());
        System.out.println(ResponseEnum.ERROR.getMsg());
    }
}

标签:Java,String,070,void,Time,泛型,new,public
From: https://blog.csdn.net/code__bee/article/details/144477549

相关文章

  • Java代码执行流程(简易易懂版)上部
    很多同学刚开始学java时看懂了怎么用,却不知道他内存怎么运行的过程,所以会感觉很迷茫,感觉白学了,我也和大家一样,这里我用了三天的时间给大家整理了代码执行时的过程,并且注意的一些事项,如果有不对的地方请大家指出,我在改正我们先定义一个A类在main函数创建A类的对象实例我们来......
  • 【如何获取股票数据02】Python、Java等多种主流语言实例演示获取股票行情api接口之沪
    最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任务是从这些数据中提炼出有价值的信......
  • Java毕设项目:基于Springboot网球场地预约网站系统设计与实现开题报告
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • Java线程命名问题解决
    前言网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下。研究过程默认命名创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0Threadt=newThread(()->{System.out.println(Thread.currentThread().getNam......
  • Java中的包装类
    1.包装类在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支撑基本类型,Java给每一个基本类型都对应了一个包装类型基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean除了Integer和Character,其余基......
  • Java代码实现“杨辉三角“
     杨辉三角简介杨辉三角(Pascal'sTriangle)是一个经典的数学结构,其特点是每一行的数字是其上方两个数字之和。具体来说: 顶部的数字是1。 每一行的开头和结尾的数字也是1。 其他位置的数字是其左上方和右上方数字之和。例如,前几行的杨辉三角如下:   1  11 1......
  • java 开闭原则(ocp)详解刨析和示例
    part01开闭原则(Open/ClosedPrinciple,OCP)是面向对象编程中的一个重要设计原则,属于SOLID原则之一。它的核心思想是“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。这意味着在软件需求变化时,我们应该能够通过扩展现有代码而不是修改现有代码来实现功能的变化。###原则的......
  • burp(2)利用java安装burpsuite
    BurpSuite安装burpsuite2024.10专业版,已经内置java环境,可以直接使用,支持WindowslinuxmacOS!!!内置jre环境,无需安装java即可使用!!!bp2024.10下载地址:https://pan.baidu.com/s/1E2aVKnnfTWl2SL-ztR_JtQ?pwd=m5pv激活1.首先点击Start.bat2.进入,点击Copy3.点击CN_Burp......
  • 使用idea创建一个JAVA WEB项目
    文章目录1.javaweb项目简介2.创建2.1idea新建项目2.2选择,命名2.3打开2.4选择tomcat运行2.5结果3.总结1.javaweb项目简介JavaWeb项目是一种基于Java技术的Web应用程序,主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上,支持开发人员利用Java......
  • 2024最强Java面试八股文(精简、纯手打)
    2024最新最全国内大厂Java面试高频题库本小册内容涵盖:Java基础,JVM,多线程,数据库(MySQL/Redis)SSM,Dubbo,网络,MQ,Zookeeper,Netty,微服务,大数据,算法,项目,设计模式等,篇幅足足近2千页,大家面试前拿去提前刷刷,一、基础篇1.接口和抽象类的区别相似点:(1)接口和抽象类都不能被实例化(2)实......