------- android培训、java培训、期待与您交流! ----------
一、静态导入
1. import语句可以导入一个类或某个包中的所有类;
import static语句导入一个类中的某个静态或所有静态方法。
2.语法举例:
import static java.lang.Math.sin;
import static java.lang.Math.*;
二、可变参数
1.问题:一个方法接受的参数个数不固定。例如:
System.out.println(add(2,3,5));
System.out.println(add(1,2,3,5));
2.可变参数的特点:
1)只能出现在参数列表的最后
2)…位于变量类型和变量名之间
3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数.
三、增强for循环
1.语法
for(type变量名:集合变量名){……}
2.注意事项
迭代变量必须在( )中定义;
集合变量可以是数组或实现了Iterable接口的集合类。
3.举例:
public static int add(int x,int…args)
{
int sum=x;
for(int arg:args)
{
sum+=arg;
}
return sum;
}
四、基本数据类型的自动拆箱与装箱
1.自动装箱
Integer num=12;
2.自动拆箱
System.out.println(num+12);
3.基本数据类型的对象缓存
Integer num1=12;
Integer num2=12;
System.out.println(num1==num2);
Integer num3=129;
Integer num4=129;
System.out.println(num3==num4);
Integer num5=Integer.valueOf(12);
Integer num6=Integer.valueOf(12);
System.out.println(num5==num6);
4.享元设计模式(flyweight)
就是有很多小的对象,他们有很多属性相同,把他们变成一个对象,那些不同的属性变成方法的参数,
称之为外部状态。那些相同的属性称之为这个对象的内部状态。
五、枚举
1.为什么要有枚举?
枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
2.枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
3.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分隔。
把枚举中的成员方法或变量等放在枚举元素的前面,编译器会报错。
4.带构造方法的枚举。
1)构造方法必须定义成私有的。
2)枚举元素MON和MON( )的效果是一样的,都是调用默认的构造方法。
5.带方法的枚举
1)定义枚举TrafficLamp
2)实现普通的next方法
3)实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义
4)增加上表示时间的构造方法。
6.枚举只有一个成员时,就可以作为一种单例的实现方式。
六、注解
1. 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,
没加,则等于没有某种标记,以后,javac编辑器,开发工具和其他程序可以用反射
来了解你的类及各种元素上的任何标记,看你有什么标记,就去干相应的事。
标记可以加在包,类,字段,方法,方法的参数及局部变量上。
2. Java提供的几个基本注解:
@SuppressWarnings、@Deprecated、@Override
3. @Retention元注解:
RetentionPolicy.SOURCE,
RetentionPolicy.CLASS,
RetentionPolicy.RUNTIME;
分别对应:java源文件,class文件,内存中的字节码
4. @Target元注解
Target的默认值为任何元素,设置Target等于ElementType.METHOD。
原来加在类上的注解就报错啦,改为用数组方式设置{ElementType.METHOD , ElementType.TYPE}就可以了。
七、泛型
1.泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器
挡住源程序中的非法输入,编译器编译带类型说明的集合时会去掉“类型”信息,
使程序运行效率不受影响,对于参数化的泛型类型,getClass( )方法的返回值
与原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,
只要能跳进编译器,就可以往某个泛型集合中加入其它类型的数据,
例如,用反射得到集合再调用其add方法即可。
2.了解泛型
ArrayList<E>类定义和ArrayList<Integer>类引用中涉及如下术语:
1) 整个ArrayList<E>称为泛型类型
2) ArrayList<E>中的E称为类型变量或类型参数
3) 整个ArrayList<Integer>称为参数化的类型
4) ArrayList<Integer>中的Integer称为类型参数的实例或类型参数
5) ArrayList<Integer>中的< >念typeof
6) Arraylist称为原始类型
3.使用?通配符可以引用其他各种参数化的类型
1) 通配符定义的变量主要用于引用,可以调用与参数化无关的方法,不能调用与参数有关的方法。
2) 限定通配符的上边界:<? extends E>
3) 限定通配符的下边界:<? super E>
4.定义泛型方法
1) 交换数组中的两个元素的位置的泛型方法语法定义如下:
static<E>void swap(E[ ]a,int i,int y)
{
E t=a[i];
a[i]=a[j];
a[j]=t;
}
2) 用于放置泛型的类型参数的<>括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前,按照惯例,类型参数通常用单个大写字母表示。
3) 只有引用数据类型才能作为泛型方法的实际参数
swap(new int[ ]{3,5},0,1);语法会报告编译错误。
4) 除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符。
例如:Class中的getAnnotations( )方法的定义。并且可以用&来指定多个边界,如<V extends Serializable&Cloneable>void method(){}
5) 普通方法,构造方法和静态方法都可以使用泛型
6) 也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch语句中
7) 在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号。
5.定义泛型类型
1) 如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候就采用泛型类型的方式进行定义,也就是类级别的泛型。如:
public class GenericDao<T>
{
private T field;
public void save(T obj){}
public void getById(int id){}
}
2) 类级别的泛型根据引用该类名时指定的类型信息来参数化类型变量的,例如,如下两种方式都可以
GenericDao<String>dao=null;
New GenericDao<String>();
3) 注意
a) 在对泛型类型进行初始化时,类型参数的实例必须是引用类型,不能是基本类型。
b) 当一个变量被声明为泛型时,只能被实例变量和方法调用,而不能被静态变量和静态方法调用,因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。
c) 类中有多个方法需要使用泛型,实用类级别为的泛型。
八、内省JavaBean
1. JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则
2. 如果要在两个模块之间传递多个消息,可以将这些信息风险黄到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO),这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。
3. 如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分改成小的。
setId( )的属性名——id
isLast( )的属性名——last
setCPU( )的属性名——CPU
getUPS( )的属性名——UPS
总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。