------- android培训、java培训、期待与您交流! ----------
1.可变参数
(1).只能出现在参数列表的最后
(2)."..."位于变量类型和变量名之间,前后有无空格都可以。
(3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
2.基本数据类型的装箱和拆箱
(1).享元模式:
是对象的结构模式,它以共享的方式高效地支持大量的细粒度对象。
3.枚举
(1).定义:就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值。
(2).枚举类的构造函数必须是私有的。
(3).枚举类就相当于一个类,它继承自Enum类,其中可以定义构造方法、成员变量、普通方法和抽象方法,甚至可以有main方法。但它不能继承其他的enum类或普通类,因为它是final修饰的,而且java不支持多继承。
(4).枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分离。
(5).枚举只有一个成员时,就可以作为一种单例的实现模式。
(6).可以在switch语句中,使用enum。在这个switch语句中可以没有default语句,但必须确保覆盖了所有的分支。如果某个分支中出现return语句,则必须要有default语句。
示例:
enum
WeekDay
{
SUN
(1),
MON
,
TUE
,
WED
,
THI
,
FRI
,
SAT
;
private
WeekDay()
{
System.
out
.println(
"First"
);
}
private
WeekDay(
int
num)
{
System.
out
.println(
"Second"
);
}
}
public
class
EnumTes
{
public
enum
TransportLamp
{
RED
(30)
{
public
TransportLamp nextLamp()
{
return
GREEN
;
}
},
GREEN
(35)
{
public
TransportLamp nextLamp()
{
return
YELLOW
;
}
},
YELLOW
(5)
{
public
TransportLamp nextLamp()
{
return
RED
;
}
};
private
int
time
;
private
TransportLamp(
int
time)
{
this
.
time
= time;
}
public
abstract
TransportLamp nextLamp();
}
public
static
void
main(String[] args)
{
WeekDay wd = WeekDay.
SUN
;
System.
out
.println(wd.ordinal());
TransportLamp tl = TransportLamp.
RED
;
System.
out
.println(tl.nextLamp());
}
}
4.反射
(1).反射就是把java类中的各个成分映射成相应的java类。
(2).获取某个类或某个对象所对应的class对象常用的三种方法:
a. 使用Class类的静态方法forName:Class.forName("java.lang.String");
b. 使用类的.class语法:String.class;
c. 使用对象的getClass()方法:String a = "aa"; Class<?> type = a.getClass();
(3).有九个预定义的Class对象,分别是:基本的 Java 类型(
boolean
、
byte
、
char
、
short
、
int
、
long
、
float
和
double
)和关键字
void
也表示为
Class
对象。
(4). Constructor类(构造方法的反射):
有两种方法可以产生实例,一种是通过Constructor类来产生。另一种是通过Class对象的newInstance()方法直接产生,不过该方式只能产生无参数的实例对象。
示例:
第一种:
public
static
void
main(String[] args)
throws
Exception
{
byte
[] bytes = {1,2,3,4,5};
Class<?> cc = Class. forName(
"java.lang.String"
);
Constructor<?> cons = cc.getConstructor(
byte
[].
class
, String.
class
);
String str = (String)cons.newInstance(bytes,
"UTF-8"
);
}
第二种:
String mess = (String)Class. forName(
"java.lang.String"
).newInstance();
(5)Field类(代表成员变量)
示例:
public
class
FieldClass
{
private
int
age
;
public
String
name
;
public
FieldClass(){}
public
FieldClass(
int
age, String name)
{
this
.
age
= age;
this
.
name
= name;
}
public
static
void
main(String[] args)
throws
Exception
{
FieldClass fc =
new
FieldClass(20,
"flora"
);
//只是获取了Field对象
Field fname = FieldClass.
class
.getField(
"name"
);
//获取变量值
System.
out
.println(fname.get(fc));
//如果要访问private属性的值,则要用getDeclaredField()方法
Field fage = FieldClass.
class
.getDeclaredField(
"age"
);
//上面做法只是让你能看到这个私有的属性,此步骤是为了能获取私有属性的值
fage.setAccessible(
true
);
System.
out
.println(fage.get(fc));
}
}
(6).Method类
代表某个类中的一个成员方法。
示例:
String ss =
"abc"
;
Method method = String.
class
.getMethod(
"indexOf"
, String.
class
);
//如果传递给invoke方法的第一个参数是null,这意味着该Method对象对应的是一个静态方法。
System.
out
.println(method.invoke(ss,
"bc"
));
(7).数组的反射
a.具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class对象。
b.代表数组的Class实例对象的getSuperclass()返回的父类为Object类对应的Class。
c.基本类型的一维数组可以当做Object类型使用,不能当做Object[]类型使用;非基本类型的一维数组两者都可以当做使用。
d.Arrays类中的asList()方法操作非对象的一维数组使其转换成集合时,可以打印出数组中的元素,而对基本类型的一维数组就不行。这是因为在1.4版本中asList()方法中接收的参数是Object[]类型的,而基本类型的数据不能变为Object[]类型。所以只能使用1.5版本的T...a这样的类型参数,故打印出的还是哈希值。
e.Array类提供了动态创建和访问 Java 数组的方法。
5.HashCode的分析
(1).通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希吗也必须相同,但反之则不成立。
(2).当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算修改哈希值的字段了。否则,对象修改后的哈希值与最初存储进hashset集合中时的哈希值就不同了。