第十三章---枚举类型与泛型

news2025/2/23 23:29:17

一,枚举类型

1.使用枚举类型设置常量
设置常量时,我们通常将常量放置在接口中,这样在程序中就可以直接使用。该常量稚因为在接口中定义常量时,该常量的修饰符为 final 与 static。

public interface Constants (
public static final int Constants A = 1;
public static final int Constanta_B =12;
}
枚举类型出现后,逐渐取代了上述最定义方式。使用枚举类型定义常量的通法加下;

public enum Constants{
Constants_A,
Constants_B,}
 例13.1]分别创建四季的接常量和枚举,比较两者的使用场

2,深入了解枚举类型 

1.values()方法

枚举类型实例包含一个values()方法,该方法将枚举中所有的枚举值以数组的形式返回。

[例13.2]打印四季枚举中的所有枚举值

 

2.valueOf()方法与compareTo()方法

枚举类型中静态方法 valueOf0可以将普通字符串转换为枚举类型,而compareTo0方法用于比较两个枚举类型对象定义时的顺序

[例13.3]使用字符串创建一个季节的枚举值,并判断季节的位置

 

3.ordinal()方法

校举英型中的ordinal0方法用于获取某个枚举对象的位置索引值。

[例13.4]输出每一个季节的索引位置

 

4,枚举类型中的构造方法

在枚举类型中,可以添加构造方法,但是规定这个构造方法必须被 private 修饰符所修型定义的构造方法语法如下:

 

(例13.5]为四季枚举创建构造方法,记录每一个季节的特征

 

3,使用枚举类型的优势

枚举类型声明提供了一种对用户友好的变量定义方法,枚举了某种数据类型所有可能出现的值总结枚举类型,它具有以下特点:

1.类型安全

2.紧凑有效的数据定义

3.可以和程序其他部分完美交互

4.运行效率高。

二,泛型

1,回顾向上向下转型

 

例子

2,定义泛型类
1.object类为最上层的父类,很多程序员为了使程序更为通用,设计程序时通常使传入的值与返回objct类型为主。当需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则在时将会发生 ClassCastException 异常。

2.Java提供了泛型机制。其语法如下

类名<T>
[例13.6]创建带泛型的图书类
 

 
public class Book<T> {//定义带泛型的book<t>类
	private T bookInfo;//参考类型:书籍信息
	public Book(T bookInfo) {//参数为类型形参的构造方法
		this.bookInfo= bookInfo;//为书籍信息赋值
	}
	public T getbookInfo() {
		return bookInfo;//获取书籍信息的值
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book<String> bookName = new Book<String>("java从入门到精通");//创建参数为String类型的书名对象
		Book<String> bookAuther = new Book<String>("明日科技");//创建参数为String类型的作者对象
		Book<Double> bookPrice = new Book<Double>(69.8);//创建参数为Double类型的价格对象
		Book<Boolean> HasSourse = new Book<Boolean>(true);//创建参数为Boolean类型的附赠源代码
		//控制台输出书名,作者,价格和是否附赠光盘
		System.out.println("书名:"+bookName.getbookInfo());
		System.out.println("作者:"+bookAuther.getbookInfo());
		System.out.println("价格:"+bookPrice.getbookInfo());
		System.out.println("是否附赠源代码:"+HasSourse.getbookInfo());
		
	}
 
}

3,泛型的常规用法
1.定义泛型类时声明多个类型

        在定义泛型类时,可以声明多个类型。语法如下:

class MyClass<T1,T2>{}
        这样,在实例化指定类型的对象时就可以指定多个类型。例如:

MyClass <Boolean,Float> m = new MyClass <Boolean,Float>();
2.定义泛型类时声明数组类型

         [例13.7]定义泛型数组
 

public class ArrayClass<T> {
	private T[]array;//定义泛型数组
	public T[]getArray(){
		return array;
	}
	public void setArray(T[]array) {
		this.array=array;
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ArrayClass<String>demo=new ArrayClass<String>();
		String value[]= {"成员1","成员2","成员3","成员4","成员5"};
		demo.setArray(value);
		String array[]=demo.getArray();
		for(int i =0;i<array.length;i++) {
			System.out.println(array[i]);
		}
}
}

.集合类声明容器的元素

表13.2常用的被泛型化的集合类

[例13.8]使用泛型约束集合的元素类型

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
 
public class AnyClass {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义ArrayList容器,设置容器内的值Integer
		ArrayList<Integer> a = new ArrayList<Integer>();
		a.add(1);//为容器添加新值
		for(int i=0;i<a.size();i++) {//根据容器的长度,循环显示容器内的值
			System.out.println("获得ArrayList容器的成员值:"+a.get(i));
		}
		//定义HashMap容器,设置容器内的值Integer和String
		Map<Integer,String> m= new HashMap<Integer,String>();
		for(int i=0;i<5;i++) {//为容器添加
			m.put(i, "成员"+i);
		}
		for(int i=0;i<m.size();i++) {//根据键名获取键值
			System.out.println("获得Map容器的成员值:"+m.get(i));
		}
	}
 
}

 

