黑马程序员: 基础加强之静态导入,可变参数,增强for,自动装箱,享元模式,枚举

时间:2023-02-18 11:20:47

------- android培训java培训、期待与您交流! ----------



静态导入:

 

l      import语句可以导入一个类或某个包中的所有类

l      import static语句导入一个类中的某个静态方法或所有静态方法

l       语法举例:

l      import staticjava.lang.Math.sin;

l      import static java.lang.Math.*;


可变参数    1.5

l       问题:一个方法接受的参数个数不固定,例如:

Ø       System.out.println(countScore(2,3,5));

Ø       System.out.println(countScore(1,2,3,5));     

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

l       可变参数的特点:

Ø       只能出现在参数列表的最后;

Ø       ...位于变量类型和变量名之间,前后有无空格都可以;

Ø      调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

增强for循环

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

l       注意事项:

Ø       迭代变量必须在( )中定义!

Ø      集合变量可以是数组或实现了Iterable接口的集


基础类型的自动装箱和拆箱:

l      自动装箱:Integer num1 = 12;

l      自动拆箱:System.out.println(num1 + 12);

l      基本数据类型的对象缓存:

Integer num1 = 12 ; Integer num2 = 12; System.out.println(num1== num2);

Integer num3 = 129;  Integer num4 = 129;  System.out.println(num3 == num4);

 

Integer num5 = Integer.valueOf(12);  Integer num6 = Integer.valueOf(12);  System.out.println(num5 == num6);


享元模式 flyweight:

它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;

       它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

       如果很多很小的对象他们有很多相同的东西,你就可以将他们变成一个对象,还有的不同的部分将他们变成外部状态(属性)作为方法的参数传入.


枚举类型 enum

枚举相当于一个类, 里面的元素就是枚举这个类的实例对象

元素名相当于是一个TrafficLamppublicstatic final的成员变量名,指向该类实例对象

枚举中的构造方法都是private的,不能在其他地方new实例,

枚举中的在jvm加载枚举类的时候自动实例化其中的元素

当元素实例化的时候需要参数时,需要在元素名后面加上"('参数')"

l       为什么要有枚举

Ø      问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

l      用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。

Ø      私有的构造方法; 每个元素分别用一个publicstatic成员变量表示;可以有若干公有方法或抽象方法。

public class WeekDay {

    private WeekDay(){}

    public final static WeekDay SUN =new WeekDay();

    public final static WeekDay MON =new WeekDay();

}

l       枚举的基本应用

Ø      举例:定义一个Weekday的枚举。

Ø      扩展:枚举类的values,valueOf,name,toString,ordinal等方法

Ø      总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()

 

 name()返回枚举常量名    ordinal()返回枚举常量的序数  valueOf(“SUN”) 通过名字得到对应实例对象

values()返回WeekDay类的数组,装的是枚举的内容,(此方法在java文档中没有)

    如果枚举只有一个成员时,就可以作为一种单例的实现方式

//含有抽象方法的枚举

    public enum TrafficLamp{

       //元素名必须放在第一行

       RED(30){

           public  TrafficLamp nextLamp(){returnGREEN;}

       },//TRafficLamp的子类,有参数的话,匿名子类自动调用父类TrafficLamp的有参构造函数

        //RED是一个TrafficLamppublic static final的成员变量名,指向这个匿名子类实例对象

       GREEN(45){

           public  TrafficLampnextLamp(){returnYELLOW;}

       },

       YELLOW(5){

           public  TrafficLampnextLamp(){returnRED;}

       };

       public abstract TrafficLamp nextLamp();

       private int time;

       //有参构造参数,在元素名后 + "(参数)".

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

    }