System.out.println(data[x]);
}
}
}
}
范例:
接收接口对象,从接口定义而言,它是不能去继承一个父类的,但是由于接口依然属于引用类型,所以即使没有继承类,也可以使用Object接收。
interfaceMessage{
}
classMessageImplimplementsMessage{//定义接口子类
publicStringtoString(){
return"NewMessage:
HelloWorld.";
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Messagemsg=newMessageImpl();//向上转型
Objectobj=msg;//使用Object接收接口对象,向上转型
Messagetemp=(Message)obj;//向下转型
System.out.println(temp);//toString()
}
}
从代码上讲,以上只能算是一个固定的操作概念,不过从实际来讲,因为有了Object类的出现,所以的操作的数据就可以达到统一,那么之前的链表程序,就应该变的很方便了,所有的数据都使用Object接收,所有的对象比较(删除、查找)都可以使用equals()。
3.3、包装类(重点)
在Java的设计之中,一直提倡一个原则:
一切皆对象,这个原则本身有一个漏洞——基本数据类型不是对象,所以这个原则就出现了问题。
那么如果说现在这个问题由我们来解决,该如何做呢?
classInt{//类
privateintnum;//基本型
publicInt(intnum){
this.num=num;
}
publicintintValue(){
returnthis.num;
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Inttemp=newInt(10);//把基本类型变为类
intresult=temp.intValue();
System.out.println(result*result);
}
}
以上的操作是将基本类型变为了一个对象的形式进行操作了,但是这里面有一个问题:
基本数值型数据是可以进行数学运算的,可是以上变为了类的形式,那么肯定无法直接计算了。
而且以上的问题既然我们都可以想到方法去解决,那么java也一定早已解决,为此它专门提供了八种包装类:
byte(Byte)、short(Short)、int(Integer)、long(Long)、float(Float)、double(Double)、boolean(Boolean)、char(Character),而这八种包装类又分为两大阵营:
·数值型(Number子类):
Byte、Short、Integer、Float、Double、Long;
·对象型(Object子类):
Boolean、Character。
可是对于Number的子类,就必须观察出Number类之中定义的方法:
byteValue()、intValue()、doubleValue()、shortValue()、floatValue()、doubleValue(),就是从包装的类之中取得所包装的数值。
3.3.1、装箱与拆箱
在基本数据类型和包装类之间的转换操作之中分为两个重要概念:
·装箱操作:
将基本数据类型变为包装类,称为装箱,包装类的构造方法;
·拆箱操作:
将包装类变为基本数据类型,称为拆箱,各个类的xxValue()方法。
范例:
以int和Integer为例
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Integervar=newInteger(15);//装箱
intresult=var.intValue();//拆箱
System.out.println(result*result);
}
}
范例:
以double和Double为例
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Doublevar=newDouble(15.5);//装箱
doubleresult=var.doubleValue();//拆箱
System.out.println(result*result);
}
}
范例:
以boolean和Boolean为例
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Booleanvar=newBoolean(true);//装箱
booleanresult=var.booleanValue();//拆箱
if(result){
System.out.println("HelloWorld.");
}
}
}
以上的操作是在JDK1.5之前所进行的必须的操作,但是到了JDK1.5之后,Java提供了自动的装箱和拆箱机制,并且包装类的对象可以自动的进行数学计算了。
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Integervar=15;//自动装箱
intresult=var;//自动拆箱
System.out.println(++var*result);
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Booleanvar=true;//自动装箱
if(var){//自动拆箱后操作
System.out.println("HelloWorld.");
}
}
}
那么正是因为有了这样的自动装箱和拆箱的机制,所以Object也可以接收基本数据类型的数据。
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Objectobj=15;//int-->自动装箱-->Object
intresult=(Integer)obj;//Object-->包装类-->自动拆箱
System.out.println(result*result);
}
}
但是到此处还有一个小问题,实际上这一问题之前已经见过的。
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Integerx=newInteger(10);//新空间
Integery=10;//入池
Integerz=10;
System.out.println(x==y);//false
System.out.println(x==z);//false
System.out.println(z==y);//true
System.out.println(x.equals(y));//true
}
}
以后使用包装类的时候还需要考虑equals()和==的区别。
3.3.2、数据转型
包装类之中所提供的最大优点还在于可以将字符串变为指定的基本数据类型,下面列出几个操作:
·Integer类:
publicstaticintparseInt(Strings);
·Double类:
publicstaticdoubleparseDouble(Strings);
·Boolean类:
publicstaticbooleanparseBoolean(Strings);
但是Character这个包装类之中,并没有提供一个类似的parseCharacter(),因为字符串String类之中提供了一个charAt()方法,可以取得指定索引的字符,而且一个字符的长度就是一位。
范例:
将字符串变为int
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Stringstr="16";
intresult=Integer.parseInt(str);//String-->int
System.out.println(result*result);
}
}
但是需要提醒的是,在执行这种转换的操作过程之中,字符串中的全部内容必须由数字所组成,如果有一位内容不是数字,则在转换的过程之中将出现如下的错误提示:
NumberFormatException。
范例:
将字符串变为double
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Stringstr="36.";
doubleresult=Double.parseDouble(str);
System.out.println(result*result);
}
}
范例:
将字符串变为boolean型数据
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
Stringstr="true";
booleanresult=Boolean.parseBoolean(str);
if(result){
System.out.println("HelloWorld.");
}
}
}
提示:
在使用Boolean型包装类的时候,如果字符串之中的内容不是true或者是false,统一都按照false处理。
以上的操作是通过字符串变为了一些基本类型的数据,但是反过来讲,基本类型如何变为字符串呢?
·方式一:
任何的基本类型数据遇到了String之后都变为String型数据;
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
intnum=100;
Stringstr=num+"";//int-->String
System.out.println(str.length());
}
}
·方式二:
利用String类的方法,publicstaticStringvalueOf(数据类型b)
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
intnum=100;
Stringstr=String.valueOf(num);//int-->String
System.out.println(str.length());
}
}
字符串向各个基本数据类型的转换,是一个非常重要的内容,必须熟练。
3.4、思考题(核心)
一个动物园有多种动物,现在要求实现某类动物的添加、某一类动物的取消、以及关键字检索动物信息的操作
提示:
要求代码模型,动物属性以名称和年龄为主
分析:
1、首先需要分析出本程序的关系:
一个动物园有多种动物,按照道理是属于一对多的操作关系,而多的一方肯定通过Link来表示,而且Link可以针对于各种类型。
2、什么叫动物?
动物是一个标准,既然是标准,肯定在类之上,那么一定就是接口,所以对于整个程序应该先把接口定义出来,那么接口只有两个功能:
范例:
定义出动物的接口
interfaceAnimal{//动物
publicStringgetName();
publicintgetAge();
}
范例:
定义动物园,动物园里面只关心接口,而不关心具体有什么动物。
classZoo{
privateLinkanimals=newLink();//多个动物
publicvoidadd(Animalani){//增加动物
this.animals.add(ani);//增加动物
}
pub