这个人、这件事,是这样的吗?
今日整理记录内容:
1、(JDK1.5)可变参数
2、(JDK1.5)自动拆箱与装箱
3、享元模式
4、(JDK1.5)枚举
5、Class类
一、(JDK1.5)可变参数
1、只能出现在参数列别的最后;
2、…位于类型和变量名之间,前后有无空格都可以;
3、调用可变参数的方法时,编译期为该可变参数隐含创建一个数组,在方法体内以数组的形式访问可变参数;
4、带有可变参数的方法尽量不要重载
解释:
public static void varegar(int a,int...iArr){// --------编译正确
for (int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);//---以数组的方式操作可变参数
}
}
public static void varegar(int...iArr, int a){// --------编译错误
for (int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);
}
}
/*像下面的这种重载方式,在编译期可以通过,但是在使用的时候极大可能会出现错误。
** 因为不知道使用的是哪个方法。
*/
public static void varegar(int...iArr){
for (int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);
}
}
public static void varegar(int a, int...iArr){
for (int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);
}
}
使用
varegar();//---使用正确
varegar(1);//---出现错误,不知道调用的是哪个方法
varegar(1, 2);//---出现错误,不知道调用的是哪个方法
。。。
二、(JDK1.5)自动拆箱与装箱
1、在JDK1.5之前基本数据类型和基本数据类型对应的引用数据类型之间的互相转换是需要手动去操作的,而在JDK1.5之后这个过程编译器帮我们自动完成了。
2、自动拆箱就是基本数据类型对应的引用数据类型自动转换为基本数据类型的过程。
3、自动装箱就是基本数据类型自动转换为基本数据类型对应的引用数据类型的过程。
解释:
/*JDK1.5之前*/
Integer a = new Integer(3);//装箱过程,需要手动操作。
int b = (int)a;//拆箱过程,需要手动操作。
/*JDK1.5后的自动拆箱和自动装箱*/
Integer x = 3;//自动装箱:整数3 被装箱为 Integer类型 过程就是 Integer x = new Integer(3);
int y = x;//自动拆箱:将装箱后的数字3,单独拿出来并赋值给 变量 y;
三、享元模式
1、把认为常用的数据放在内存中,用到这个数据时就从内存中拿。类似单例模式。
2、将一个字节表示的数据范围(-128-127)存到内存中,采用享元模式。
3、享元模式是针对地址而言的。
解释:
Integer a = 22;//在一个字节表示的数据范围内,存到享元内存中。
Integer b = 22;//在一个字节表示的数据范围内,从享元内存中取。
Integer x = 200;//不在一个字节表示的数据范围内,重新分配内存空间。
Integer y = 200;//不在一个字节表示的数据范围内,重新分配内存空间。
System.out.println(a == b);
System.out.println(x == y);
输出:
true
false
四、(JDK1.5)枚举
1、当创建一个类对象时,只能创建指定的那几个对象时就用枚举;
2、枚举的元素必须在枚举类的首行;
4、创建枚举类时,如果创建的元素后面还有其他语句,则最后一个枚举元素必须用英文分号(;)隔开。
解释:
/*创建一个科目类,科目只有语、数、外、java、javascript*/
public enum Classes{
/*创建枚举元素*/
CHI("a") {
@Override
int grade() {
// TODO Auto-generated method stub
return 100;
}
},MATH("b") {
@Override
int grade() {
// TODO Auto-generated method stub
return 100;
}
},ENG("c") {
@Override
int grade() {
// TODO Auto-generated method stub
return 100;
}
},JAVA("d") {
@Override
int grade() {
// TODO Auto-generated method stub
return 100;
}
},JAVASCRIPT("e") {
@Override
int grade() {
// TODO Auto-generated method stub
return 99;
}
};
private String mTeacher;
/*创建枚举类的私有构造方法*/
private Classes(String teacher){
mTeacher = teacher;
}
public String getTeacher(){
return mTeacher;
}
/*创建枚举类的抽象方法*/
abstract int grade();
}
五、Class类(字节码)
1、用于描述Java类,java类用于描述事物;
2、一个类(编译后的java文件)是以二进制数据的方式保存到硬盘上的(.class文件),当我们用到这个类时,这个类的二进制数据就从硬盘中加载进内存并转换为字节码;
3、通过 类名.class、类对象.getClass()、Class.forName(String 类的完整名称)获得该字节码对象并且获得的是同一份字节码。
解释:
我们知道JAVA是面向对象的语言,如果对面向对象的概念不太懂得话可以看我的这篇博客Java学习笔记二,所以Java类就是对一件事物的描述,而Java类也可以认为是一件事物,它有属性、方法、构造方法、包名、注解等成员,那我们就可以用一个专门的Java类来描述Java类这一事物,这个专门的Java类就是 Class类。
Class clazz = JDK5.class;
System.out.println("通过类名.class获得的字节码:"+clazz.getSimpleName());
JDK5 jdk5 = new JDK5();
clazz = jdk5.getClass();
System.out.println("通过对象名.getClass()获得的字节码:"+clazz.getSimpleName());
try {
clazz = Class.forName("com.hbbfxy2.JDK5");
System.out.println("通过Class.forName(类的完整名称)获得的字节码:"+clazz.getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
小知识点:
1、(JDK1.5)静态导入:import static 导入类中一个静态方法或所有静态方法。
2、(JDK1.5)增强for循环:for(类型 变量名: 类型集合或数组) 。
3、int[] iArr = new int[2];
Object[] oArr = iArr;//编译错误,意思是iArr数组中的元素是不是object类型