1.要想导入不同的包的类的方法,那么肯定使用import完成.
类中方法全部都属于static,而按照之前的方式如果要使用这个类,操作如下:
如果一个类中的全部方法都是static型的,则可以使用如下的语法进行静态导入.
静态方法
import static 包.类.*;
运行结果
静态导入,是将这个指定类中的全部方法导入进来,最后就好像这些方法全部是在类中定义的方法一样.
2.泛型的引出
泛型:类中操作的属性或方法的参数类型不在定义时声明,而是在使用时动态设置.
我们定义一个表示坐标的类(Ponit),这个类可以表示3种类型坐标.
整数坐标:x=22、y=66;
小数坐标:x=50.1 y=60.3
字符串坐标:x=“东经90度”、y=“北纬22度”
保存上面数据,一定需要定义x和y两个属性,而这两个属性可以接受3种数据类型,那么使用Object类来定义会比较合适,这样会发生几种转换关系:
整数: int ===>自动装箱为Integer ==>向上转型为Object;
小数: double ===>自动装箱为Double ==>向上转型为Object;
字符串: 字符串 ==>向上转型为Object;
定义ponit类,使用Object作为属性类型
设置整型数据
设置小数数据
设置字符串数据
看起来是没有问题,但是Object类,所有的类型都可以向Object转换,但是,成是Object,败也是Object.修改setX()值
运行结果
没有出现语法错误,但是数字10被装箱成了Integer,可以使用Object接受,操作是没有问题,数据是错的,因为没有统一,所有数据在向下转型的过程中会出现错误提示信息.现在可以用泛型解决问题.
Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at class3.TestD3.main(TestD3.java:28)3.实现泛型概念
此时circle类中的x和y两个属性的类型暂时还不知道,等待使用时动态配置.
使用泛型
此时没有向下转型操作关系,避免了安全问题,而且设置类型不统一,会直接报出语法错误.
4.泛型类型只能设置为类
如果设置泛型类型,只能将其定义为类的形式,例如,如果要保存的数据为int,则设置的类型必须是其包装类Integer,而此时,自动装箱及拆箱机制就可以给予很好支持.
设置了泛型类型String,所以程序对应setter方法参数类型就统一设置为String,而如果设置数据不是String,则编译出现语法错误.
不设置泛型,在程序编译时会出现警告信息,为了不出错,所有类型使用Object进行处理,使用泛型很好解决数据统一问题.
定义泛型:
JDK1.5 声明对象实例化对象必须同时设置好泛型
JDK 1.7 简化了,实例化对象时的泛型类型就通过声明时的泛型类型来定义.
JDK1.5: Ponit point =new Point();
JDK1.7:Point point=new Point<>();
5.通配符
泛型的出现可以解决数据类型统一问题,并且避免向下转型操作,但又会带来新的问题。定义一个简单泛型
5.1定义Message类,此类中只定义一个属性info.
使用以上类对象完成引用传递
运行结果:Hello World
实例化的对象类型为new Message();而接收的参数也同样为Message();.所以可以正常完成方法的调用,但是现在如果定义泛型不是String,而是换成Integer?
将泛型替换为Integer.
此时print()方法无法接受Message对象引用,因为这个方法只接受Message对象引用,如果将print()方法重载,换成Message呢?
尝试重载,无法进行重载,方法的重载不是为一个类定义的,因为方法重载时观察的不是泛型类型,而是类的名称,或者数据类型.那么现在可以发现,给出泛型类后,就相当于将一个类又划分成若干个不同的小类型.
可以发现使用对象多态性解决参数统一问题,在使用泛型后全部被破坏了,那么方法接收参数不写泛型呢?
运行结果
100
此时的print()方法可以接收任意类型的Message对象,看似问题解决,而实际有有问题.
运行结果
Hello World
此时print()方法中操作时,由于没有设置泛型类型,所有的类型统一变为了Object,也就是可以修改任意的数据类型,而这种操作在编译时根本无法实现.
5.2这种任意改变就好像造假,所以必须找到一种方法,可以接受任意泛型类型的设置,但不能修改,只能够输出,为解决这种问题,可以使用通配符" ? "表示.
使用通配符" ? “解决问题.
‘’’?’’'他表示任意类型,如果参数返回时也是这个”?",就当成Object进行理解.,那么是不是可以用Message能不能接受所有的泛型类型呢?
Message<String> msg=new Message<String>();
Message<Object> temp=msg; //错误:无法接收
5.3 因为Object要比String范围大,所以在通配符"?“上又衍生出了两个子符号.
1.设置泛型的上限: ?extends类,如?extends Number,表示只能是Number或者是Number的子类Integer等:
2.设置泛型的下限:?super类,如?super String,表示只能是String或者是String的父类(Object).
设置泛型上限
Message类时所设置的泛型直接指明了设置的上限(),只能是Number或者其子类,而后在实例化Message对象是也只能使用指定的操作类型.
设置泛型下限
运行结果
Hello World,在定义方法时设置参数为” Message<? super String>temp "表示只能是String或者是其父类,传入其他泛型对象时会出现语法错误.
6.泛型接口
在之前所有定义的泛型中,都是在类上定义的,而对于接口也是可以进行泛型定义的,使用泛型定义的接口可以称为泛型接口.
6.1 定义泛型接口
interface Message<T>{ //泛型接口
public String echo(T msg);
}
对于泛型接口实现,java有两种方式.
方式一:子类上继续定义泛型,同时此泛型在接口上继续使用.
运行结果
方式二:在子类上设置具体类型
7.泛型方法
对于泛型,可以定义在类上外,也可以在方法上进行定义,而在方法上定义泛型时,这个方法不一定非要在泛型类中定义.
在定义泛型方法时,还首先定义出泛型名称"",否则这个泛型标记将无法使用.