第13章枚举类型与泛型

泛型概念

实质上就是程序员定义的安全的类型强制类型转换的错误不会被编译器捕捉,而在进行后出现异常

,所以强制类型转换存在安全隐患,所以提供了泛型机制

定义泛型类

object类是最上层的父类很多程序员为了使程序更加通用,设计程序时通常使返回和传入的参数以object类为主,当使用这些实例的时候必须将它们转换为原来的类型,否则会出现ClassCastException异常。

为了应对这种问题,提供了泛型机制,语法如下:

类名<任意字母>

例题1

创建带泛型的图书类

使用泛型类定义的类在声明对象时可以根据不同的需求,指定类型。

在使用类中的方法传递或返回数据类型时不需要进行类型转换操作,而是在声明泛型对象时<>符号设置数据类型。

使用泛型的这种形式不会发生 ClassCastException异常。

如果不按照泛型指定的类型进行赋值,就会发生编译错误

泛型的常规用法

定义泛型时声明多个类型

class Myclass<T1,T2>{ }

定义泛型时声明数组类型

就是定义类和定义数组一样;

使用泛型机制时声明一个数组,但不可以使用泛型建立数组 

泛型的高级用法 

1、限制泛型可用类型

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

语法如下:

class 类名名称<T extends anyClass>

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

2、使用类型通配符

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

使用泛型类型通配符的语法如下:

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

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

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

class ExtendClass<T1>{}

class SubClass<T1,T2,T3>implements SomeInterface<T1>{}
 

枚举

使用枚举类型设置常量

       设置常量时,我们通常放置在接口中,这样在程序中就可以直接使用。该常量不能被修改,因为在接口中定义常量时,改常量的修饰符为final与static。常规定义常量代码如下:

interface SeasonInterface{

final int spring=1;

final int summer=2;

final int autumn=3;

final int winter=4;

}

 枚举类型出现后,逐渐取代了上述常量定义方式。代码如下:

public enum SeasonEnum {

spring,

summer,

autumn,

winter;

}

 代码如下:

package java2;

public interface 四季 {//四季接口
	final int c=1;
	final int x=2;
	final int q=3;
	final int d=4;
}

public enum S四季Enum {四季枚举
	c,
    x,
	q,
	d,

public class 季节 {
	public static void print1(int temp) {
		
		switch(temp) {
		case 四季.c:
			System.out.println("这是春季");
			break;
		case 四季.x:
			System.out.println("这是夏季");
			break;
		case 四季.q:
			System.out.println("这是秋季");
			break;
		case 四季.d:
			System.out.println("这是冬季");
			break;
		default :
			System.out.println("编号有误,请输入正确的编号!");
		}
	}
	private static void print2(S四季Enum c) {
		switch(c) {
		case c:
			System.out.println("这是春季");
			break;
		case x:
			System.out.println("这是夏季");
			break;
		case q:
			System.out.println("这是秋季");
			break;
		case d:
			System.out.println("这是冬季");
			break;
		default :
			System.out.println("编号有误,请输入正确的编号!");
		}
		
	}
	
	public static void main(String[] args) {
		print1(2);
		print2(S四季Enum.c);
		
	}

结果:

深入了解枚举类型

1、values()方法

        枚举类型实例,该方法将枚举中所有的枚举值以数组的形式返回。

代码如下:

//枚举
public enum S四季Enum {
	c,
	x,
	q,
	d;
public static void main(String[] args) {
		S四季Enum[] seasons=S四季Enum.values();
		for(S四季Enum temp:seasons) {
			System.out.println(temp+"是第"+(temp.ordinal()+1)+"个季节");
		}
		
		for(int i=0;i<seasons.length;i++) {
			S四季Enum temp=seasons[i];
		}
	}

2、valuesOf()方法与compareTo()方法

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

3、ordinal()方法

        枚举类型中的 ordinal() 方法用于获取某个枚举对象的位置索引值。 

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

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

代码如下:
 

//枚举

public enum S四季Enum {
	c("春暖花开"),
	x("夏日炎炎"),
	q("秋高气爽"),
	d("白雪皑皑");
	private String intro;
	
	public String getIntro() {
		return intro;
	}
	private S四季Enum() {
		System.out.println("I am"+this.toString());
	}
	private S四季Enum(String intro) {
		System.out.println("I am"+this.toString()+"我来之后"+intro);
		}
}



public static void main(String[] args) {
		S四季Enum[] seasons=S四季Enum.values();
		for(S四季Enum temp:seasons) {
			System.out.println(temp+"是第"+(temp.ordinal()+1)+"个季节");
		}
		
		for(int i=0;i<seasons.length;i++) {
			S四季Enum temp=seasons[i];
		}
	}

}

 

 

使用枚举类型的类型

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

  • 类型安全。
  • 紧凑有效的数据定义。
  • 可以和程序其他部分完美交互。
  • 运行效率高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值