您的位置:首页 > 编程语言 > Java开发

(JAVA自学笔记)静态导入

2013-01-10 14:03 323 查看
day:20130110

今天看的是张孝祥的视频。写的笔记在笔记本上,晚上我放上来。

我开始今天的学习记录。前面的几段视频我看过好多次,不再一一附上。按知识点写。

1. import语句可以导入一个类或某个包中的所有类。static import语句导入一个类中的某个静态方法或所有静态方法。

语法举例:使用求两个数的最大值和相减结果的绝对值进行举例。

System.out.println(Math.max(3, 6));

System.out.println(Math.abs(3 - 6));

但是使用静态导入,我们只需要在代码开始的地方写上import static java.lang.Math.max;代码部分可改为System.out.println(max(3, 6));即可

或者直接改为import static java.lang.Math.*;就将Math下的所有方法直接导入进来,下面的代码页相应可以简化。

(overload(重载) 与override(重写)的区别:class A{})

2.可变参数

一个方法接受的参数个数不固定,例如

System.out.println(add(3, 6));

System.out.println(add(3, 6,5));

可变参数的特点:只能出现在参数列表的最后;...位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

(eclipse里面复制整行快捷键:Ctrl + Alt + 向下箭头)

实现代码:

public class VariableParameter {

public static void main(String[] args) {

System.out.println(add(2,3));

System.out.println(add(2,3,5));

}

public static int add(int x,int ...args ){

int sum = x;

for(int i = 0;i < args.length; i++)

sum += args[i];

return sum;

}

}

输出:5

10

3.增强for循环

语法:for(type 变量名:集合变量名){...}

注意事项:迭代变量必须在()中定义!集合变量可以再数组或实现了Iterable接口的集合类

举例:(变量名可以根据后面的集合变量名取)

上例改为

public static int add(int x,int ...args ){

int sum = x;

/* for(int i = 0;i < args.length; i++){

sum += args[i];

}*/

for(int arg:args){

sum += arg;

}

return sum;

}

}

(提示:学习SUN公司的语言规范。)

4.基本数据类中的自动拆箱与装箱

前面学到过,包装类的自动装箱,自动拆箱。所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类对象,或者把double包装成Double等等。所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。

实例代码:

public class AutoBox {

public static void main(String[] args) {

Integer iObj = 3;//装箱

System.out.println(iObj + 12);//拆箱

}

}

输出:15

思考问题:

代码改成如下:

public class AutoBox {

public static void main(String[] args) {

Integer iObj = 3;//装箱

System.out.println(iObj + 12);//拆箱

String s1 = new String("abc");

String s2 = new String("abc");

Integer i1 = 13;

Integer i2 = 13; //i1,i2分别装箱成一个Integer对象,是否是一个对象

System.out.println(i1 == i2);

}

}

当i1=13,i2=13时,i1、i2是同一个对象,如果改为i1=137,i2=137,不是同一个对象。

对于基本类型的整数要装箱成Integer对象的时候,如果数字在一个字节之内(即-128~127之间的数字),一旦包装成为一个Integer对象,就把他缓存起来,缓存在一个池里面,下次再要把一个整数包装成Integer对象时,先看池子里面有没有,有的话直接从池子里面取,节省内存空间。

享元模式flyweight:(例如在word里面要输入很多 个字符,这时候可以不用很多个小对象,直接定义26个字母为对象,然后根据字母的位置来显示)如果很多很小的对象,它们有很多相同的属性,那么就可以把它们变成一个对象,不同的东西变成很多外部的属性,成为外部状态,作为方法的参数传入。

思考:

Integer i3 = Integer.valueOf(3);//手工调用静态方法,把一个整数包装成为Integer对象

Integer i4 = Integer.valueOf(3);

System.out.println(i3 ==i4);//这两个对象是否是同一个

结论:这两个对象是同一个对象,但是如果改为>127,就不为同一个对象。

5枚举

枚举就是让某个类型的变量的取值是能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中天蝎的非法值,普通变量的方式在开发阶段无法实现这一目标。

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。(私有的构造方法;每个元素分别用一个共有的静态成员变量表示;可以有若干公有方法或抽抽象方法,例如要提供nextDay方法必须是抽象的)。

实例代码:

EnumTest.java;

package cn.itcast.day1;

public class EnumTest{

public static void main(String[] args){

WeekDay weekDay = WeekDay.MON;

System.out.println(weekDay.nextDay());

}

}

WeekDay.java:

package cn.itcast.day1;

public class WeekDay {

private WeekDay(){}

public final static WeekDay SUN = new WeekDay();

public final static WeekDay MON = new WeekDay();

public WeekDay nextDay(){

if(this == SUN){

return MON;

}else{

return SUN;

}

}

public String toString(){

return this == SUN?"SUN":"MON";

}

}

输出结果:SUN

另外一种写法:

package cn.itcast.day1;

public abstract class WeekDay {

private WeekDay(){}

public final static WeekDay SUN = new WeekDay(){

public WeekDay nextDay() {

return MON;

}

};

public final static WeekDay MON = new WeekDay(){

public WeekDay nextDay() {

return SUN;

}

};

public abstract WeekDay nextDay();

public String toString(){

return this == SUN?"SUN":"MON";

}

}

采用抽象方法定义nextDay将大量的if else语句转移成了一个个独立的类。

写一个基本枚举类:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: