当前位置: 首页 > news >正文

13章总结

一.泛型

        1.定义泛型类

泛型机制语法

类名<T>

        其中,T是泛型的名称,代表某一种类型。

【例13.6】创建带泛型的图书类

代码:

结果:

 

2.泛型的常规用法
(1)定义泛型类时声明多个变量
class MyClass<T1,T2>{ }
其中,T1和T2为可能被定义的类型。

这样,在实例化指定类型的对象时就可以指定多个类型。例如:

MyClass<Boolean,Float> m=new MyClass<Boolean.float>();
(2)定义泛型时声明数组类型 
        【例13.7】定义泛型数组
代码:

结果:

 

可见,可以在使用泛型机制时声明一个数组,但是不可以使用泛型来创建数组的实例

(3)集合类声明容器的元素

JDK中的集合接口、集合类都被定义了泛型,其中List<E>的泛型E实际上就是element元素的首字母,Map<K,V>的泛型K和V就是key键和value值的首字母。

3.泛型的高级用法

(1)限制泛型可用类型

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

class 类名称<T extends anyClass>

 

其中,anyClass指某个接口或类。 

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

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

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

A<? extends List> a=null;
a=new A<ArrayList>();
a=new A<LinkedList>();
如果实例化没有实现List接口的泛型对象,编译器会报错。

除了可以实例化一个限制泛型类型的实例,还可以将该实例放置在方法的参数中。例如:

public void doSomething(A<? extends List>a){}
在上述代码中,定义方法有效地限制了传入doSomething()方法的参数类型。

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

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

interface SomeInterface<T1>{}
class SubClass<T1,T2,T3> implements SomeInterface<T1>{}
        4.泛型总结
使用方法:

(1)泛型的类型参数只能是类类型,不可以是简单类型,如A<int>这种泛型定义就是错误的。

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

(3)可以使用extends关键字限制泛型的类型。

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

二.枚举类型
        1.使用枚举类型设置常量
使用枚举类型定义常量的语法:

public enum Constants{
    Constants_A,
    Constants-B,
}
其中,enum是定义枚举类型的关键字。

当需要在程序中使用该常量时,可以使用Constants.Constants_A来表示。

【例13.1】分别创建四季的接口常量和枚举,比较两者的使用场景

代码:

 结果:

2.深入了解枚举类型

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

代码:

 

结果:

 

3.使用枚举类型的优势

(1)类型安全。

(2)紧凑有效的数据定义。

(3)可以和程序其他部分完美交互。

(4)运行效率高。

相关文章:

  • python哈希算法实现
  • 智慧工地项目端监管端一体化SaaS云平台源码(微服务架构)
  • uni-app 命令行创建
  • 《软件需求分析报告》
  • [RISCV] 为android14添加一个新的riscv device
  • C语言中switch语句中的case后()
  • React TSX 从一组二维数据中,重新挑选数组组成新数组示例:
  • 实现 Spring Boot 项目热重载,无需重启,省时省力
  • DDOS攻击简介——什么是DDOS
  • PyQt5实现学生管理系统第三天(下)
  • 无法获取前置摄像头的预览图像?【Bug已解决-鸿蒙开发】
  • JavaScript 数组【详解】
  • LabVIEW在横向辅助驾驶系统开发中的应用
  • Spring中的上下文工具你写的可能有bug
  • 创建ROS的软件包服务器
  • 77. Combinations
  • CSS 提示工具(Tooltip)
  • go语言学习初探(一)
  • gulp 教程
  • JavaScript DOM 10 - 滚动
  • JavaScript学习总结——原型
  • Java小白进阶笔记(3)-初级面向对象
  • SpringCloud集成分布式事务LCN (一)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 对象引论
  • 关于for循环的简单归纳
  • 聊聊directory traversal attack
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • ionic异常记录
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #if和#ifdef区别
  • $ git push -u origin master 推送到远程库出错
  • (07)Hive——窗口函数详解
  • (C)一些题4
  • (搬运以学习)flask 上下文的实现
  • (附源码)计算机毕业设计ssm电影分享网站
  • (一)插入排序
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***通过什么方式***网吧
  • .Net 代码性能 - (1)
  • .NET命名规范和开发约定
  • .net实现客户区延伸至至非客户区
  • .NET中两种OCR方式对比
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [Head First设计模式]策略模式
  • [LeetCode]—Longest Palindromic Substring 最长回文子串
  • [NISACTF 2022]easyssrf
  • [objective-c]关于KVC--KVO--KVB
  • [OCR]Python 3 下的文字识别CnOCR
  • [Oh My C++ Diary]类继承和类组合(内嵌类)初始化的不同
  • [PHP]关联和操作MySQL数据库然后将数据库部署到ECS