Java基础(六) 集合之(二) 泛型及枚举类型

Java基础(六) 集合之(二) 泛型及枚举类型

  • 泛型
  • 枚举类型

1. 泛型

对于一个Point类,为了类的可扩展性,其内构造如下:

Class Point{
    Object x;
    Object y;
}

这样,x和y,既可以赋值为int类型、long类型,也可以赋值为float和double类型。

但于此同时,也存在着一些列的问题:

  • 赋值的时候,需要强制类型转换;
  • 由于使用Object,需要强制类型转换,强制类型转换不安全。

如果能够传入一个参数,类中的参数类型根据这个参数的类型。根据实参就能确定这个形参的类型,就可以解决这个问题。由此,范型的概念应运而生。

范型可以解决如下的问题:

  • 范型可以使类中的属性的类型由外部决定;
  • 不需要强制类型转换;
  • 泛型可以在编译期间进行类型检查;
  • 提供了类型安全的操作。

编译器的泛型兼容性检查:

  • 泛型和原始类型的兼容性
1. 原始类型可以引用一个泛型类型
   List list = new ArrayList<String>();
2. 泛型类型可以引用一个原始类型的对象
   List<String> list = new ArrayList(); 
  • 类型参数不同的泛型类型不能相互引用,不考虑参数类型间的兼容性
List<Object> l = new ArrayList<String>();//false

List list;
List<Object> oList;
List<String> sList=new ArrayList<String>();
olist=slist;//false
oList=list;//true
list=sList;//true

参考例子:GenericTest.java Point2.java PointTest.java

在泛型的对象中,符号<T>的区别是什么?有哪些区别?

2. 枚举类型

2.1 概要

JDK1.5增添了枚举类型,可以使用enume来进行定义。

public enum Gender{
    MALE,FEMAILE;
}
// 其中每一个类型都是该枚举类型的一个实例

使用

Gender g = Gender.MALE;s
遍历
foreach(Gender s:Gender.values())

Enum类和Enum关键字的区别:

  • 使用enum关键字定义枚举类型,实际上相当于定义了一个类,此类继承了java.lang.Enum;
  • 每一个枚举值都是枚举类型的实例,它们被预设为了public static final;

Enum类只有一个受保护的构造方法:

protected Enum(String name,int ordinal)
ordinal 相当于元素的编号。
每一个枚举元素在定义后,就会自动调用此方法,所有的编号采用自动编号的方式进行(编号从0开始)

使用valueof()的方法,可以找到枚举中的一个指定对象。

public enum Color{
    RED,BLUE;
}
//获取枚举类型有两种方法
//1. valueof()函数调用
String name="RED";
Color c1 = Color.valueof(name);
//2. 直接调用
Color c2=Color.RED;

// 第一种方式是根据字符串的值来获取对象的,只要改变字符串的值,我们就可以随意的改变对象;
// 第二种方式是写死了代码,不管如何变化都是取得的Color.RED对象,不会改变。

2.2 枚举的属性和方法

  • 枚举内的属性和方法

枚举中可以拥有属性和方法,但是必须在元素声明之后,例如:

public enum Color{
    RED,BLUE;
    private String name;
    public String getName(){return this.name;}
}
  • 枚举内的构造方法
    • 枚举内的构造方法必须定义在元素列表之后;
    • 枚举类型的构造方法只能是private的,不写默认也是private的;
    • 元素若需要调用有参数的构造方法,须在构造的时候添加构造参数。

举例如下:

public enum Color{
    RED(“红色”),BLUE,BLACK;
    private String name;
    public String getName(){return this.name;}
    Color(String name){this.name=name;}//有参构造函数
    Color(){}//无参构造函数
}
  • 枚举的使用
//拿到Color中的三个固定对象的其中一个
             Color c = Color.RED;
             //拿到RED对象中的name属性的值
             //这个值打印出来会是 "红色"
             //因为是RED这个对象才创建的时候
             //通过一个参数的构造器传给属性name的
             //在枚举类型中声明元素列表其实就是
             //在创建这个枚举类型的固定对象
             String name = c.getName();

2.3 枚举的接口和抽象方法

枚举类型隐式继承了Enum,因此无法再继承其他类。(Java内类是单继承的)

  • 枚举实现接口

      1. 和类中一样,在枚举类中统一实现接口内容;
      1. 各个枚举类型分别实现接口内容。
  • 第一种方式

public enum Color implements Sofa{
    RED,BLUE;
    privat String name;
    public void sit{
    //实现接口内容
    }
}
  • 第二种方式
//每一个枚举元素对象中单独实现这个接口中的抽象方法 将来每个枚举元素对象调用到的就是自己独立实现的这个sit方法
public enum Color implements Sofa{
    RED{
        public void sit(){ }
    },
    BLUE{
        public void sit(){ }
    };
    privat String name; 
}
  • 枚举中的抽象方法

在一个枚举类型中,可以定义多个抽象方法,但是每个枚举元素都必须实现这个抽象方法。

public enum Color{
    RED{
        public String getInfo(){return "RED";}
    },
    BLUE{
        public String getInfo(){return "BLUE";}
    };
    public abstract String getInfo();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值