11.1 枚举

枚举是一种数据类型,他是一系列具有名称的常量的集合

11.1.1 使用枚举类型设置常量

在项目中创建Constants接口,在接口中定义常量的常规方式。

public interface Constants{public static final int Constants_A = 1;public static final int Constants_B = 12;
}

使用枚举类型定义常量的语法

public enum Constants{Constants_A,Constants_B,Constants_C
}
package summary;interface Constants{public static final int Constants_A = 1;public static final int Constants_B = 12;
}public class ConstantsTest {enum Constants2{Constants_A, Constants_B}public static void doit(int c){switch (c){case Constants.Constants_A:System.out.println("doit() Constants_A");break;case Constants.Constants_B:System.out.println("doit() Constants_B");break;}}public static void doit2(Constants2 c){switch (c){case Constants_A:System.out.println("doit2() Constants_A");break;case Constants_B:System.out.println("doit2() Constants_B");break;}}public static void main(String[] args) {// TODO Auto-generated method stubConstantsTest.doit(Constants.Constants_A);ConstantsTest.doit2(Constants2.Constants_A);ConstantsTest.doit2(Constants2.Constants_B);ConstantsTest.doit(3);}}

doit() Constants_A
doit2() Constants_A
doit2() Constants_B

11.1.2  深入了解枚举类型

枚举类型较传统定义常量的方式,除了具有参数类型检测的优势之外,还具有其他方面的优势。

用户可以将一个枚举类型看作一个类,他继承于java.lang.Enum类,当定义一个枚举类型时,每一个枚举类型的成员都可以看作一个是枚举类型的一个实例,这些枚举类型成员都默认被final、public、static修饰,所以当使用枚举类型成员时直接使用枚举类型名称调用枚举类型成员即可。

package summary;public class ShowEnum{enum Constants{Constants_A,Constants_B,Constants_C,Constants_D}public static void main(String[] args) {Constants enumArray[] = Constants.values();for(int i = 0; i <= enumArray.length; i++){System.out.println("枚举类型成员变量:" + enumArray[i]);}}}

枚举类型成员变量:Constants_A
枚举类型成员变量:Constants_B
枚举类型成员变量:Constants_C
枚举类型成员变量:Constants_D

从枚举类型构造方法的语法中可以看出,无论是无参构造方法还是有参构造方法,修饰权限都为private。

定义一个构造方法后,需要对枚举类型成员相应的使用该构造方法

package summary;public class EnumConTest {enum Constants2 {Constants_A("我是枚举成员A"),Constants_B("我是枚举成员B"),Constants_C("我是枚举成员C"),Constants_D(3);private String description;private int i = 4;private Constants2(String decription){this.description = description;}private Constants2(int i){this.i = this.i + i;}public String getDescription(){return description;}public int getI(){return i;}}public static void main(String[] args) {Constants2 array[] = Constants2.values();for(int i = 0; i < array.length; i++){System.out.println(array[i] + "调用getDescription()方法为:" + array[i].getDescription());}Constants2 c2 = Constants2.valueOf("Constants_D");System.out.println(c2 + "调用getI()方法为:" + c2.getI());}}

Constants_A调用getDescription()方法为:null
Constants_B调用getDescription()方法为:null
Constants_C调用getDescription()方法为:null
Constants_D调用getDescription()方法为:null
Constants_D调用getI()方法为:7

package summary;public enum AnyEnum implements EnumInterface{Constants_A{public String getDescription(){return ("我是枚举成员A");}public int getI(){return i;}},Constants_B{public String getDescription(){return ("我是枚举成员B");}public int getI(){return i;}},Constants_C{public String getDescription(){return ("我是枚举成员C");}public int getI(){return i;}},Constants_D{public String getDescription(){return ("我是枚举成员D");}public int getI(){return i;}};private static int i = 5;public static void main(String[] args){AnyEnum array[] = AnyEnum.values();for(int i = 0; i < array.length; i++){System.out.println(array[i] + "调用getDescription()方法" + array[i].getDescription());System.out.println(array[i] + "getI()方法" + array[i].getDescription());}}}
package summary;public interface EnumInterface {public String getDescription();public int getI();
}

Constants_A调用getDescription()方法我是枚举成员A
Constants_AgetI()方法我是枚举成员A
Constants_B调用getDescription()方法我是枚举成员B
Constants_BgetI()方法我是枚举成员B
Constants_C调用getDescription()方法我是枚举成员C
Constants_CgetI()方法我是枚举成员C
Constants_D调用getDescription()方法我是枚举成员D
Constants_DgetI()方法我是枚举成员D

11.1.3 使用枚举类型的优势

一、提高代码维护性,确保变量合法。

如果利用int类型表示星期一到星期日的话,就要判断输入int变量不在1-7的范围内的情况

用枚举的方式就没有上述问题

public enum Week{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday}

二、提高代码可读性。

使用的时候直接Week.Monday即可

三、提高代码键入。

故该使用枚举类型的场合请使用枚举类型,不要使用无意义的字符表示一些有具体意义的类别

11.2 泛型

11.2.1 回顾向上转型与向下转型

package summary;public class Test {private Object b;public Object getB(){return b;}public void setB(Object b){this.b = b;}public static void main(String[] args) {Test t = new Test();t.setB(new Boolean(true));System.out.println(t.getB());t.setB(new Float(12.3));Float f = (Float) (t.getB());System.out.println(f);}}

true
12.3

11.2.2 定义泛型类

Object类为最上层的父类,很多程序员为了使程序更为通用,设计程序时通常使传入的值与返回值都以Object类型为主。当要使用这些实例时,必须正确地将该实例转换为原来的类型

泛型语法

类名<T>

其中T代表一个类型的名称

package summary;public class OverClass<T> {private T over;public T getOver(){return over;}public void setOver(T over){this.over = over;}public static void main(String[] args){OverClass<Boolean> over1 = new OverClass<Boolean>();OverClass<Float> over2 = new OverClass<Float>();over1.setOver(true);over2.setOver(12.3f);Boolean b = over1.getOver();Float f = over2.getOver();System.out.println(b);System.out.println(f);}}

true
12.3

使用泛型定义的类在声明该类对象时可以根据不同的需求2指定<T>真正的类型,而在使用类中的方法传递或返回数据类型时将不再进行类型转换操作。

11.2.3 泛型的常规用法

定义泛型类时声明多个类型

MutiOverClass<T1,T2>

MutiOverClass;

其中T1,T2 为可能定义的类型。这样在实例化指定类型的对象时就可以指定多个类型

MutiOverClass<Boolean,Float>=new MutiOverClass<Boolean,Float>();

2. 定义泛型类时声明数组类型

package summary;public class ArrayClass<T> {private T[] array;public T[] getArray(){return array;}public void setArrar(T[] array){this.array = array;}public static void main(String[] args) {ArrayClass<String> a = new ArrayClass<String>();String[] array = {"成员1","成员2","成员3","成员4","成员5"};a.setArrar(array);for(int i = 0; i < a.getArray().length; i++){System.out.println(a.getArray()[i]);}}}

成员1
成员2
成员3
成员4
成员5

3. 集合类声明容器的元素

通过在集合类中应用泛型可以使集合类中的元素类型保证唯一性。

package summary;import java.util.HashMap;
import java.util.Map;public class MutiOverClass<K,V> {public Map<K,V> m = new HashMap<K,V>();public void put(K k, V v){m.put(k,v);}public V get(K k){return m.get(k);}public static void main(String[] args) {MutiOverClass<Integer, String> mu = new MutiOverClass<Integer, String>();for(int i = 0; i < 5; i++){mu.put(i, "我是集合成员" + i);}for(int i = 0; i < mu.m.size(); i++){System.out.println(mu.get(i));}}}

我是集合成员0
我是集合成员1
我是集合成员2
我是集合成员3
我是集合成员4

* 常用的被泛型化的集合类
 * 集合类                                           泛型定义
 * ArrayList        ArrayList<E>
 * HashMap            HashMap<K,V>
 * HashSet            HashSet<E>
 * Vector            Vector<E>

package summary;import java.util.*;public class ListClass {public static void main(String[] args) {List<Integer> a = new ArrayList<Integer>();a.add(1);for(int i = 0; i < a.size(); i++){System.out.println("获取ArrayList容器的值:" + a.get(i));}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));}Set<Character> set = new HashSet<>();set.add('一');set.add('二');for(Character c:set){System.out.println("获取Set容器的值:" + c);}}}

