《Oracle Java SE编程指南》20-01:为什么要使用
2020-05-03 本文已影响0人
AT阿宝哥
课程封面-JavaSE-AT阿宝哥
内容导航:
- 前言
- 1、问题场景
- 2、解决方案
- 3、改进方案
- 4、方案缺陷
1、问题场景
要创建两个类的对象,并打印出各自的成员。
相同:
- 成员x的名称;x
不同:
- 成员x的类型;
- 成员x的所属类型;
2、解决方案
根据需要,针对x的具体类型创建每一个类。但是,这个方案随着x类型的增加,代码冗余呈线性增长态势。
示例代码-Double样例类:
package com.company.project.demo010201;
//类:Double样例类
public class DoubleType {
// 属性
private Double x;
// 构造方法
public DoubleType() {
super();
}
// 重载构造方法
public DoubleType(Double x) {
super();
this.x = x;
}
public Double getX() {
return x;
}
public void setX(Double x) {
this.x = x;
}
}
示例代码-String样例类:
package com.company.project.demo010201;
//类:String样例类
public class StringType {
// 属性
private String x;
// 构造方法
public StringType() {
super();
}
// 重载构造方法
public StringType(String x) {
this();
this.x = x;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
}
3、改进方案
因为上面的两个类中,成员和方法的逻辑都一样,就是类型不一样,因此考虑重构。
Object是所有类的父类,因此可以考虑用Object作为成员类型,这样就可以实现通用了,实际上就是“Object泛型",暂时这么称呼吧。
相同:
- 成员x的名称;
- 成员x的类型:
- 成员x的所属类:
1、在JDK1.5之前,为了让类有通用性,往往将成员属性、参数类型、返回值类型设置为Object类型;
2、当获取这些返回类型来使用的时候,必须将其“强制”转换为原有的类型或者接口,然后才可以调用对象上的方法。
好处与特点:
- 1、节省了代码量;
- 2、初始化对象时不做类型检查,意味着任何引用类型的对象都可以“动态传入”;
- 3、使用对象时有必要做“强制类型转换”,这可能意味着转换失败会出错;
示例代码-Object类:
package com.company.project.demo010301;
//类:ObjectType
public class ObjectType {
// 属性
private Object x;
// 构造方法
public ObjectType() {
super();
}
// 重载构造方法
public ObjectType(Object x) {
super();
this.x = x;
}
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
}
示例代码-Client:
package com.company.project.demo010301;
public class Client {
public static void main(String[] args) {
ObjectType stringType = new ObjectType( new String("Hello Generics!") );
ObjectType doubleType = new ObjectType( new Double("99.00") );
ObjectType objectType = new ObjectType( new Object() );
System.out.println( "stringFoo.getX() :" + stringType.getX());
System.out.println( "doubleFoo.getX() :" + doubleType.getX());
System.out.println( "objectFoo.getX() :" + objectType.getX());
//如果还有其他类型,比如Integer类型,那么如此往复的写。
ObjectType integerType = new ObjectType( new Integer("99") );
System.out.println( "IntegerFoo.getX() :" + (Integer)integerType.getX());
}
}
运行结果:
stringFoo.getX() :Hello Generics!
doubleFoo.getX() :99.0
objectFoo.getX() :java.lang.Object@7852e922
IntegerFoo.getX() :99
4、方案缺陷
缺点:
- 1、初始化对象时不做类型检查,意味着任何引用类型的对象都可以“动态传入”;
- 2、使用对象时有必要做“强制类型转换”,这可能意味着转换失败会出错;
示例代码-ObjectType类:
package com.company.project.demo010401;
//类:ObjectType
public class ObjectType {
// 属性
private Object x;
// 构造方法
public ObjectType() {
super();
}
// 重载构造方法
public ObjectType(Object x) {
super();
this.x = x;
}
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
}
示例代码-Client 类:
package com.company.project.demo010401;
public class Client {
public static void main(String[] args) {
ObjectType objectType = new ObjectType(new Object());
ObjectType stringType = new ObjectType(new String("Hello Generics!"));
ObjectType doubleType = new ObjectType(new Double(Double.MAX_VALUE));
ObjectType floatType = new ObjectType(new Float(Float.MAX_VALUE));
ObjectType integerType = new ObjectType(new Integer(Integer.MAX_VALUE));
ObjectType shortType = new ObjectType(new Short(Short.MAX_VALUE));
// 父类转子类:编译期不做类型检查,运行时异常。
// java.lang.ClassCastException: java.lang.Object cannot be cast to
// java.lang.Double
//System.out.println((Double) objectType.getX());
// 大数转小数
// java.lang.ClassCastException: java.lang.Double cannot be cast to
// java.lang.Float
//System.out.println((Float) doubleType.getX());
//System.out.println((Short) integerType.getX());
// 异种类型强转
// java.lang.ClassCastException: java.lang.String cannot be cast to
// java.lang.Integer
System.out.println((Integer) stringType.getX());
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Double
at com.company.project.demo010401.Client.main(Client.java:35)
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Float
at com.company.project.demo010401.Client.main(Client.java:40)
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at com.company.project.demo010401.Client.main(Client.java:46)
持续更新,欢迎留言提议!
码字很累,多点赞多赞赏!
扫描二维码,关注AT阿宝哥