---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流流! ----------------------


高新技术(1)知识点

1,Eclipse使用技巧:

1),MyEclipse和Eclipse的关系:

插件的关系。扩展Eclipse的功能.
Eclipse是用Java开发出来的,启动时实际上运行的是Java.exe,Java.exe启动一个Java类,
Java类运行效果是一个界面。

小知识:假如Eclipse关不掉,可以进入进程管理,将javaw.exe结束 就可以关掉。
Eclipse是一种IDE开发工具。

2),Java ee的简写:Java 2 Platform Enterprise Edition

ide(集成开发环境)的简写:Integrated Development Environment的英文缩写
jms的简写:Java Message Service,Java消息服务
jmx的简写:(Java Management Extensions,即Java管理扩展)
jndi的简写:(Java Naming and Directory Interface,Java命名和目录接口)

3),NetBeansIDE:

NetBeans 由Sun公司(2009年被甲骨文收购)在2000年创立,它是开放源运动以及开发人员和
客户社区的家园,旨在构建世界级的Java IDE。NetBeans当前可以在Solaris、Windows、Linux
和Macintosh OS X平台上进行开发,并在SPL(Sun公用许可)范围内使用。

4),JBuilder(收费的用的人不多):

Jbuilder是一个可视化JAVA开发工具。它是在Java2平台上开发商业应用程序、数据库、
发布程序的优秀工具。它支持J2EE,所以程序员可以快速的转换企业版Java应用程序。
第三方的类以jar包的形式存。

5),工程:

一般来说一个相对独立的项目就是一个工程,一个项目中涉及的多个Java文件,资源文件等用
一个工程进行管理。在不使用工程管理的情况下,如果一个项目中包括多个Java源文件,编程
人员需要精心维护这些源文件之间,以及源文件与其他文件的目录关系,需要逐一编译这些源
文件,需要手工启动运行编译后的结果,如果每一个程序的所有源文件用一个工程来组织,开
发工具能对所有源文件集中管理,记住每个源文件的位置和相互关系,工程中有那几个源文件
,启动类是那个,启动参数设置等配置信息在工程中都有记录。

2,静态导入:
import语句可以导入一个类或某个包中的所有类。
import static 语句导入一个类中的某个静态方法或所有静态方法。
3,可变参数:
overload和Override的区别:

可变参数的特:
只能出现在参数列表的最后。
...位于变量类型和变量名之间。前后有无空格都可以;
调用可变参数的方法时候,编译器为该可变参数隐含创建一个数组,
在方法体上以数组的形式访问可变参数。

public class VarableParameter {
public static void main(String[] args) {
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x,int ... args){
int sum = x;
for (int i = 0; i < args.length; i++) {
sum+=args[i];
}

return sum;

}
}
4,增强for循环:
语法: for(type 变量名:集合变量名){...}
注意事项:
1,迭代变量必须在()中定义。
2,集合变量可以是数组或实现了Iterable接口的集合类。
举例:
public static int add(int x,int...args){
int sum= x;
for(int arg:args){
sum+=arg;
}
return sum;

}

5,基本数据类型的自动装箱与拆箱:
享元设计模式:

由来:当对象数量太多时,将导致运行代价过高,带来性能下降等问题,享元模式为解决这一类
问题而诞生的。享元模式通过共享技术实现相同或相似对象的重用。
优点:提高程序效率和性能的模式,会大大的增加程序的运行速度。极大的减少了内存中,对象
的数量,使得相同对象在内存中只保存一份。
6,枚举:
JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了"大"方便。

1),常量:
在JDK1.5 之前,我们定义常量都是: public static final.... 现在好了,有了枚举,
可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
Java代码 :
public enum Color {
RED, GREEN, BLANK, YELLOW
}

2),定义一个枚举类:
public enum WeekDay{

SUN(1),MON(),TUR,WED,THI,FRI,SAT;
private WeekDay(){
System.out.println("frist");
}
private WeekDay(int Day){
System.out.println("sencod");
}
}


3),枚举中的抽象方法的应用
public enum TracfficLamp{
RED(30){
public TracfficLamp nextLamp() {

return GREEN;
}

},
GREEN(45){
public TracfficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(10){
public TracfficLamp nextLamp(){
return RED;
}
};

public abstract TracfficLamp nextLamp();
private int time;
private TracfficLamp (int time ){
this.time = time;
}
}
7,反射:
反射的基石是Class类。
1),class类:Java程序中的各个Java类属于同一个事物,描述这类事物的Java类名就是Class。

例如:众多的人用Person类来描述,而众多的Java类则用Class来描述。
2),字节码:当我们在源程序中用到Person类的时候,首先要从硬盘上把这个类的二进制的代码(字节码),
加载到内存中,接着才可以用它创建出对象。当我们程序中用到了很多的Java类,我们的内存
中就应该有与之对应的字节码。
3),Class类的静态方法 forName的作用

得到一个类的字节码有两种情况:

第一种:这个类的字节码已经加载到内存中来了,不需要加载了,直接找到字节码返回即可。
第二种:这个类的字节码在虚拟机中还没有字节码,于是用类加载器加载,加载以后就把那份字节码缓
存起来,同时这个方法返回刚才加载那份字节码。

4),得到字节码的方法有三种:

1,)类名.class 例如:System.class
2,)对象.getClass(),例如:new Date().getClass()
3,)Class.forName("类名"),例如Class.forName("Java.util.Date");

反射中主要使用的是第三种。
5),九个预定义Class实例对象:

(boolean,byte,char,short,int,long,float,double,void)

参看Class.isPrimitive方法的帮助

基本数据类型使用的Class实例对象是 int class = Integer.TYPE.

