------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
静态导入
import static 类中的具体方法(可以用*)
可变参数
add(int x,int ... args)
overload和override的区别
增强for循环
for(type 变量名:集合变量名){}
public static int add(int x,int... args)
{
int sum = x;
for(int arg : args)
{
sum += arg;
}
return sum;
}
享元模式flyweight
很多小的对象有很多共同东西,可以把它们变成相同的对象,不同的东西可以变成外部属性作为方法参数传入。
Integer a1 = 4;
Integer a2 = 4;
a1 == a2;
Integer a1 = 128;
Integer a2 = 128;
a1 != a2;
枚举类
public enum WeekDay
{
SUN(1),MON,TUE,WED,THI,FRI,SAT;
private WeekDay();//构造方法在成员变量之后
private WeekDay(int day);
}
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.valueOf("SUN").toString());
System.out.println(WeekDay.value().length);
实现带有抽象方法的枚举
public enum TrafficLamp
{
RED(30)
{
public TrafficLamp nextLamp()
{
return GREEN;
}
};
GREEN(45)
{
public TrafficLamp nextLamp()
{
return YELLOW;
}
};
YELLOW(5)
{
public TrafficLamp nextLamp()
{
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time)
{
this.time = time;
}
}
枚举只有一个成员时,可以作为一种单例实现方式。
内存泄露
动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。
当一个对象存储进hashset集合后,就不能修改这个对象中那些参与计算哈希值的字段了,否者会导致内存泄露,影响程序执行。
框架的概念
在配置文件中可指定不同集合种类,然后加载配置文件:
Collection collections = (Collection)Class.forName(配置文件字串).newInstance(),
从而使先开发的框架调用后开发的程序。
配置文件一定要用完整的路径,但完整的路径不是硬编码,而是运算出来的
类加载器加载配置文件,这种方式只能读
InputStream ips = 类名.class.getClassLoader().getResourceAsStream("cn/itcast/day1/config.properties")
cn/itcast/day1/config.properties是源文件夹到配置文件的路径
相对路径加载
InputStream ips = 类名.class.getResourceAsStream("相对于子包的路径");
绝对路径加载
InputStream ips = 类名.class.getResourceAsStream("(绝对)相对于根的路径(/cn/.....)");
内省IntroSpector------>JavaBean一种特殊的Java类
写一个JavaBean叫Person具有...属性
class Person
{
private int x;
public int getAge(){return x;}
public void setAge(int age){this.x=age;}
}
JavaBean叫Person具有age属性
去掉get和set后剩下的就是JavaBean的属性名
Age--->如果第二个字母是小的,则把第一个字母变成小的--->age
gettime--->time
setTime--->time
getCPU--->CPU
内省
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
Method methodGetX = pd.getReadMethod();//获得读的方法,即get方法
Object retVal = methodGetX.invoke(pt1);//pt1是JavaBean实例化的对象
System.out.println(retVal);//属性的值
重构抽取方法
对JavaBean的属性进行设置可以使用BeanUtils工具包来设置和读取JavaBean的属性
注解
jdk1.5新特性枚举,注解
一个注解是一个类
使用注解就等于调用该类
@Override注解覆盖-----源文件
@Deprecated注解过时代码------源文件
@SuppressWarnings("deprecation")压缩警告过时代码跳过警告----
注解相当于一种标记,在程序上加上注解就等于为程序加上某种标记。
Javac编译器,开发工具和其他程序可以了解你的类和各种元素上有无何种标记,
有什么标记就做什么事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
注解类@interface A{}
应用了注解的类
@A
Class B{}
对应用了注解的类进行反射操作的类
Class C
{
B.class.isAnnotionPresent(A.class);
A a = B.class.get.Annotion(A.class);
}
元注解:对注解类的注解
注解生命周期
源文件--->class文件--->内存中的字节码
默认Class文件阶段
@Retention(RetentionPolicy.RUNTIME)
让注解生命到内存运行阶段
编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
@target(ElementType.)
指定注解加在什么地方上的元注解
为注解增加属性
数组类型的属性
int[] arrayAttr() default{1,2,3};
@MyAnnotation(arrayAttr={2,4,3})
如果数组属性中只有一个元素,这时属性值部分可以省略
枚举类型属性
EnunTest.TrafficLamp lamp();
@MyAnnotiation(lamp=EnumTest.TrafficLamp.GREEN)
注释类型属性
MetaAnnotation annotationAttr() default@MetaAnnotation("xxx")
@MyAnnotation(annotationAtt=@MetaAnnotation("yyy"))
加载类的工具叫做类加载器,Java虚拟机可以安装多个类加载器系统默认三个主要的类加载器每一个负责加载特定位置的类,类加载器本身也是一个加载器。
1.BootStrap加载rt目录下的jar包内的类
加载的类加载器
2.ExtClassLoader
加载放在ext目录下的jar包中的类
3.AppClassLoader
加载CLASSPATH指定的所有jar和目录
类加载器的委托机制
如果A类中引用了B类,Java虚拟机将使用加载类A的加载器来加载类B;
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器来加载某个类。
加载一个类加载器先找上级加载器,从最上级开始找,如果返回到发起者仍未找到,则报异常。
自定义类加载器
必须继承抽象类ClassLoader
loadClass会找父类加载
重写findClass方法,自己加载的代码
defineClass方法用来生成字节码
模板方法设计模式
总体已经规划好,只等细节留有抽象方法等待子类去复写
有包名的类不能调用无包名的类
代理
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,
编写的一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类相同的方法,并在调用方法时加上系统功能的代码。
AOP面向方面的编程aspect oriented program
安全,事务,日志等功能要贯穿到好多模块中,所以他们就是交叉业务