1.静态导入
导入时写到方法名,调用时不需要写类名,直接调用方法名即可,注意:需要JDK1.5以上版本,否则会报错
import static java.lang.Math.*;
class Import{
public static void main(String[] args) {
System.out.println(abs(7));
}
}
2.可变参数
可变参数的特点: public static int add(int x,int ...args )
a.可变参数只能出现在参数列表的最后
b...位于变量类型和变量名之间,前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
class VariableParameter{
public static void main(String[] args) {
System.out.println(add(5,9));
System.out.println(add(6,1,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;
}
}
3.增强for循环
语法:for(type 变量名:集合变量名){}
type前可加修饰符;迭代变量必须在()中定义;集合变量可以是数组或实现了Iterable接口的集合类
class VariableParameter{
public static void main(String[] args) {
System.out.println(add(5,9));
System.out.println(add(6,1,3,5));
}
public static int add(int x,int...args){
int sum=x;
for(int arg:args){
sum+=arg;
}
return sum;
}
}
4.基本数据类型的自动装箱与拆箱
装箱是将基本数据类型转化为包装类
拆箱是将包装类转化为基本数据类型
class AutoBox{
public static void main(String[] args){
Integer iObj=3;//基本数据类型的自动装箱
System.out.println(iObj+12);//基本数据类型的自动拆箱
//当Integer封装的数据在一个字节(-128-127)之间,则只建立一个对象,实现享元模式(属于设计模式).
Integer i1=10;
Integer i2=10;
System.out.println(i1==i2);//true
Integer i3=130;
Integer i4=130;
System.out.println(i3==i4);//false
Integer i5=Integer.valueOf(3);
Integer i6=Integer.valueOf(3);
System.out.println(i5==i6);//true
}
}
5.枚举
享元模式(Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。枚举只有一个成员时就可以作为一种单例的实现方式。
用普通类实现枚举功能:
私有的构造函数
每个元素分别用一个公有的静态成员变量表示
可以有若干个公有方法或抽象方法,如nextDay()方法必须是抽象的,采用抽象方法定义nextDay就是将大量的if else语句转移成一个个独立的类
public class EnumTest{
public static void main(String[] args){
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay.nextDay());
}
}
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";
}
}
基本枚举类的应用
public class EnumTest{
public static void main(String[] args){
WeekDay weekDay2=WeekDay.FRI;//FRI是一个对象
System.out.println(weekDay2);//输出FRI,枚举自动实现了toString方法
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());//在枚举中的序号
System.out.println(WeekDay.valueOf("SUN"));
System.out.println(WeekDay.values().length);//枚举数组的长度
}
//枚举相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法
public enum WeekDay{
//枚举元素列表必须位于枚举体中最开始的部分
SUN(1),MON,TUE,WED,THI,FRI,SAT;
//枚举中构造方法必须是私有的
private WeekDay (){System.out.println("first");
}//调用6次
private WeekDay(int day){System.out.println("second");
}//调用1次,SUN(1)指定
}
}
含有抽象构造方法的枚举类
//定义交通灯枚举类
public enum TrafficLamp{
RED(30){
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
//定义局部变量
private int time;
//构造函数用私有
private TrafficLamp(int time){
this.time=time;
}
}
}
6.正则表达式
正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,通常被用来检索或替换那些符合某个模式的文本内容.
几类重要的正则表达式规则
a.字符
x 表示字符x
\\ 反斜线字符
\r 回车符
\n 换行符
x 表示字符x
\\ 反斜线字符
\r 回车符
\n 换行符
b.字符类
[abc] a、b 或 c
[^abc] 任何字符,除了 a、b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,包含边界字母
[0-9] 包含0-9的字符
c.预定义字符类
. 任何字符
\d 数字:[0-9]
[abc] a、b 或 c
[^abc] 任何字符,除了 a、b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,包含边界字母
[0-9] 包含0-9的字符
c.预定义字符类
. 任何字符
\d 数字:[0-9]
\D 非数字: [^0-9]
\w 单词字符:[a-zA-Z_0-9]
\w 单词字符:[a-zA-Z_0-9]
d.边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
e.数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
f.组和捕获
组是以(开始编号的,如:
((A)(B(C))) ,在这个组里面有几个组呢?
第一个组:(A)(B(C))
第二个组:A
第三个组:B(C)
第四个组:C
^ 行的开头
$ 行的结尾
\b 单词边界
e.数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
f.组和捕获
组是以(开始编号的,如:
((A)(B(C))) ,在这个组里面有几个组呢?
第一个组:(A)(B(C))
第二个组:A
第三个组:B(C)
第四个组:C
练习:校验邮箱
public class EmailDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入邮箱:");
String email = sc.nextLine();
String regex = "\\w+@\\w{2,6}[\\.\\w{2,3}]+";
boolean flag = email.matches(regex);
System.out.println("flag:"+flag);
}
}
学习感悟
对于高新技术这边,是在之前JDK基础上的更新,新的方法就说明有新的需求,需要理解掌握.张老师讲的很细,但是既然是在之前基础上开始讲的,有的知识点之前没有接触过,需要多看几遍才能理解.在我看来这些是对之前处理方法的进一步规范,如枚举,之前可以在类中加以规范,出现枚举之后就可以使编辑更加规范.正则表达式可以很大程度上减少代码量,如果没有正则表达式,判断一个字符串不知得用多少判断语句呢.