黑马程序员_Java高新技术——静态导入,枚举,可变参数

时间:2022-08-02 19:42:46

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

----------------------------------------------------------------------------------------------------------------------------------
静态导入:
 静态导入,其实导入的是类中的静态成员。
 
import语句可以导入一个类或某个包中的所有类,import static语句导入一个类中的某个静态方法或所有静态方法
例:import static java.util.Collections.*;
注意:jdk1.4之前不支持,jdk1.5的新特性。
 
代码示例:

/**
* 静态导入
*/
import static java.lang.Math.*;
public class StaticImport {


/**
* @author 张熙韬
*/
public static void main(String[] args) {
System.out.println(abs(6-3));
System.out.println(max(6,3));
}


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


public class VariableParameter {


public static void main(String[] args) {
System.out.println(add(2, 3));
System.out.println(add(2, 3,5));
}
/**
* 可变参数
* @param x
* @param args
* @return
*/
public static int add(int x, int... args) {
int sum = x;
//for(int i=0;i<args.length;i++){
//sum+=args[i];
//}

/**
* 增强for循环!
*/
for(int arg:args){
sum+=arg;
}

return sum;
}
}


 ----------------------------------------------------------------------------------------------------------------------------------
 增强for循环: 
语法:for(type 变量名:集合或者数组){...code...}
 注意:此集合或者数组必须实现Iterable接口的类型,Map集合不能直接使用。
 
高级for和传统for的区别:
 传统for可以完成对语句执行很多次,可以定义控制循环的增量和条件。
 高级for是简化形式,必须有被遍历的目标。该目标要么是数组,要么是Collection单列集合。
 对于数组的遍历,如果仅仅是获取数组中的元素,可以使用高级For。
 如果要对数组的角标进行操作建议使用传统for。
 ----------------------------------------------------------------------------------------------------------------------------------
 基本数据类型的自动拆箱与装箱
 涉及的知识点:
 享元设计模式:flyweight
 很多个小的对象,有很多属性相同,把他们变成一个对象,不同的属性变成方法的参数,
 称之为外部状态,相同的属性称之为内部状态。
 例:

/**
* Integer a = new Integer(100); Integer b = 100; Integer c =100; int d =
* 100; a、b、c、d这四个数通过“==”和equals方法,进行比较,都哪些结果是true,哪些是false
* a、b、c、d这四个数通过“==”和equals方法,进行比较,都哪些结果是true,哪些是false
*
* @author 张熙韬
*
*/
public class Problem1 {
public static void main(String[] args) {
Integer a = new Integer(100);
Integer b = 100;
Integer c = 100;
int d = 100;


/**
* "equals"方法有自动装箱功能,int型转变为Integer类型,所以比较起来都为true
*/


System.out.println("a.equals(b):" + a.equals(b));
System.out.println("a.equals(c):" + a.equals(c));
System.out.println("a.equals(d):" + a.equals(d));
System.out.println("b.equals(c):" + b.equals(c));
System.out.println("b.equals(d):" + b.equals(d));
System.out.println("c.equals(d):" + c.equals(d));
System.out.println();
System.out.println();


/**
* 由于java的自动拆箱功能,Integer类型转变为int型,所以a,b,c会和d相等
*/
System.out.print("a==d:");
System.out.println(a == d);
System.out.print("b==d:");
System.out.println(b == d);
System.out.print("c==d:");
System.out.println(c == d);
System.out.println();
System.out.println();
/**
* b和c本来就是指向同一块内存区的指针,必须的相等!
*/
System.out.print("b==c:");
System.out.println(b == c);
System.out.println();
System.out.println();


/**
* a通过new 函数,分配了一块内存区,而bc呢,怎是系统自动分配的,所以a和bc的地址不相同,所以为false
*/
System.out.print("a==b:");
System.out.println(a == b);
System.out.print("a==c:");
System.out.println(a == c);
}
}


 ------------------------------------------------------------------------------------------------------------------------------------------
 枚举:
 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
 枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
 枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
 注意事项:
 1.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
 2.构造方法必须私有。
 3.当枚举只有一个成员时可以作为一种单例的实现模式。


 枚举中常用方法和带有构造方法的枚举.

public class EnumTest {

/**
* 枚举
* @author 张熙韬
*/
public static void main(String[] args) {
// WeekDay1 weekDay=WeekDay1.Mon;
// System.out.println(weekDay.nextDay());

// 其实隐含调用了toString方法
// System.out.println(weekDay.nextDay().toString());

WeekDay weekDay2 = WeekDay.Fri;
System.out.println(weekDay2);
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 {
Mon(1), Tus(0), Wed(), Thu, Fri, Sta, Sun;
private WeekDay() {
System.out.println("first");
};

private WeekDay(int day) {
System.out.println("second");
};
}


//交通灯!
public enum TrafficLamp {
RED(45) {
public TrafficLamp nextLamp() {
return GREEN;
}
},

GREEN(30) {
public TrafficLamp nextLamp() {
return YELLOW;
}

},

YELLOW(5) {
public TrafficLamp nextLamp() {
return RED;
}

};

public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time=time;
}
}

}



 小知识点:new Date(300){}new Date的子类对象,调用父类指定的构造方法。
-------------------------------------------------------------------------------------------------------------------------------------------------------

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------