获取ArrayList容器的值:1
获取Map容器的值:成员0
获取Map容器的值:成员1
获取Map容器的值:成员2
获取Map容器的值:成员3
获取Map容器的值:成员4
获取Set容器的值:一
获取Set容器的值:二

11.2.4 泛型的高级用法

1. 通过类型参数T的继承限制泛型类型

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

class 类名称<T extends anyClass>

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

2. 通过类型通配符的继承限制泛型类型

在泛型机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象时,限制这个泛型类的类型。

使用泛型类型通配符语法

泛型类名称<? extends List> a = null;

如果实例化没用实现List接口的泛型对象,编译器将会报错。

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

package summary;import java.util.*;public class WildClass {public static void main(String[] args) {List<String> l1 = new ArrayList<String>();l1.add("成员");List<?> l2 = l1;List<?> l3 = new LinkedList<Integer>();System.out.println("l1" + l1.get(0));System.out.println("l2" + l2.get(0));l1.set(0, "成员改变");System.out.println("l1:" + l1.get(0));}}

l1成员
l2成员
l1:成员改变

3. 继承泛型类与实现泛型接口

定义为泛型的类和接口也可以被继承与实现

public class ExtendClass<T1>{}class SubClass<T1,T2,T3> extends ExtendClass<T1>{
}

