7月23听了张老师通过网络直播的公开课,这是7月23就业班课程的网络直播,终于能真实体验张老师最新上课方式。虽然内容是属于Java本身的,但是是基础增强课程。讲述的内容中有很多能让人豁然开朗,其中有些知识对以后了解框架的实现原理是很有帮助的。
最先提起的是eclipse的使用技巧:例如切换工作间,显示各种view,快捷键的位置:General->keys,设置alt+/键进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系时也可以使用remove binding这个按钮。还有其他很多快捷键在课程中都有提及,这些快捷键用熟练后,能提高开发效率。
接着进入JAVA本身。第一个讲述的比较简单,就是静态导入。有了静态导入,被引入的类中的静态方法就和在这个类中一样,不需要用类名来调用该方法,这样做好处之一就是减少了静态方法调用的代码量。如下面的例子,Math类中静态min和abs方法可直接在该类中调用,实现这种方式,只需要在import语句中加上static关键字就行。
import static java.lang.Math.*;;
public class StaticImport {
public static void main(String[] args) {
System.out.println(min(3, 9));
System.out.println(abs(3-9));
}
}
第二个讲到的是可变参数与for循环增强。可变参数的特点:只能出现在参数列表的最后,...位于变量类型和变量名之间,前后有无空格都可以。下面是一个整数与若干整数相加的例子:
public static void main(String[] args) {
System.out.println(add(1,2,3,5));
System.out.println(add(2,3,5));
}
public static int add(int x,int ...args)
{
int sum = x;
/*for(int i=0;i
{
sum += args[i];
}*/
for(int arg:args)
{
sum += arg;
}
return sum;
}
代码片断中的for循环增强语句与被注释掉的语句是一样的效果,首先就是引入的增强的for循环,这种语法格式能使遍历数组变得简洁,方便,不用像注释里的语句那样定义三个语句。然后就是可变参数列表了,有了它,就再也不用显示地编写数组作为函数的参数,当定义为可变参数形式时,编译器实际上会为你去填充数组。最终获取的仍然是一个数组,这也说明了为什么能用for循环增强方式来遍历的原因。
第三个讲到的就是枚举类型。为什么要有引入枚举类型,枚举类型是用来解决什么问题的?张老师在课程上做了讲解和归纳。比如要定义星期几或性别的变量,该怎么定义呢?假如用静态变量的方式定义,在开发阶段无法防止一些非法值。例如,假设用1-7表示星期几,有人不知道,可能会出现weekday = 0的情况。因此,为了在编译阶段就可以控制源程序中填写的非法值,枚举类型就引入进来了。枚举就是要让一个类型变量的取值为若干个固定的值,否则,编译器就会报错。初识枚举,首先要明确的是枚举是一种特殊的类。第一步认识普通枚举,参照java.awt.Color类,Color类中的静态变量都是Color类的实例对象。理解参照类后,枚举类中的每个成员都是该类的一个实例对象就应该容易理解了。第二步认识带方法的枚举,这张老师举了一个例子:定义了一个红绿灯的枚举类型,其中所带的next方法分别采用普通方法和抽象方法的方式来实现。枚举类型可以看做一个普通的类,因此也能够带构造方法。通常情况创建实例对象时是调用默认的构造方法,当类中写了带参数的构造方法后,也应该添上默认的不带参数的构造方法,否则跟普通类一样,编译器不会自动添加默认的构造方法,这将导致使用默认构造方法生成对象时产生错误。
public enum TrafficLamp
{
RED(15){
public TrafficLamp next2()
{
return GREEN;
}
},
GREEN(30){
public TrafficLamp next2()
{
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp next2()
{
return RED;
}
};
private int time;
private TrafficLamp(){}
private TrafficLamp(int time){this.time = time;}
public abstract TrafficLamp next2();
public String toString()
{
return name() + ":" + time;
}
public TrafficLamp next()
{
if(this.name().equals("RED"))
{
return GREEN;
}
else if(this.name().equals("GREEN"))
{
return YELLOW;
}
else
{
return RED;
}
}
}
上面代码中用到的name方法是获取枚举类型实例对象的名字。一个实践经验是,把枚举中的成员方法或变量放在枚举元素的前面,编译器报告错误。