4,泛型的高级用法
1.限制泛型可用类型

默认可以使用任何类型来实例化一个泛型类对象,但Java 中也对泛型类实例的类型作了限制。语法如下:

class 类名称<Textends anyClass>
使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类。无论 anyClass 是接口是类,在进行泛型限制时必须使用extends关键字。

[例13.9]限制泛型的类型必须为list的子类(代码最后一行是错误的)
 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
 
public class LimitClass<T extends List>  {
 
	public static void main(String[] args) {
		
		//可以实例化已经实现 List 接口的类
		LimitClass<ArrayList> l1= new LimitClass<ArrayList>();
	LimitClass<LinkedList> l2 = new LimitClass<LinkedList>();
	//这句是错误的,因为 HashMap 类没有实现List()接口
	LimitClass<HashMap> l3 = new LimitClass<HashMap>();
	}
 
}

2使用类型通配符

泛型机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象时限制这个泛型类的类或承某个接口或类的子类。要声明这样一个对象可以使用“?”通配符来表示,同时使用 extends穿来对泛型加以限制。使用泛型类型通配符的语法如下:

泛型类名称<?extends List> a=null:
<extendsList>表示类型未知,当需要使用该泛型对象时,可以单独实例化。例如:

A<?extends List> a = null;
B=new A<ArrayList>();
B=new A<LinkedList>();
可以实例化一个限制泛型类型的实例,还可以将该实例放置在方法的参数中。例如:

Public void doSomethina(A<? extends List> a){}
:3,继承泛型类与实现泛型接口

定义为泛型的类和接口也可以被继承与实现。例如,让SubClass 类继承 ExtendClass 的泛型代码
如下:

class ExtendClass<T1>{}
class SubClass<T1,T2,T3> extends ExtendClass<T1>{}
定义为泛型的接口也可以被实现。例如,让SubClass 类实现 SomeInterface 接口,并继承接口的发型,代码如下:

interface Somelnterface<T1>{}
class SubClass<T1,T2,T3> implements Somelnterface<T1>(}
5,泛型总结
1.泛型的类型参数只能是类类型,不可以是简单类型,如 A<in>这种泛型定义就是错误的

2.泛型的类型个数可以是多个。

3.可以使用 extends 关键字限制泛型的类型

4.可以使用通配符限制泛型的类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#两个表多条件关联写法

文章目录 C#两个表多条件关联写法两个表实体类准备实体类数据初始化第一种 sql的左关联第二种相当于sql的 INNER JOIN写法一&#xff1a;FROM a FROM b where 多条件关联写法二&#xff1a; FROM JOIN INTO写法三&#xff1a; FROM JOIN 省略into C#两个表多条件关联写法 两个…

order by数据过多引起的cpu飙升

测试环境 1.目前数据库类型为pg数据库2.目前数据库业务为共享数据库,为减少其他业务对本次测试的影响,故选在业务空闲时间执行3.服务器性能为8C 32GB 500GB硬盘 原程序测试结果 优化后程序结果 出现原因 当数据量大时&#xff0c;order by排序操作会消耗大量的CPU资源&#…

Android登录注册页面(第三次作业)

第三次作业 - 登录注册页面 题目要求 嵌套布局。使用线性布局的嵌套结构&#xff0c;实现登录注册的页面。&#xff08;例4-3&#xff09; 创建空的Activity 项目结构树如下图所示&#xff1a; 注意&#xff1a;MainActivity.java文件并为有任何操作&#xff0c;主要功能集中…

Python---continue关键字对while...else结构的影响(只是跳过某次,之后继续正常结束,执行else)

回顾&#xff1a; 在Python循环中&#xff0c;经常会遇到两个常见的关键词&#xff1a;break 与 continue break&#xff1a;代表终止整个循环结构 continue&#xff1a;代表中止当前本次循环&#xff0c;继续下一次循环 break&#xff1a; 英 /breɪk/ v. 打破&#xff…

供应 JOSEF约瑟 电源监视继电器 HJZZ-92/2A HJZZ-91 DC220V

品牌&#xff1a;JOSEF约瑟名称:监视综合继电器型号:HJZZ-91、HJZZ-92/2A额定电压:48,110,220VDC/110,220,380VAC功率消耗:≤10W触点容量:250V5A 系列型号&#xff1a; HJZZ-91分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/1分闸、合闸、电源监视综合装置&#xff1b;…

SpringCore 完整学习教程1,入门级别

1. SpringApplication SpringApplication类提供了一种方便的方式来引导从main()方法启动的Spring应用程序。在很多情况下&#xff0c;你可以委托给静态的SpringApplication.run方法&#xff0c;如下面的例子所示: import org.springframework.boot.SpringApplication; import…

PgSQL-执行器机制-Unique算子

PgSQL-执行器机制-Unique算子 PgSQL中输出去重的元组有多种方法&#xff0c;比如通过HashAgg或者GroupAgg。这里我们介绍第三种方法&#xff0c;通过Unique算子来完成这个功能。当然语句上可以是&#xff1a;select distinct(id1) from t; 1、ExecUnique 执行器执行算子的函数都…

