美文网首页
《Oracle Java SE编程指南》20-01:为什么要使用

《Oracle Java SE编程指南》20-01:为什么要使用

作者: AT阿宝哥 | 来源:发表于2020-05-03 11:08 被阅读0次
课程封面-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阿宝哥

相关文章

网友评论

      本文标题:《Oracle Java SE编程指南》20-01:为什么要使用

      本文链接:https://www.haomeiwen.com/subject/dyhdghtx.html