11.2.5 泛型总结

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。 这个 类型参数 将在 使用时 (例如继承或实现这个接口,用这个类型声明变量、创建对象时) 确定 (即传入实际的类型参数,也称为类型实参)。

Java第十一章总结相关推荐

  1. 速学堂(java)第十一章编程题答案(自写)

    速学堂(java)第十一章编程题答案(自写) 1.设计一个多线程的程序如下:设计一个火车售票模拟程序.假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 ...

  2. java 第十一章总结

    加载驱动 try{Class.forName("com.mysql.jdbc.Driver");}catch(Exception e){} 连接数据库 Connection get ...

  3. Java 第十一章总结 枚举与泛型

    11.1 枚举 (1) 使用枚举类型设置常量 在项目中创建Constants接口,在接口中定义常量的常规方式. public interface Constants{ public static fi ...

  4. java语言仅支持单重继承_java语言程序设计基础篇习题_复习题_第十一章

    java语言程序设计基础篇习题_复习题_第十一章 11.1 下面说法是真是假?一个子类是父类的子集. 11.2 使用什么关键字来定义一个子类 11.3 什么是单一继承?什么是多重继承?java支持多重 ...

  5. 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆

    第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 文章目录 第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 一.顺序存储二叉树 1.介绍 2.代码实现 二.线索二叉树 1 ...

  6. 【JAVA SE】第十一章 正则表达式、包装类和BigDecimal

    第十一章 正则表达式.包装类和BigDecimal 文章目录 第十一章 正则表达式.包装类和BigDecimal 一.正则表达式 二.包装类 1.概述 2.装箱与拆箱: 3.基本数据和包装类之间的转换 ...

  7. Java语言程序设计(基础篇) 第十一章 继承和多态

    第十一章 继承和多态 11.1 引言 面向对象的编程允许你从已经存在的类中定义新的类,这称为继承. 11.2 父类和子类 1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类( ...

  8. Java编程思想第四版第十一章习题(下)

    这是第十一章最后一节,之后我会做前11章节的回顾(按着目录捋) 题目27-32,其中30-32因为我没有源代码,所以我贴的官网答案. 编译器:IDEA 27.写一个称为Command的类,它包含一个S ...

  9. 第十一章 Java IO编程

    第十一章 Java IO编程 11.1 文件操作类:File java.io包中,如果要进行文件自身操作(创建,删除),只能依靠java.io.File类完成. NO. 方法 类型 描述 1 publ ...

  10. java程序设计基础_陈国君版第五版_第十一章例题

    java程序设计基础_陈国君版第五版_第十一章习题 class MyThread extends Thread { private String who;public MyThread(String ...

最新文章

  1. Way to configure the logon navigaion layouts via Business Roles in CRM
  2. Linux的Nginx三:类型|特点
  3. python获取键盘输入_python如何获取键盘输入
  4. Careless Me
  5. nginx搭建基于http协议的视频点播服务器
  6. The Nighth Assignment
  7. 如何设置iPhone的手机铃声?【来自星星的你】
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_23-页面查询服务端开发-Service及Controller...
  9. IDEA回到光标的上一次位置
  10. 二、文章发布页制作及后台实现《iVX低代码/无代码个人博客制作》
  11. 2019APMCM亚太数学建模题目
  12. 苏宁小店助销湘西椪柑 6小时双线销量超60000斤
  13. vue优化技巧之mixins
  14. 低配置享受3D立体游戏 手把手教你设置
  15. 关于VS.NET中多个项目的工程相互引用和多个dll引用的问题! - antony--异域空间 - 博客园
  16. wc,这进度条好快,不行我也得展示一下——python教你各种方法无障碍实现进度条
  17. 融金所-孙明达:中国普惠金融覆盖率已属较高水平
  18. binlog_do_db 与 binlog_ignore_db
  19. 关于标准电阻阻值的说明(E6、E12、E24、E48、E96、E192)
  20. 【友云音】友云音部署常见问题

热门文章

  1. js实现审批流_顺序审批流的简单代码实现
  2. 常见排序算法原理及java实现
  3. 计算机研究生哪个子专业最容易考公务员
  4. 经济学和计算机考研哪个较难,经济学考研难吗,经济学为什么考研这么难!!!!?...
  5. 目前惯导的几大类型介绍(一文了解)
  6. linux嵌入式reboot不生效,Embeded linux之reboot
  7. 网上找的更具纬度经度算计两点之间的距离,得到的结果不准确, 小程序获取用户位置信息返回的纬度经度与实际位置不正确。
  8. 【CodeForces 1077E --- Thematic Contests】思维+贪心
  9. 语法高亮自定义颜色主题配置(Code::Blocks)
  10. 7分钟学会HTML网页制作