------- android培训、java培训 、期待与您交流! ----------
这篇博客可能写的知识点有点乱、有点不成系统,但这些都是我们平时学习可能忽略掉的,但对我们的理解还非常重要的知识点。学习往往也就是这样积少成多,汇小溪以成江河。现在的我就是漫游在知识海洋的小船,一边重拾和回顾知识,一边驶向彼岸,接下来就跟我一块来看看吧。
Eclipse使用技巧:
IDE:itegrity development environment集成开发环境
一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置,例如,所使用的javac和java命令,等等,细节可以查看windowàpreferences。如果要为eclipse再配置一套环境选项,可以再创建一个workspace。Packageexplorer视图窗口中的fileters菜单项,可以显示空的父包(此功能默认是关闭的)。
Alt+/补全命令(windowàpreference—>Generalàkeysàcontents Assist)
File-switchworkspace切换和新建工作站。
调试:双击设置断点,右击debug切换到debug透视图,选中变量右击watch可以看到变量当时的值。
Windowàshow view显示某个小窗口。
高版本的java能运行低版本的javac编译的程序
低版本的java不能运行高版本的javac编译的程序。
Surround with可选各种代码块。
静态导入;
Import语句可以导入一个类或某个包中的所有类
Import static语句导入一个类中的某个静态方法或所有静态方法。
可变参数:
只能出现在参数列表的最后;
…位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
例:
Public static int add(int x,int …args){
Int sum = 0;
For(int i-0;i<args.length;i++){
Sum+=args[i];
}
Return sum;
}
增强for循环
For(type变量名:集合变量名){……}(有的地方也叫foreach循环)
基本数据类型的自动拆箱与装箱
Integer iObj = 3;
System.out.println(iObj+12);
Integer i1 =13;
Integer i2=13;
System.out.println(i1=i2); //打印结果为true
Integer i1=137;
Integer i2=137;
System.out.println(i1=i2); //打印结果为false
在-128到127之间都是返回true
Integer i3 = Integer.valueof(3)
Integer i4 = Integer.valueof(3)
System.out.println(i3=i4); //打印结果为true
享元模式(flyweigh):有很多很小的东西它们有很多共同的东西,所以把它们整成一个,它们不同的参数做成函数的参数。
抽象类只能通过子类实例化对象。
例:
Public abstract class WeekDay{
Private WeekDay(){}
Public final static WeekDay SUN = new WeekDay(){ //用匿名类实例化子类
Public WeekDay nextDay(){
Return MON;
}
}
Public final static WeekDay MON = new WeekDay(){
Public WeekDay nextDay(){
Return SUN;
}
}
Public abstract WeekDay nextDay();
}
这样一来就将大量的if else语句转移成了一个个独立的类。
枚举的ordinal()方法返回对象在枚举中的编号(从0开始)。
Values()函数返回枚举的每一个元素,返回一个数组。
枚举的列表必须放在所有的方法和所有的成员变量之前。
枚举元素列表最后一定要有分号。
枚举的构造方法必须是私有的。
枚举里抽象类的应用:
例:
Public enum TrafficLamp{
RED{
Public TrafficLamp nextLamp(){
Return GREEN;
}
},
GREEN{
Public TrafficLamp nextLamp(){
Return YELLOW;
}
},
YELLOW{
Public TrafficLamp nextLamp(){
Return RED;
}
};
Public abstract TrafficLamp nextLamp();
}
虽然枚举里包含抽象方法但public enum TrafficLamp{}并不用abstract修饰
New Date(300){} //创建Date类的子类对象,并调用父类的有参构造方法。
枚举只有一个成员时,就可以作为一种单例的实现方式。
反射的基石--àClass类(不Java的新特性是JDK1.2之后增加的)
Java程序中的各个Java类属于同一类事物,描述这类事物的java类名就是Class
例:Date.class //表示Date类的字节码
P1.getClass() //表示得到对象p1对应类的字节码
Class.forName(“java.lang.String”); //也是表示该类对应的字节码文件
得到类的字节码有三种方式:
1. 类名.class例如:System.class
2. 对象.getClass()例如:new Date().getClass()
3. Class.forName(“类名”)例如:Class.forName(“java.lang.String”)
有九个预定义对象:八个基本数据类型和一个void对象。
Class.isPrimitive()看是不是原始文件。
System.out.println(int..class == Integer.class); //返回结果是false
System.out.println(int..class == Integer.Type); //返回结果是 true,Integer.Type代表Integer包装的基本类型是什么。
数组类型的Class实例对象用Class.isArray()
总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int[],void
反射的概念:反射就是把java类中的各种成分映射成相应的java类。
例:String.class.getConstructor(StringBuffer.class) //表示获取String类的带有一个StringBuffer参数的构造函数。
JDK1.5之后增加了可变参数的新特性。
Constructor constructor = String.class.getConstructor(StringBuffer.class)
String str = (String)Constructor.newInstance(new StringBuffer(“abc”)) //用此构造方法创建一个新对象(返回方法对象是Object)
Class.newInstance()方法调用不带参数的构造方法创建对象。
反射回降低程序的性能。
Field类代表某个类中的一个成员变量
例:
Public class ReflectPoint{
private Int x;
public Int y;
Public ReflectPoint(int x,int y){
This.x = x;
This.y = y;
}
Public static void main(String args[]){
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldy = pt1.getClass().getField(“y”); //得到y成员变量
//此时的fieldy不等于5,它只是代表类的y这个成员变量,并不表示某个对象的y的具体值。
Fieldy.get(pt1); //得到对象pt1的y值。
//getField()不能得到类的私有的成员变量,getDeclaredField()可得到所有的声明的成员变量。
Field fieldx = pt1.getClass().getDeclaredField(“x”);
Fieldx.setAccessible(true); //虽然上边用getDeclaredField()得到了私有方法x,但无法使用,所以此时就需要使用setAccessible()把它设为可访问的。
System.out.println(fieldx.get(pt1));
}
}
例题:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的”b”改成”a”?
Public class ReflectPoint{
String str1 = “ball”;
String str2 = “basketball”;
String str3 = “itcast”;
Public String toString(){
Return str1+”--”+str2+”--”+str3;
}
Public static void main(String args[]){
ReflectPoint pt1 = new ReflectPoint(3,5);
changeStringValue(pt1);
System.out.println(pt1);
}
Public static void changeStringValue(){
Field[] fields = obj.getClass.getFields();
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); //把值设置回去
}
}
}
Method类代表某个类中的一个成员方法
例:
String str1 = “abc”;
//现在我们的目的是实现str1.charAt(1)
Method methodCharAt = String.class.getMethod(“charAt”,int.class);
methodCharAt.invoke(str1,1);
methodCharAt.invoke(null,1); //则方法为静态的方法。
用反射方式执行某个类中的main方法
例:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。
String startingClassName = args[0];
Method mainMethod = class.forName(startingclassName).getMethod(“main”,String[].class);
mainMethod.invoke(null,new Object[]{new String[]{“111”,”222”,”333”}});
数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.
Int[] a1 = new int[3]
Int[] a2 = new int[4]
Int[][] a3 = new int[2][3]
String[] a4 = new String[3]
Object aObject1 = a1; //对
Object aObject2 = a4; //对
Object[] aObject3 = a1; //错
Object[] aObject4 = a3; //对
Object[] aObject5 = a4; //对
基本数据类型不是Object.
Int[] a1 = new int[]{2,3,4}
String[] a4 = new String[]{“a”,”b”,”c”}
System.out.println(Arrays.asList(a1)); //不能把数组里的内容打印出来
System.out.println(Arrays.asList(a4)); //能把数组里的内容打印出来
因为在JDK1.4中Public static List asList(object[] a)接收的是数组int类型的数组不能转换成Object[]而String类型的数组则可以。
Object[] a = new Object[]{“a”,1}
a[0].getClass() //只能得到某个具体元素的类而不是数组的类。
Java中的内存泄露:内存中的某个对象没用了,但没有清除一直保留在内存中。其中一种原因是:某个对象存在了用哈希算法设计的集合里,但又修改了这个对象的某个属性,同时这个属性是哈希算法中用到的,导致对象找不着而删不掉。
反射的作用-à实现框架
建立一个config.properties文件里边写
className = java.util.ArrayList
InputStream ips = new FileInputStream(“config.properties”);
Properties props = new Properties();
Props.load(ips);
Ips.close();
String className = props.getProperty(“className”);
Collection collections = (Collection)Class.forName(className).newInstance();
内省(IntroSpector):用来服务JavaBean特殊的Java类,符合某些特殊命名规范的类,含有get和set方法,JavaBean的属性是根据get和set方法推断出来的,把get和set去掉剩下的就是JavaBean类的属性。
getAge—Ageà如果第二个字母是小写,则把第一个字母变成小写-àage
gettimeàtime
getTime-àtime
getCPU-àCPU