黑马程序员_高新技术(一)

来源:互联网 发布:上古卷轴5美女捏脸数据 编辑:程序博客网 时间:2024/05/10 02:30

----------------------------------------------------------------------------- android培训、java培训、期待与您交流! --------------------------------------------------------------------------------

eclipse及IDE开发工具介绍

J2EE  -->  Java 2 Platform Enterprise Edition              java企业级应用程序版本

IDE    -->  Integrated Development Environment      集成开发环境

JMS  -->   Java Message Service                                    Java消息服务

JMX  -->   Java Management Extensions                     Java管理扩展

JNDI -->   Java Naming andDirectory Interface         Java命名和目录接口

 

 

包名:公司的域名反着写。例如:cn.itcast.interview

类名:尽量使用完整的英文单词。

 

在工作间进行配置将会影响其下面所有的工程。一个工作间包含多个工程。

 

eclipse视图管理与程序调试

eclipse中如何查看变量的值?

打个端点,然后点Debug As调试运行,再选中这个变量右键watch,在Debug透视图中即可看见。

视图:每一个小窗口。

透视图:视图的集合。

 

配置eclipse的编译与运行环境

如何设置单个工程的javac与java?

高版本的java能否运行低版本的javac编译的程序? 能。

低版本的java能否运行高版本的javac编译的程序呢?不能。

 

eclipse工作台的所有工程继承工作台的配置,其中某个工程也可以覆盖工作台的配置。这是否也是java面向对象思想的应用。

 

 

静态导入与编译器的语法设置

import语句可以导入一个类或某个包中的所有类。

import static 语句导入一个类中的某个静态方法或所有静态方法。

 

 

可变参数与OverLoad相关面试题分析

overload vs override的区别

重载和重写的区别:

overload:重载,两个参数的个数列表和类型完全一样,就返回一样。

override:重写,如果父类的方法是私有的,那么子类写一个一样的方法,那是否叫重写,是否叫覆盖。不是,这叫一个新方法。

 

 

增强for循环

语法:

for (type变量名:集合变量名) {...}

注意事项:

迭代变量必须在()中定义;

集合变量可以是数组或实现了Iterable接口的集合类

举例:

publicstatic int add(int x, int … args)

{

int sum = x;

for(int arg:args)

{

sum += arg;

}

return sum;

}

 

 

享元模式

享元模式(FlyweightPattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

 

 

枚举的作用介绍

为什么要有枚举?

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

 

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。

私有的构造方法;

每个元素分别用一个公有的静态成员变量表示;

可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。

 

如果想在一个类中编写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。

 

枚举的基本应用

举例:定义一个Weekday的枚举。

扩展:枚举类的values,valueOf,name,toString,ordinal等方法

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

 

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

 

带构造方法的枚举

构造方法必须定义成私有的;

如果有多个构造方法,该如何选择哪个构造方法?

枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

 

带方法的枚举

定义枚举TrafficLamp;

实现普通的next方法;

实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义;

增加上表示时间的构造方法。

 

枚举只有一个成员时,就可以作为一种单例的实现方式。

 

 

反射的基石→Class类

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。

 

对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?

人→Person

Java类→Class

 

对比提问:Person类代表人,它的实例对象就是张三、李四这样一个个具体的人;Class类代表Java类,它的各个实例对象又分别对应什么呢?

对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。

一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?

 

如何得到各个字节码对应的实例对象(Class类型)

类名.class,例如,System.class

对象.getClass(),例如,new Date().getClass()

Class.forName(“类名”),例如,Class.forName("java.util.Date");

 

 

反射

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

例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等也是一个个的类。表示java类的Class类显然要提供一系列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。

 

一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Clss类的方法可以得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。

 

 

Constructor类

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

 

得到某个类所有的构造方法:

例子:Constructor[]  constructors =Class.forName("java.lang.String").getConstructors();

 

得到某一个构造方法:

例子:Constructorconstructor =Class.forName("java.lang.String").getConstructor(StringBuffer.class);

 

创建实例对象:

通常方式:String str= new String(new StringBuffer("abc"));

反射方式:String str= (String)constructor.newinstance(new StringBuffer("abc"));

 

Class.newInstance()方法:

例子:String obj =(String)Class.forName("java.lang.String").newInstance();

该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

该方法内部的具体代码时怎样写的呢?用到了缓存机制来保存某人构造方法的实例对象。

 

Field类

Field类代表某个类中的一个成员变量。

问题:得到的Field对象时对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有对个,如果是与对象关联,那关联的是哪个对象呢?所以字段fieldX代表的是X的定义,而不是具体的X变量。

示例代码:

RefiectPoint point =new ReflectPoint(1,7);

Field Y =Class.forName("cn.itcast.corejava.ReflectPoint").getField("Y");

System.out.println(Y.get(point));

//Field X =Class.forName("cn.itcast.corejava.ReflectPoint").getField("X");

Field X =Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("X");

x.setAccessible(true);

System.out.println(x.get(point));

 

 

Method类

Method类代表某个类中的一个成员方法。

得到类中的某一个方法:

例子:Mehtod charAt=Class.forName("java.lang.String").getMethod("charAt",int.class);

 

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式:System.out.println(charAt.invoke(str,1));

如果传递给Method对象的invoke()方法的一个参数为null,这有什么样的意义呢?说明该Method对象对应的是一个静态方法!

 

JDK1.4和JDK1.5的invoke方法的区别:

JDK1.5:public Object invoke(Object obj,Object… args)

JDK1.4: public Object invoke(Object obj, Object[] args),即按JDK1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用JDK1.4改写为charAt.invoke("str,new Object[]{1}形式。

 

 

用反射方式执行某个类中的main方法

目标:

写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。

问题:

启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按JDK1.5的语法,整个数组是一个参数,而按JDK1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?JDK1.5肯定要兼容JDK1.4的语法,会按JDK1.4的语法进行处理,即把数组打散称为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[] {"XXX"}),javac只把它当做JDK1.4的语法进行理解,而不把它当做JDK1.5的语法解释,因为会出现参数类型不对的问题。

解决办法:

mainMethod.invoke(null,newObject[]{new String[]{"XXX"}});

mainMethod.invoke(null,(Object)new String[]{"XXX"});,编译器会作特殊处理,编译时不把参数当做数组看待,也就不会数组打散成若干个参数了。

 

 

数组的反射

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。

基本类型的一维诶数组可以被当作Object类型使用,不能当作Object[]类型使用,非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。

 

 

反射的作用→实现框架功能

框架与框架要解决的核心问题

我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入到我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

 

框架要解决的核心问题

我在写框架(房子)时,你用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?

因为在写程序时无法知道要被调用的类名,所以在程序中无法直接new某个类的实例对象,这就需要用反射方式来做。

 

综合案例

先直接用new语句创建ArrayList和HashSet的实例对象,演示用eclipse自动生成ReflectPoint类的equals和hashcode方法,比较两个集合的运行结果差异。

然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象,比较观察运行结果差异。

 

 

内省→了解JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规范。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setld,中文意思即为设置id,至于将它存到哪个变量上,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

setId()的属性名→id

isLast()的属性名→last

setCPU的属性名是什么?→CUP

getUPS的属性名是什么?→UPS

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

 

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:

在JavaEE开发中,经常要使用JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地。

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

----------------------------------------------------------------------------- android培训、java培训、期待与您交流!--------------------------------------------------------------------------------
详细请查看:http://edu.csdn.net/heima/

原创粉丝点击