黑马程序员<Java 1.5新特性>静态导入、增强for、可变参数、自动装箱拆箱、枚举

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

 

一、静态导入

  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方法,方法如下:

          非静态方法:

             1toString() ---> 返回枚举量的名称

             2ordina() ---> 返回枚举值在枚举类中的顺序,按定义的顺序排

             3getClass() ---> 获取对应的类名

          静态方法:

            1valueOf(String e) ---> 转为类中对应的对象,即将字符串转为对象

            2values() ---> 获取数组,将元素放入一个数组中。

   (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;
	}
}



 

 

   

  

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值