数组类型的Class示例对象使用的是Class.isArray()

总之只要是在源程序中出现的类型,都有各自的Class实例对象。

6),反射的概念:

反射就是把Java类中的各种成分映射成相应的Java类。

7),Constructor类:

Constructor类代表某个类中的一个构造方法。

Constructor中的newInstance 和Class类中的newInstance方法有什么关系?
关系是:提供便利。
例如可乐的例子:你每天要喝可乐,我每天都要去买可乐给你喝,那还不如 我把可乐
买回来,直接给你喝一样了。提供了便捷
反射比较占用性能。
8),Field类:

比较字节码 一定要用 == 号 不要用equals方法。
set方法暴力访问;

9),Method类:
JDK1.4和JDK1.5中的方法invoke区别:
JDK1.5是有可变参数的,而JDK1.4不支持可变参数

ReflectPoint pt1 = new ReflectPoint (3,5);
Field filed = pt1.getClass().getField("y");
//filed Y的值是多少?是5就是错的。filed Y 不是对象身上的变量,而是类上的,要用它去取某个对象上对应的值
System.out.println(filed.get(pt1));
Field filed1 = pt1.getClass().getDeclaredField("x");
filed1.setAccessible(true);//暴力访问
System.out.println(filed1.get(pt1));

1),Method charAt=String.getMethod("charAt",int.class);//方法名为charAt参数为int
调用方法:
通常方式:String.charAt(int);
反射方式:charAt.invoke(String,1);当invoke()的第一个参数为null,说明该Method对象对应的是一个静态方法。
//invoke执行方法
2),用反射方式执行某个类中的main方法
启动Java程序的main方法的参数是一个字符串数组,
即public static void main(String[] args),通过反射方式来调用这个main方法
jdk1.5,整个数组是一个参数,jdk1.4 数组中的每个元素对应一个参数,为了向下兼容,还是采用jdk1.4的方式。
mainMethod.invoke(null,new Object[](new String[]{}));
或mainMethod.invoke(null,(object)new String[]{});
编译器会作特殊处理,编译时不把参数当作数组看待。


10),数组的反射:
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
非基本类型的一维数组,即可以当作Object类型使用也可以当作Object[]类型使用。

Arrays.asList()处理int类型数组和String类型数组的差异。
int用System.out.print()打印的还是地址。而String可以打印对象的属性值。
Array工具类用于完成对数组的反射操作

11),ArrayList和HashSet的 比较以及Hashcode的分析:

Hashcode方法的作用:提高性能。
内存泄露的问题:
当一个对象被存储进hashset集合以后,就不能再修改对象中的那些参与计算哈希算法的那些字段,
否则会造成内存泄露。表面上程序代码在不断增加对象,删除对象,但实际内存中并没有删除,
该对象以后不再用了,可是内存中却一直存在,造成浪费,最终导致内存泄露。
例子:
public static void main(String[] args) {
Set<Person> set = newHashSet<Person>();
Person p1 = new Person("小强",25);
Person p2 = new Person("旺财",26);
Person p3 = new Person("猪猪",27);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3个元素!
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变
set.remove(p3); //此时remove不掉,造成内存泄漏
set.add(p3); //重新添加,居然添加成功
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4个元素!
for (Person person : set)
{
System.out.println(person);
}
}

12),反射的作用——>实现框架功能:

工具类和框架的区别:工具类是被用户所调用,而框架则是调用用户提供的类。
示例演示:
public static void main(String[] args) throws IOException,InstantiationException, IllegalAccessException,ClassNotFoundException {

//模拟一个框架
//定义一个文件字节流来读取文件
FileInputStream ips = newFileInputStream("config.properties");
//定义一个properties对象。
Properties props = new Properties();
//将Properties对象和流想关联
props.load(ips);
//关闭资源
ips.close();
//反射
String className = props.getProperty("className");
Collection coll =(Collection)Class.forName(className).newInstance();
//创建ReflectPoint类对象
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(5,5);
ReflectPoint pt3 = new ReflectPoint(3,3);

//将ReflectPoint类对象添加到Collection集合中
coll.add(pt1);
coll.add(pt2);
coll.add(pt3);
coll.add(pt1);
// System.out.println(pt1 ==pt1);
// System.out.println(pt1.equals(pt1));
// System.out.println(coll.size());

// pt1.y =1;
// coll.remove(pt1);
// coll.add(pt1);
System.out.println(coll.size());
}

8,JavaBean(内省):
1,什么是JavaBean:
JavaBean是一种特殊类,主要用于传递信息,这种Java类中的方法主要用于访问私有的字段,
且方法名符合某种命名规则。
2,JavaBean的属性:
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量,如果方法名
为setId,中文意思即为设置id,至于你把它存储到那个变量上,不用管,如果方法名为getId。中文意思
即为获取id,至于你从那个变量上取,也不用管,去掉set前缀,剩余部分就是属性名,如果剩余部分的
第二个字母是小写,则把剩余部分的首字母改成小写。
例子: setId()的属性名->id
isLast()的的属性名->list
setCPU()->的属性名->CPU
getGPU()->的属性名->GPU

总之:一个类被当作JavaBean使用时,JavaBean的属性是根据方法名判断出来的,它根本看不到Java类
内部的成员变量。

一个符合JavaBean的特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的
好处,我们才会去了解和应用JavaBean。
3,JavaBean的好处:
在JavaEE开发中经常要使用到JavaBean。很多环境要求按JavaBean方式进行操作,别人都这么用和要求
这么做,那你就没什么挑选的余地!

JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省,如果你自己通过getX方法来访问私有
的x,怎么做,有一定难度,用内省这套API操作JavaBean比普通类的方式更方便。



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------