2009122101 - 面向对象(高级) - 02 - 图文 下载本文

};

private Object y ; public void setX(Object x){ } public void setY(Object y){ } public Object getX(){ } public Object getY(){ } return this.y ; return this.x ; this.y = y ; this.x = x ; 北京MLDN软件实训中心 联系电话:010-51283346 下面分别通过不同的数据类型对程序进行验证: public class PointDemo { }; public static void main(String args[]){ } Point p = new Point() ; p.setX(10) ; p.setY(30) ; // int --> Integer --> Object // int --> Integer --> Object 1、 使用int型

int x = (Integer) p.getX() ; // Object --> Integer --> int int y = (Integer) p.getY() ; // Object --> Integer --> int System.out.println(\的坐标:\System.out.println(\的坐标:\2、 使用float型 public class PointDemo { }; 3、 使用String型 public class PointDemo { public static void main(String args[]){ Point p = new Point() ; p.setX(\东经120度\

第(13)页 共(31)页

E-Mail:mldnqa@163.com

public static void main(String args[]){ } Point p = new Point() ; p.setX(10.3f) ; p.setY(30.5f) ; float x = (Float) p.getX() ; float y = (Float) p.getY() ; System.out.println(\的坐标:\System.out.println(\的坐标:\ };

} p.setY(\北纬100度\ String x = (String) p.getX() ; String y = (String) p.getY() ; 北京MLDN软件实训中心 联系电话:010-51283346 System.out.println(\的坐标:\System.out.println(\的坐标:\现在已经解决了本题目的要求,按照之前所学,现在肯定是最合理的解决方案,但是,本程序又存在了一个安全隐

患,因为所有的类型都使用Object进行接收,那么有没有一种可能,将X的坐标设置成了整型,而Y的坐标设置成了字符串?

public class PointDemo { }; }; 程序中的“”就表示的是一种类型,只是这种类型现在属于未知的,在类使用的时候设置类型。 public class PointDemo { public static void main(String args[]){ Point p = new Point() ; p.setX(\东经100度\p.setY(\北纬100度\

第(14)页 共(31)页

E-Mail:mldnqa@163.com

那么,对于以上的问题,在JDK 1.5之后就可以解决了,因为JDK 1.5有一个最大的特点,就是加入了泛型的操作。 class Point { private T x ; private T y ; public void setX(T x){ } public void setY(T y){ } public T getX(){ } public T getY(){ } return this.y ; return this.x ; this.y = y ; this.x = x ; public static void main(String args[]){ } Point p = new Point() ; p.setX(100) ; p.setY(\北纬100度\String x = (String) p.getX() ; String y = (String) p.getY() ; System.out.println(\的坐标:\System.out.println(\的坐标:\ }; };

} String x = p.getX() ; String y = p.getY() ; 北京MLDN软件实训中心 联系电话:010-51283346 System.out.println(\的坐标:\System.out.println(\的坐标:\泛型中的类型可以由外部决定,但是在设置基本数据类型的时候,只能使用包装类。 public class PointDemo { public static void main(String args[]){ } 设置泛型之后,程序更加安全了,可以避免掉类转换异常的出现。

Point p = new Point() ; p.setX(10) ; p.setY(20) ; int x = p.getX() ; int y = p.getY() ; System.out.println(\的坐标:\System.out.println(\的坐标:\3.4、泛型(理解)

JDK 1.5之后增加了很多的新特性,其中有三项是最重要的新特性:泛型、枚举、Annotation,但是这三项中并不能泛型作为一个较大的新特性,在类库中使用较多,但是一般都是结合类集框架来看的,本次只是将一些基本的语法作为程序开发的重点。

进行讲解,先来观察基本概念。

3.4.1、泛型的作用

泛型的主要目的是为了解决在进行类转换过程中发生的类转换异常的问题,用于处理安全隐患的。所以为了避免掉ClassCastException在JDK 1.5之后增加了泛型的操作,泛型的具体含义就是一个类中的某些属性的操作类型由使用此类的时候决定。

在设置烦型的时候是通过“”的形式设置的,这里只是设置了一个标记,以后会根据设置的情况换成不同的类型,但是需要注意的是,为了保证JDK 1.5之前代码的使用正常,所以在泛型中也可以不设置类型,如果不设置的话,称为擦除泛型,将全部使用Object进行接收。

当然,也可以同时设置多个泛型类型,例如: class Point {} 3.4.2、通配符

泛型确实可以保证程序避免安全隐患问题,但是程序中一旦使用了泛型之后对于引用传递上又会存在问题。 class Info {

第(15)页 共(31)页

E-Mail:mldnqa@163.com

}; public class GenDemo01 { }; };

private T content ; public void setContent(T content){ } public T getContent(){ } return this.content ; this.content = content ; 北京MLDN软件实训中心 联系电话:010-51283346 public static void main(String args[]){ } public static void fun(Info temp){ } 以上的程序非常的容易,但是这个时候有一个问题出现了,如果现在设置的泛型类型不是String呢? 由于fun()方法上设置的Info只能接收String,所以肯定无法传递,那么如果现在在fun()方法中不写呢?

System.out.println(temp.getContent()) ; Info info = new Info() ; info.setContent(\fun(info) ; public class GenDemo01 { public static void main(String args[]){ } public static void fun(Info temp){ } 如果这样写的话,则意味着,以后可以通过fun()方法向Info的对象中设置任意样的内容。 public static void fun(Info temp){ } 这种操作是存在安全隐患的。那么如果写成如下的形式? public static void fun(Info temp){ } 这种做法肯定没意义,而且不能编译通过,那么该如何修饰呢?此时关键性的问题,是如何解决调用设置的问题,

System.out.println(temp.getContent()) ; temp.setContent(\System.out.println(temp.getContent()) ; System.out.println(temp.getContent()) ; Info info = new Info() ; info.setContent(30) ; fun(info) ; 而不是取得属性输出的问题,所以说在泛型中增加了一个“?”表示的是接收所有的泛型类型,而且一旦接收之后只能取得,不能设置。

public class GenDemo01 { public static void main(String args[]){

第(16)页 共(31)页

E-Mail:mldnqa@163.com