黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举
---------- android培训、java培训、期待与您交流! ----------
一、静态导入
1、import和import static区别:
(1)import 是导入一个类或某个包中所有的类。
(2)import static是导入一个类中的某个静态方法或所有的静态方法。
注:在调用静态导入的类的静态方法时,可以不用再写类名。如Arrays.sort(int[])可以直接写sort(int[]);
2、静态导入的写法:
(1)import static java.util.Arrays.*; 表示导入Arrays类中的所有静态成员。
(2)import static java.lang.System.*; 表示导入System类中所有的静态成员。
3、静态导入注意事项:
(1)当导入的两个类中有同名成员时,需要在成员前加上相应的类名。
(2)当类名重名时,需要指定具体的包名。
(3)方法重名时,需要指定具体所属的对象或者类。
二、可变参数
1、为什么引入可变参数?
如果一个方法在参数列表中传入多个参数,个数不确定,那么每次都要重载该方法,代码重复太多。虽然可以用数组作为形式参数,但是给形参传递数据时,每次都需要定义一个数组对象,作为实际参数,麻烦。于是在JDK1.5版本后,就提供了一个新特性:可变参数。
2、可变参数的书写格式:
在形式参数的变量类型和变量名之间,加入三个点 … ,前后有无空格皆可。例如:
add(int… x){};
3、可变参数特点:
(1)可变参数必须定义在参数列表的最后;
(2)…位于“变量类型”和“变量名”之间;
(3)可变参数其实就是数组参数的简写形式,编译器为该可变参数隐式创建一个数组,在方法体中以数组的形式访问可变参数。
三、增强型for循环
1、格式:
for(数据类型 变量名 : 被遍历的集合(collection)或者数组) {执行语句}
2、说明
(1)对集合进行遍历。只能获取集合元素。但是不能对集合进行操作。可以看作是迭代器的简写形式。
(2)迭代器除了遍历,还可以进行remove集合中元素的动作。如果使用ListIterator,还可以在遍历过程中对集合进行增、删、改、查的操作。
(3)增强型for循环的变量类型前可加修饰符,如final(可被局部内部类访问到)。
3、传统for和高级for的区别:
(1)传统for循环可以完成对语句的多次操作,因为可以控制循环增量条件。在遍历数组时有角标索引。
(2) 高级for循环是一种简化形式,它必须有遍历目标,该目标要么是array或Collection单列集合,不可以直接遍历Map集合,但可以将Map集合转化为单列的Set集合,就可以使用。例如:
for( Map.Entry<Integer , String>) me : map.entrySet()){
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key + “::” +value);
}
四、基本数据类型的自动拆箱与装箱
1、自动装箱:Integer iObj = 3;
2、自动拆箱:iObj + 2;
3、对于基本数据类型的说明:整数在-128 ~ 127之间的数,包装成Integer类型对象,会存入常量池中的缓存,再创建一个对象的时候,如果其值在这个范围内,就会直接到常量池中寻找,因为这些小数值使用的频率很高,所以缓存到常量池中,被调用时就方便很多。
4、享元模式(flyweight):
描述:有很多个小的对象,它们有很多属性相同,把属性相同的部分变成一个对象,这些相同的属性称为这个对象的内部状态(intrinsic)。把那些不同的属性变成方法的参数,称之为外部的状态(extrinsic)。这种优化内存,只创建一个对象的模式,称之为享元模式。
例如:Integer对象中对象的取值范围在-128~127时,其值相同的对象相同,因为这些小的数被调用的频率较高,所以被缓存在一个池中以备随时调用。这样就不用在创建新的对象,这就是典型的享元设计模式。
五、枚举
(一)概述
1、枚举:就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。它是java1.5中增加的一个新特性。
2、用普通类模拟枚举的实现原理,代码示例:
/* 普通类定义一个Weekday的类来模拟枚举功能。
1、私有的构造方法
2、每个元素分别用一个公有的静态成员变量表示
3、可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
*/
public 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?"SUM":"MON";
}
}
(二)枚举的基本应用
1、概述
(1)通过enum关键字定义枚举类,枚举类是一个特殊的类,每个元素都是该类的一个实例对象。
(2)用枚举类规定值,如上面的WeekDay类。以后用此类型定义的值只能是这个类中规定好的值,若不是这些值,编译器不会通过。
(3)在编译时期就会发现错误,减少了运行时期的错误。
(4)如果调用者想打印枚举类中元素的信息,需由编写此类的人定义toString方法。
注:枚举类是一个class,而且是一个不可被继承的final类,其中的元素都是类静态常量。
2、枚举常用方法
(1)构造方法
① 构造方法,只在构造枚举值的时候被调用。
② 构造方法只有private的,没有public的。这样禁止枚举实例对象被外部定义。枚举值是public static final的常量,枚举类的方法和数据域是可以被外部访问的。
③ 构造函数可以有多个,调用哪个即初始化相应的值。
(2)静态方法
① valueOf(String e):转为对应的枚举对象,即将字符串转为对象
② values() :获取所有的枚举对象元素
(3)非静态方法
① String toString():返回枚举量的名称
② int ordinal():返回枚举值在枚举类中的顺序,按定义的顺序排
③ Class getClass():获取对应的类名
④ String name():返回此枚举常量的名称,在其枚举声明中对其进行声明。
3、示例代码:
public class EnumDemo {
public static void main(String[] args) {
WeekDay weekday = WeekDay.MON;
System.out.println(“1”+weekDay);//输出枚举常量名
System.out.println(“2”+weekDay.name());//输出对象名
System.out.println(“3”+weekDay.getClass());//输出对应类
System.out.println(“4”+weekDay.toString());//输出枚举对象名
System.out.println(“5”+weekDay.ordinal());//输出此对象在枚举常量的次序
System.out.println(“6”+WeekDay.valueOf("WED"));//将字符串转化为枚举常量
System.out.println(“7”+WeekDay.values().length);//获取所以的枚举元素,并打印其长度
}
//定义枚举内部类
public enum WeekDay{
SUN(1),MON,TUE,WED,THI,FRI,SAT;//分号可有可无,但如果下面还有方法或其他成员时,分号不能省。并且当有其他方法时,必须在这些枚举变量的下方。
//无参构造器
private WeekDay(){
System.out.println("First");
}
//带参数的构造器
private WeekDay(int day){
System.out.println("Second");
}
}
}
(三)枚举的高级应用
1、枚举:就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
2、枚举元素:必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
3、带构造方法的枚举
(1)构造方法必须定义成“私有“。
(2)如果有多个构造方法,该如何选择?
(3)枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4、带方法的枚举
(1)定义枚举TrafficLamp
(2)实现普通的next方法
(3)实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
(4)增加表示时间的构造方法
* 代码示例:
public class EnumTest {
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(30){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
//构造器
private TrafficLamp(int time){
this.time=time;}
//抽象方法
public abstract TrafficLamp nextLamp();
}
}
---------- android培训、java培训、期待与您交流! ----------
黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举的更多相关文章
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- 张孝祥java高新技术 --- jkd1.5 新特性
1. 静态导入 import static java.lang.Math.max; 2. 可变参数 3. 自动装箱,拆箱 4. 枚举
- (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...
- JDK1.5后的新特性之一:可变参数
Java中的可变参数 Java1.5后出现了一个新特性,即可变参数,格式为:类型 …参数 例如: 总的来说,可变参数可以当成是数组来用: public void testSum() { System. ...
- java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容
8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...
- Java的自动装箱/拆箱
概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...
- JAVA提高一:静态导入、可变参数、增强型for循环、装拆箱
国庆假期已结束,假期8天,全部在家带娃,体会到了妻子的不容易,需要好好努力来多赚钱了,言归正传.10月份开始进去JAVA 高级语法知识学习,本节复习学习的为:静态导入.可变参数.增强型for循环.装拆 ...
- JAVA自动装箱拆箱与常量池
java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...
- JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)
JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7 ...
- Java 的自动装箱拆箱
Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...
随机推荐
- PHP计算时间差,并返回什么时间之前发表的内容
<?php header("Content-type: text/html; charset=utf-8"); function time2Units ($time){ $y ...
- 转义字符_MySQL识别下面的转义序列
转义字符.MySQL识别下面的转义序列 在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' ...
- WebForm带有图片的验证码
验证码形成的部分在一个aspx文件中: 页面设置 <%@ Page Language="C#" AutoEventWireup="true" CodeFi ...
- WSDL2ObjC Unsupported Media Type
调用WCF服务时,出这样的异常“415 Unsupported Media Type”, Because the WCF soap is v1.1, the http header should be ...
- VB6中的引用传递 与 VB.NET中的引用传递的区别
首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...
- socket(一)
相关链接: http://my.oschina.net/u/1378445/blog/340206?p=2&temp=1469158886336#blog-comments-list http ...
- iOS - Git 代码版本管理
1.Git Git 是用 C 语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容. ...
- ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)
最近在做一个电商项目,其中商品搜索中出现一个奇怪的现象,根据某个字段排序的时候会出现商品数量减少的情况.按照一般路要么查不出来,要么正常显示,为什么增加了按照销量排序就会出现查询结果减少的情况. 查了 ...
- Monkey 使用aapt查看apk包名
使用aapt //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging ...
- Linux 系统使用之 VMware Tools安装
Red Hat Enterprise Linux 4系统中安装VMware Tools 1. 必须以ROOT身份进入Linux 2. 进入linux系统,然后按下 CTRL+ALT组合键,进入主操作系 ...