Java(3-5)

(一)对象包装器和自动装箱:
我们知道,java有八种基本类型,int,等等。但是很多方法是对对象进行操作地,比方说equals,这时候需要将int,这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer类对应的基本类型int。通常,这些类称为包装器(wrapper)。这些对象对象包装器类拥有很明显的名字:Integer(int),Long(long),Float(float),Double(double),Short(short),Byte(byte),Character(char),Void,Boolean(boolean),注意 前六个,派生于公共的超类Number。对象包装器是不可变的!,就是说一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器还是final,因此不能定义他们的子类。

现在假设在一个整型数组列表(ArrayList)。而尖括号内的类型参数不允许是基本类型。但是我们还是想声明一个整型数组列表,这时候,我们就可以声明一个Integer对象的整型数组列表:

ArrayList<Integer> list = new ArrayList<>();
//这里在后面实例化的时候没有声明泛型,具有安全隐患!

在这里,有一个很好用的特性,便于我们将整型数据加入到Integer数组列表中,这个调用list.add(3);会自动地变换成list.add(Integer.valueof(3));这种变化被称为自动装箱。相反的,将一个Integer对象赋给一个int值时候,将会自动拆箱,也就是说编译器将下列语句:int n = list.get(i);翻译成:int n = list.get(i).intValue();甚至在算数运算时候,也会有自动的装箱,拆箱:Integer n = 3; n = n + 1; n++都是可以的。

==运算符也可以用于对象包装器对象,只是检测的是对象是否指向同一个存储区域,因此下面的比较不会成立。Integer a = 100 ; Integer b = 100; if(a==b)...。想比较两个对象包装器对象是否一致,需要调用equals方法,

使用对象包装器对象还有一个好处,java的设计者发现,可以将一些基本的方法放置在包装器中,例如:将一个数字字符串转换成数值,要想将字符串数值转换成整型,可以这么用:int x = Integer.parseInt(s);这里和Integer对象没有任何关系,parseInt是一个静态方法,但是Integer是存这个方法的好地方。注意!对象包装器对象不能作为方法参数,因为对象包装器对象是不可变的,final

(二)参数数量可变的方法:
嗯,这里要先举个关于printf的例子,请看:

System.out.printf("%d",n);
System.out.printf("%d %s",n, "widgets");

在上方的语句中尽管他们一个调用是两个参数,另外一个调用是三个参数,但是他们都是同一个方法:printf。

事实上,printf方法是这么定义的:

public class PrintStream
{
    public PrintStream printf(String fmt,Object ...args){
    return format(fmt,args); 
    };
}

这里的省略号…是java代码的一部分,它表明这个方法可以接受任意数量的对象(除了fmt参数以外)。

实际上printf方法接受两个参数,一个是格式化字符串,另一个是Object[ ]数组,其中保存这所有的参数,现在将扫描fmt字符串,并将第i格式说明符与args[i]的值匹配起来。编译器需要对printf的每次调用进行转换,以便将参数绑定到数组上,并在必要的时候进行自动装箱:

System.out.printf("%d %s"new Object[]{new Integer(n), "widgets"});

用户也可以自定义可变参数的方法,并将参数指定为任意类型,甚至是基本类型,下面是一个简单的示例:其功能为计算若干数值的最大值。

public static double max(double... values){
    double largest = Double.NEGATIVE_INFINITY;
    for(double v : values) if(v >largest)largest = v;
    return largest;
}

可以像下面这样调用这个方法:

double m = max(3.1,40,4,-5);

编译器将会把new double[]{ 3.1,40,-5 }传递给max方法。

(三)枚举类:

public enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};

实际上,这是定义一个枚举类,它刚好有4个实例,在此尽量不要构造新对象。
因此,在比较两个枚举类型的值时,永远不要调用equals,直接使用==运算符就可以啦。

如果需要的话,可以在枚举类中添加一些构造器、方法和域。当然,构造器只是在构造枚举常量时被调用。下面是一个示例:

public enum Size{
SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL");

private String abbreviation;

private Size(String a ){ this.abbreviation = a; }
public String getAbbreviation(){return this.abbreviation; }
}

所有枚举类型都是Enum类的子类!!!。他们继承了Enum的许多方法,其中最有用的是toString,这个方法能够返回枚举常量名。Size.SMALL.toString()将返回字符串“SMALL”。

toString的逆方法是静态方法valueOf方法。例如,语句:

Size s = Enum.valueOf(Size.class,"SMALL");
//将s设置为Size.SMALL

每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的一个数组。例如:Size[] values = Size.values();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值