Java基础之匿名内部类、包装类( 二 )


  • public boolean equals(Person anObject)
因为父类中的equals()方法用的是Object,所以以上的方法严格来讲已经不叫覆写,叫重载 。
2.3 Object接口引用数据类型在之前的分析来讲Object可以接收任意的对象,从结构上来讲Object是所有类的父类,但是Object概念并不仅仅局限于此,他已接收所有的引用数据类型,包括:接口、数组 。
使用Object类接收数组,数组和Object没有任何明确的关系 。
public class TestDemo4{ public static void main(String args[]){Object obj = new int []{1,3,4};int data [] = (int [])obj;//向下转型for(int i = 0 ;i < data.length ; i++){System.out.println(data[i]);} }}
接收接口对象,从接口的定义而言,它是不能去继承一个父类的,但是由于接口依然属于引用类型,所以即使没有继承类,也可以使用Object接收 。
interface Message{}class MessageImpl implements Message{//定义接口子类 public String toString(){return "Hello World"; }}public class TestDemo5{ public static void main(String args[]){Message msg = new MessageImpl();//向上转型Object obj = msg;//向上转型Message temp = (Message) obj;//向下转型System.out.println(temp);//toString() }}
从代码上讲,以上只能算是一个固定的操作概念,不过从实际来讲,因为有了Obejct类的出现,所有的操作就可以达到统一,那么之前的链表程序,就应该变得很方便了 。所有的数据都使用Object接收,所有的对象比较(删除、查找)都可以使用equals() 。
3、包装类在Java的设计之中,一直倡导一个原则:一切皆对象,这个原则本省有一个漏洞,基本数据类型不是对象,所以这个原则就出现了问题,那么如果说现在这个问题由我们来解决,该如何解决呢?
class MyInt{ private int num;//基本类 public MyInt(int num){this.num=num; } public int intValue(){return this.num; }}public class TestDemo6{ public static void main(String args[]){Object obj = new MyInt(10);//子类自动变为Object父类对象MyInt temp = (MyInt) obj;//向下转型int result = 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(int),Float,Double,Long;
​ 对象型(Object子类):Boolean,Character(char) 。
可是对于Number的子类,就必须观察出Number类之中定义的方法:byteVlue()、intVlue()、doubleVlue()、shortVlue()、longVlue()、floatVlue(),就是从包装的类之中取得所包装的数值 。
3.1 装箱与拆箱在基本数据类型和包装类之间的转化之中分为两个重要概念:
​ 装箱操作:将基本数据类型变为包装类,称为装箱,包装类的构造方法 。
​ 拆箱操作:将包装类变为基本数据类型,称为拆箱,Number类中的xxValue()方法 。
以int和Integer为例
public class TestDemo{ public static void main(String args[]){Integer var = new Integer(10);//装箱int result = var.intValue();//拆箱System.out.println(result*result); }}
以double和Double为例
public class TestDemo{ public static void main(String args[]){Double var = new Double(10.0);//装箱double result = var.doubleValue();//拆箱System.out.println(result*result); }}
以上的操作实在JDK1.5之前所进行的必须的操作,但是到了JDK1.5之后,Java提供了自动装箱和自动拆箱的机制,并且包装类的对象可以自动的进行数学计算了 。
自动装箱与拆箱
public class TestDemo{ public static void main(String args[]){Integer var = 10;//自动装箱int result = var;//自动拆箱//可以直接利用包装类进行对象操作System.out.println(++var*result);//自动进行数学运算 }}
但是到此为止还有一个小问题,实际上这一问题之前已经见过 。
public class TestDemo{ public static void main(String args[]){Integer x = new Integer(10);//新空间Integer y = 10;//入池Integer z = 10;System.out.println(x==y);//falseSystem.out.println(x==z);//falseSystem.out.println(y==z);//tureSystem.out.println(x.equals(y));//ture }}
使用包装类的时候还需要考虑equals()和==的区别 。
使用int还是Integer?