3.加载天地图

愿你出走半生,归来仍是少年&#xff01; 上一篇文章构建出来基础的白球&#xff0c;现在需要给它添加底图啦。先上最常用的天地图。 1.天地图 天地图做过Gis开发的应该都知道&#xff0c;需要先申请key然后才能使用。然后天地图是基于XYZ的标准进行切片的&#xff0c;所以直接…

FreeRTOS 延时函数和软件定时器 详解

目录 什么是延时函数&#xff1f; 1.延时函数分类 2.vTaskDelay 与 HAL_Delay 的区别 什么是定时器&#xff1f; 1.软件定时器优缺点 2.软件定时器原理 3.软件定时器相关配置 4.单次定时器和周期定时器 软件定时器相关 API 函数 1. 创建软件定时器 2. 开启软件定时器…

C++STL----list的使用

文章目录 list简介list的使用默认成员函数的使用list容器元素的修改front和backpush_front和pop_frontpush_back和pop_backinserterase list迭代器begin和endrbegin和rend list大小控制resizeclear list操作函数sortspliceremoveremove_ifuniquemergereverseassign CSTL----lis…

CloudFlare系列--使用第三方来自定义CDN的IP(笨牛详细版)

原文网址&#xff1a;CloudFlare系列--使用第三方来自定义CDN的IP(笨牛详细版)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何使用自定义节点来提高CloudFlare的CDN节点的访问速度。 CloudFlare的CDN很强大&#xff0c;可以防DDos等攻击&#xff0c;也可以提高国外服务器的访…

假如我有一台服务器,我会让它提供三种服务

一、提供照片上传、存储和下载服务 随着移动互联网时代的持续快速发展&#xff0c;PC互联网日益势微&#xff0c;各大互联网门户网站的博客、空间也跟着凋零&#xff0c; 作为博客、空间的标配功能的相册也随之被关闭。 2019年3月6日网易相册发布停运公告并于当年5月8日正式停…

网络安全—小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

yo!这里是进程间通信

目录 前言 进程间通信简介 目的 分类 匿名通道 介绍 举例&#xff08;进程池&#xff09; 命名管道 介绍 举例 共享内存 介绍 共享内存函数 1.shmget 2.shmat 3.shmdt 4.shmctl 举例 1.框架 2.通信逻辑 消息队列 信号量 同步与互斥 理解信号量 后记…

漫谈广告机制设计 | 混排:广告与自然结果的交锋博弈(2)

话说前文&#xff0c;在彼此不同的利益面前&#xff0c;自然侧和广告侧在混排战场展开了一番较量&#xff0c;一个浑水摸鱼&#xff0c;一个暗渡陈仓。最终双方不得不坐下来&#xff0c;为了平台整体的利益&#xff0c;一起谈谈各自的诉求&#xff0c;商讨一下解决方案。 第三…

安装虚拟机(VMware)保姆级教程及配置虚拟网络编辑器和安装WindowsServer以及宿主机访问虚拟机和配置服务器环境

目录 一、操作系统 1.1.什么是操作系统 1.2.常见操作系统 1.3.个人版本和服务器版本的区别 1.4.Linux的各个版本 二、VMware Wworkstation Pro虚拟机的安装 1.下载与安装 注意&#xff1a;VMWare虚拟网卡 2.配置虚拟网络编辑器 三、安装配置 WindowsServer 1.创建虚拟…

讲述为什么要学习Adobe XD以及 Adobe XD下载安装

首先 我们要了解 Adobe XD 是个什么东西 XD是Adobe公司专门开发出来面向交互、界面设计的矢量绘图工具。 然后是 他可以做什么&#xff1f; 最基本的 可以做UI界面设置 所有 手机 平板 电脑等设备的UI界面 我们都可以通过XD完成 还有就是原型设置 我们可以做各种界面图 还有…

寄存器、CPU缓存、内存。以及他们之间的关系

寄存器 CPU寄存器是CPU内部的高速存储区域&#xff0c;用于临时存储数据和指令。寄存器是CPU的重要组成部分&#xff0c;用于提高程序的执行效率。它们比主存储器更快&#xff0c;可以使得CPU更有效地处理数据和执行指令。 寄存器可以分为不同类型&#xff0c;下面列出部分AR…

用baostock库获取上证50成分股

最近知道了baostock库&#xff0c;免费&#xff0c;开源&#xff08;www.baostock.com&#xff09; 用来试试看。获取上证50成分股&#xff1a; import baostock as bs import pandas as pd# 登陆系统 lg bs.login() # 显示登陆返回信息 print(login respond error_code:lg.…

Docker 镜像读写层核心概念:rootfs、Union mount、image以及layser原理详解

Docker 镜像读写层核心概念&#xff1a;rootfs、Union mount、image以及layser原理详解 文章目录 Docker 镜像读写层核心概念&#xff1a;rootfs、Union mount、image以及layser原理详解rootfsUnion mount为什么镜像层都是只读的去掉读写层的话会有什么问题 Docker镜像imageDoc…