一、静态导入
1、静态导入的与普通import的区别:
import语句可以导入一个类,或者包中的类;
import static 语句可以导入一个类的中的某个静态成员,也可以导入所有的静态成员。
2、优劣分析:
优点:可以少写类名,使某些代码变简洁
缺点:成员归属不明确,使可读性不强,易产生混淆
3、用法示例:
package cn.itheima.blog1; //import static java.lang.Math.*;//导入所有成员 import static java.lang.Math.PI;//静态导入成员变量 import static java.lang.Math.max;//静态导入成员函数 public class StaticImportDemo { /** * 静态导入示例(Math类) * 1、导入所有成员 * 2、导入某个成员函数 * 3、导入某个成员变量 */ public static void main(String[] args) { System.out.println("PI的值是" + PI); System.out.println("1,2之间较大的数为:" + max(1,2)); } }
二、可变参数
1、用法格式:void sum(int ... arr){}
2、特点:
第一:只能出现在参数列表的最后;
第二:...位于变量类型和变量名之间,前后有无空格都可以;
第三:调用可变参数的方法时,编译器为该可变参数隐含创建一个数组, 在方法体中一数组的形式访问可变参数
3、适用情况:适用于参数类型固定,但是参数数量不固定的情况
4、用法示例:
package cn.itheima.blog1; public class VariableParameters { /** * 可变参数示例 */ public static void main(String[] args) { //输入不同参数 System.out.println(sum(1, 2)); System.out.println(sum(2, 3, 2, 2)); } //可变参数只能在最后 public static int sum(int x, int...arg) { int sum = x; //参数用数组维护,对其进行遍历 for(int i = 0; i < arg.length; i++){ sum = sum + arg[i]; } return sum; } }
三、增强for循环
1、用法格式:for(T type : 需要被遍历的集合(实现Iterator)或者数组)
2、与传统for循环的比较:
第一:传统for循环能完全替代普通for循环
第二:增强for适用于仅需遍历的情况,比较方便;而传统for则还适用在操作数组角标,不需要遍历数组等情况下。
3、用法示例:
package cn.itheima.blog1; public class ForStrong { /** * 增强for循环 */ public static void main(String[] args) { int[] arr = new int[3]; //对数组中的每个元素赋值,不仅要遍历还要操作角标,用普通for for(int i = 0; i < arr.length; i++){ arr[i] = i + 1; } //遍历数组,打印,不需要对数据进行操作 for(int i : arr){ System.out.print(i + " "); } } }
三、自动拆箱装箱与享元模式
1、拆箱与装箱:
拆箱:把基本数据类型的包装类型转换成基本数据类型,当包装类与基本数据类型运算就需要自动拆箱
装箱:把基本数据类型转换成包装类型,当基本数据类型赋值给包装类,就会自动装箱
2、细节:
byte,short,int,char,long在-128-127之间的数,装箱成各自的包装类时,均会对象重用,boolean类型一直会对象重用,而double,float就不会,这就是享元模式的一种体现。
3、用法示例:
package cn.itheima.blog1; public class AutoBoxing { /** * 自动拆装箱 */ public static void main(String[] args) { //自动装箱,将基本数据类型封装成对应包装类 Integer b1 = 2; Integer b2 = 2; //2在-128到127之间,随便是两个对象,但是指向的是同一处 System.out.println(b1 == b2); /* * 实现细节:c1是包装类,c2是int,所以第三步运算过程是 * c1自动拆箱成int,与c2相加后,又自动装箱为Integer */ Integer c1 = 3; int c2 = 5; c1 = c1 + c2; System.out.println(c1.getClass()); } }
4、享元模式(Flyweight Pattern)
享元模式:若有很多的小对象,均有相同的属性,那就将其作为一个对象,相同的属性作为对象的内部属性;而不同的属性,作为函数的参数传入,作为外部属性。
适用范围:当大量物件只是重复因而导致无法令人接受的使用大量内存
实例:word中的字母,系统的文件夹、文件图标
五、枚举
在程序开发中会存在一种数据集,数据的集中的值是固定不变的,是穷尽的。如四季,只有春夏秋冬,一年中也只有12个月份。这样就产生了一种类型,叫枚举,关键字enum
1、作用:限定数据,必须是枚举类型内指定的值
2、声明格式:[public] enum 枚举类型名称{
枚举对象1, 枚举对象2,..., 枚举对象n;
}
3、细节:
(1)构造器:
1)构造器只是在构造枚举值的时候被调用。
2)构造器只有私有private,绝不允许有public构造器。这样可以保证外部代码无法重新构造枚举类的实例,因为枚举值是public static final的常量,但是枚举类的方法和数据域是可以被外部访问的。
3)构造器可以有多个,调用哪个即初始化相应的值。
(2)所有的枚举类都继承了Enum方法,方法如下:
非静态方法:
1)toString() ---> 返回枚举量的名称
2)ordina() ---> 返回枚举值在枚举类中的顺序,按定义的顺序排
3)getClass() ---> 获取对应的类名
静态方法:
1)valueOf(String e) ---> 转为类中对应的对象,即将字符串转为对象
2)values() ---> 获取数组,将元素放入一个数组中。
(3)语法规范
1)元素列表即所有的元素,必须放在整个类的最前面。
2)元素列表后分号可有可无,但元素后面还有其他内容时,必须加上分号。
3)枚举类中的方法为private
4)在元素后跟上(),就可指定要使用的构造方法,含参数。
5)枚举类中的每个元素都是它的一个子类对象,当枚举类中存在abstract方法,须在子类后加{},并在其中实现此方法。
4、枚举模拟类:
enum声明定义的类型就是一个特殊的类,构造方法私有,其中的元素都是该类的实例,均为静态。而这些类都是类库中Enum 类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法 。动手写一个枚举模拟类
package cn.itheima.blog1; class Season{ //均为该类的实例 public final static Season SPR = new Season(); public final static Season SUM = new Season(); public final static Season AUT = new Season(); public final static Season WIN = new Season(); //构造方法私有化 private Season(){ } } public class SeasonDemo { public static void main(String[] args) { //只能通过类名建立实例,建立的实例只能是春夏秋冬四个季节 Season s1 = Season.SUM; } }
5、用Enum写交通信号灯
package cn.itheima.blog1; /* * 枚举的用法 */ //用enum替代class关键字,为枚举类型 public enum TrafficLamp { //元素在最前面,后面有內容,需要加上;号 //调用构造函数, RED(57) { public TrafficLamp nextLamp() { return GREEN; } }, GREEN(60) { public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(3) { public TrafficLamp nextLamp() { return RED; } }; private int time; //抽象方法,子类需要实现 public abstract TrafficLamp nextLamp(); //構造方法私有化 private TrafficLamp(int time) { this.time = time; } }