天天看点

黑马程序员_高新技术(1)知识点

---------------------- 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;

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){

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集合以后,就不能再修改对象中的那些参与计算哈希算法的那些字段,

否则会造成内存泄露。表面上程序代码在不断增加对象,删除对象,但实际内存中并没有删除,

该对象以后不再用了,可是内存中却一直存在,造成浪费,最终导致内存泄露。

例子:

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);

// 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比普通类的方式更方便。