1.基础加强
(1)包名:com.huawei.iterview
(2)Perspective与View的关系Perspective是View的集合
(3)继承与覆盖的应用:workspace的配置Java和javac 单个project的java和javac的配置
(4)常见问题:版本问题Bad version number in .class file
2.overload vs override 的区别?
overload:重载 方法功能名称相同,参数列表不同,跟返回值类型无关
override:重写 方法体不同,其他完全相同,如果父类的方法是私有的,
则相等于是子类的特有方法
3.jdk1.5的新特性:
(1)静态导入:
(1)导入类中的一个方法
import static java.lang.Math.max;
(2)导入类中所有的静态方法
import static java.lang.Math.*;
(2)可变参数:
只能出现在参数列表的最后:...位于变量类型和变量名之间
调用可变参数方法时,编译器为该可变参数隐含创建一个数组
以数组的形式访问该可变参数
列(1):
public static int add(int,a int ...args)
int sum =a;
for(int x = 0,x<args.length,x++){
sum += args[x];
return sum;
}
(3)增强for
for(元素类型 变量名 : 数组名称){
对元素进行操作
}
(4)自动装箱和拆箱
Integer i = 3;自动装箱
Syso(3+4);自动拆箱
Integer i1 = 13;
Integer i2 = 13; i1==i2 true;
Integer i3 = 128;
Integer i4 = 128; i3==i4 false;
这种模式叫享元模式flyweight(-128--127被缓存起来)
享元模式:很多很小的对象有很多相同的地方就把他们变成一个对象,不同的东西
可以变成外部的属性作为方法的参数使用(相同的属相叫做内部状态,不同的属性叫做外部状态)
(5)枚举
枚举:规定具体的类型和具体的值,如果用到该类型则必须是规定的值,否则编译不通过
(1)枚举相等于一个类,元素是一个实例对象,最后可加分号也可不加,当元素列表后有内容时即必须要加分号,
(2)元素列表要放在所有内容的前面(相等于是成员变量,而且是静态的常量随着类的加载而加载)
(3)构造方法必须私有
4.反射:jdk1.2出现的特性
(1)反射:就是把Java类中的各种成分映射成相应的Java类
(2)反射导致程序性能严重下降
(3)获取类的字节码文件对象:
类名.Class
对象.getClass()
ClassforName("Java.lang.类型名称")
(1)Constructor:
(1)获取某个类的所有构造方法
Constructor[] constructor = Class.forName("java.lang.String").getConstructors();
(2)获取某个类的一个构造方法
Constructor constructor = new Class.forName("java.lang.String").getConstructor(StringBuffer.Class);
(3)创建实例对象
普通方法:String s = new String(new StringBuffer("abc"));
反射方法:String s = (String)constructor.newInstance(new StringBuffer("abc"));
(2)Field:
(1)获取某个类中的成员变量
ReflectPoint point = new ReflectPiont(3,4)
Filed fieldy = piont.getClass().getFiled("y");
System.out.println(filedy.get(point));
(2)获取私有变量
getDeclared("x").setAccessible(true);
案例:将任意对象中的所有String类型的成员变量所对应的字符串内容中的"b"变成"a";
public static void changeStringValue(Object obj){
Field[] fields = obj.Class.getFiels();
for(Field field : fields){
//因为是同一个字节码文件所以这里用==
if(field.getType()==String.Class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('b','a');
field.set(obj,newValue);
}
}
}
(3)Method:
列:画圆,司机刹车,
(1)根据索引获取字符串中的元素
Method methodCharAt = String.class.getMethod("charAt",int.class);
System.out.pritln(methodCharAt.invoke(str1,1));
(2)如果传递给Method对象的invoke()方法的第一个参数是null那么这个Method对象对应的方法就是静态方法
(3)对接受数组参数的成员方法进行反射
列:
class TestArgument{
public static void main(String[] args){
for(String arg : arg){
System.out.println(arg);
}
}
}
class MethodReflect{
public static void main(String[] args){
String startingClassName = arg[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class);
mainMethod.invoke(null,(Object)new String[]{"11","22","33"});
//mainMethod.invoke(null,new Object[]{new String[]{"11","22","33"}})
}
}
(4)数组的反射
(1)如果两个数组的维数和元素类型相同那么这两个数组的字节码文件对象相同
(2)Arrays.asList()方法处理int[] 和String[]的差异
int[]会被按照jdk1.5来解析
String[]会按照jdk1.4来解析打印出元素
(3)可以获得数组中一个元素的类型不可以获得一个数组的类型
(4)基本类型的一维数组可以被当做Object类型使用,不能被当做Object[]使用
非基本类型的一维数组既可以被当做Object使用,又可以被当做Object[]使用
(5)用反射实现框架
设置一个配置文件config.proerties,className=java.util.ArrayList;
配置文件放哪里:用一个完整的路径,不硬编码是计算出来的
//封装源文件
Inputstream is = new FileInputStream("config.properties");
//将文件加载到流对象
Properties props = new Properties();
props.load(is);
//释放资源
is.close();
//通过键获取值
String className = props.getProperty("className");
//创建一个实例对象
Collection collection = (Collection)Class.forName(className).newInstance();
(6)类加载器classLoad();
类名.class.getClassLoder().getResourceAsStream(绝对路径);
类名.class.getResourceAsStream(相对,绝对都可以);