黑马程序员 基础加强与项目1

来源:互联网 发布:关于网络语言暴力 编辑:程序博客网 时间:2024/05/06 22:00

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

ecplise介绍

结束javaw就能结束eclipse

Ideintegrity development environment 继承开发环境 开发工具

Netbeen

使用工程化方式管理一个项目的程序开发,一个独立的项目就是一个工程,多个java文件

Javacompiler 编译器

Javaee

Interview

一个工作间包含多个工程,影响工作间下面的所有工程

Content assist内容助理,修改快捷键

可以直接输入alt+/查找 解除关系

不同的透视图

Perspective和view

调试时右键变量点watch,可以看到它的值

 

设置当个工程的javac和java

Javacomplier

Badversion number in .class file

运行环境是5.0,编译器用的是6.0

Javac的版本不能高于java的版本

 

Surroundwith try/catch block 生成代码,有个模板

Templates模板

$(ling_selection)原来的内容

Cursor光标停留位置

 

静态导入

Import导入一个类或者某个包中的所有类,不影响资源

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

需求:使用求两个数的最大值和相减结果的绝对值进行举例

Math.max(3,6)

选中alt+/ 出现syso

Math.abs()绝对值

静态导入,想省略类名

importstatic java.lang.Math.max;

importstatic java.lang.Math.*;

导入Math的所有静态方法

1.5以后才有的

 

可变参数

一个方法接受的参数个数不固定

 

可变参数的特点

“…”只能出现在参数列表的最后

位于变量类型和变量名之间,前后有无空格都可以

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数

 

 

面试题

Overload与override的区别

重载,重写

父类中的私有方法,子类可以同名方法

接口和抽象类是子类必须实现父类的抽象方法

 

For循环增强

For(type变量名:集合变量名){}

注意事项

迭代器必须在()定义

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

 

Java规范文档

 

---PIC0000for循环增强,可以在类型前面加上修饰符

集合必须实现Iterable接口

Hashmap,hashset不能随便放,要么放入iterator,要么实现iterable接口

 

自动装箱

使用自动装箱,如果在一个字节内-128~127之间的数字,会缓存到缓存池中,与String一样

---PIC0001i1和i2相等

享元模式 flyweight

Integrity中有两个i,将i提取成一个对象,并用x,y参数指定i出现的位置

i.display(intx,int y)

i{char,x,y}原来的话要传入i的值,现在将x,y变为参数传入,变成外部的状态

 

大的整数重复的可能性比较小,所以就不用享元模式

 

不用创建太多个char类型

文件夹图标

 

享元模式 解释

很多个小的对象,有很多属性相同,把他们封装成一个对象,不同的属性变成方法的参数,称为外部状态,内部的属性称为内部的状态

 

Integeri3 = Integer.valueOf(3)

Integeri4 = Integer.valueOf(3)

I3和i4也相等

 

枚举

定义一个新的类型,用这个类型赋的值必须是事前定义好的值,如果不是,则编译不能通过

 

定义一个新的类型 按这个类型定义的变量指向的值只能是固定一些值

 

私有化构造函数 使其不能创建对象

 

Publicfinal static WeekDay

Final和static谁在前面都可以

---PIC0003创建了静态的最终的WeekDay 变量,指向了一个新的WeekDay对象

用普通的JAVA类来实现枚举,所用的值只能是规定的那么几个。

值是对象类型的值

每个枚举都是一个对象

先创建一般类,比如WeekDay,在里面定义字段值,定义toString方法。

---PIC0000创建了抽象的方法,那么类也抽象,类里面就不能创建本类对象。

用匿名内部类实现类的子类

 

NextDay方法都放入匿名内部类中,让其子类去实现,将大量的if.else语句转成了一个个独立的类

 

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

 

为什么要有枚举

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

 

用普通类实现枚举

     1,私有的构造方法

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

     3,可以有若干公有方法或抽象方法,例,提供nextDay方法必须是抽象,采用抽象方法定义nextDay就将大量的if.else语句转成了一个个独立的类。

 

枚举的基本应用

方法

      Ordinal()返回值类型int  返回枚举常量的序数

getClass()

静态方法

1,WeekDay.valueOf(“SUN”);

当传入字符串后,得到WeekDay对象,

2,values() WeekDay[] 获取所有的元素

 

为枚举建立构造方法

     构造方法要位于元素列表之后,所有的信息都要位于元素列表之后

     如果元素列表之后没有东西可以不写 ;

     如果元素列表之后有东西,则必须写;

 

构造方法必须是私有的

 

只要创建了一个枚举类对象,枚举类中的所有元素列表都会被初始化,调用构造函数

 

在元素列表,元素后面加上括号指定参数列表 SUN(1)

 

外部类只能被public和default修饰,protect是修饰方法的。

 

元素列表中的每个元素都是这个类的实例对象

 

写了一个交通灯类,每个元素列表中的元素都是一个单独的内部类

 

一个普通类在创建对象时,传入参数,调用对应的构造函数

内部类在定义时,定义参数,就调用了父类的构造函数

 

在这个内部类中time对象不用创建就能使用,因为它

 

外部类在创建对象时,如果是调用的同级目录下的java文件,那么不用导包,如果是创建内部类对象,则需要导包,外部类.内部类名

 

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

 

枚举,创建enum方法,写出元素列表,抽象方法,在元素后复写抽象方法

 

反射

反射的基石—Class类

关键字class 小写的

Class是类名

 

Java的类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,属性的具体内容由实例来确定,不同的实例对象有不同的属性值。Class类是用于描述各个java类

 

Class描述了类名,类的访问属性,所属的包名,字段名称的列表、方法名称列表。

 

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

 

Class代表字节码

首先将代码编译成二进制储存到计算机上,将二进制文件加载到内存中来才能用这个文件创建对象

 

获取Class对象

1,类名.class,  System.class

2,类名对象.getClass()   new Date().getClass()

3,Class中的静态方法forName 参数String,类路径Class.forName(“java.util.Date”)

先去找到文件,加载到内存,然后返回字节码对象

前两种已经加载到了内存中,最后一种之前没有加载如内存

 

void 也有Class    void.class

 

isPrimitive(),Boolean 判断是否是基本类型的字节码

 

Integer.Type Integer的字段,代表包装的类型字节码

 

判断是否是数组类型的Class实体对象

Class.isArray()

 

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

 

反射

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

 

Method 代表方法,是方法的类

类中的方法,就是Method类的实例

Field代表成员变量

Constructor代表构造方法

Package代表包

 

Constructor类

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

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

Constructorconstructors[] = Class.forName(“java.lang.String”).getConstructors();

得到某一个构造方法:

Constructorconstructor = class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

 

获取构造函数,1.5以后 可变参数 Class<?>…parameterTypes

 

Int.class是要代表int类型,因为int不能作为单独的标识存在

 

 

可以通过构造方法获取实体对象

通过getConstructor获取对应的构造器

Constructorconstructor1 = String.class.getConstructor(StringBuffer.class)

通过构造器获取实例对象

(Stirng)Constructor1.newInstance(newStringBuffer(“abc”));

获取的对象实例需要强转Constructor对应所有的对象,返回值类型是Object

 

获得方法时要用到类型

获得的方法是要用到上面相同类型的实例对象

 

Class---constructor---newobject

Class的newInsane就是省略了找空参constructor的过程

 

Class.newInstance()

Stringobj = (String)class.forName(“java.lang.String”).newInstance();

=====================================

 

 

Field

getField方法的参数是String类型,变量的名字

getField得到的不是变量的值,只是指向那个变量,代表那个变量

为什么get(Objec) 因为getField指向所有对象的那个变量,每个变量的那个值不同,所以要规定对象

比如不管用三种方式中的哪种方式拿到Class对象,获取变量,可以用Field的get方法获取另一个对象的变量值

获取不可见的,所有的

getDeclaredField()

能够得到Field对象,但是不能访问和设置

需要通过Field的方法来实现访问设置,暴力反射

Field的setAccessible(true)

 

作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容的”b”改成”a”

 

获取对象中所有方法,成员,既是是后期加入的也可以

 

getType()获取字段的类型

 

 

equals一般用于两个对象之间的比较

==号则用于一个对象与已经已知的比较??

可以批量修改

=====================================

Method

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

getMethod(String,Class) 传入字符串,方法名,Class传入类型

Method类汇总的invoke(对象,参数) 调用方法

getMethod(String,Class)和invoke(Object,实参)

Class可以写null,代表没有参数,Object可以写空代表静态方法

 

1.5可变参数,invoke里面可以传入多个参数,1.4只能传入一个数组

1.5中也可使用1.4的传入数组,因为要向下兼容

NewObject[]{new String(“abc”),new Integer()}

jdk1.4 Invoke(str1,new Object[]{2});

 

================================

 

 

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

因为前期并不知道后期要传入什么文件,所以要用反射的方式来完成

 

String的数组传入类型可以写成String[].class

Main方法接受一个参数,字符串数组

JDK1.5以后,会将数组视为Object数组,得到参数后会将数组打开,数组中的每个元素都视为一个参数

 

用Object数组打包String数组

Object[]arr =new Object[]{new String[]{"ewf","gew"}};

系统自会拆一次包,传入的就变成一个String数组

只能用Object封装?? NewString[]

如果函数传入的是数组对象,那么都要用上面的方法实现

Object[] arr = (Object)new String[]{"ewf","gew"};

 

Jdk1.5只会对数组进行拆解,对Object对象应该不会拆解??

 

=====================================

数组的反射

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

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

 

数组类型不同,用==号,编译时期就出错、

System.out.println(a3.getClass()== a4.getClass())

上面放到1.6以后的编译器会报错,如果写成下面的就不会

Class a = a3.getClass();

Class b = a4.getClass();

System.out.println(a==b);

 

数组的Class.getName  [I 数组 整数

Class能调用getSuperclass得到父类的Class

Al.getClass().getSupercalss().getName()

一维二维数组的父类都是Object

 

A1一维int数组,a3二维数组 a4一维字符串数组

Objectobj1 = a1; 将整个int数组看成一个obj,

Objectobj2 = a4;

Object[]obj3 = a1;

Object[]obj4 = a3;  一一个Object数组接受一个二维数组,每一个一维数组中的元素是一个数组,父类是Object

Object[]obj5 = a4;  字符串类型父类也是Object

数组[] []中是填写数组长度

Arrays对数组进行操作 将数组转成list

AsList方法

Aslist在1.4的时候传入的参数的Object,不能传入int数组,

到1.5以后引入了泛型,可以传入int类型的数组

Aslist() 如果传入的String类型的数组,那么存入到集合中的就是字符串值,如果传入的是int数组,那么集合中存在的就是数组变量,数组变量指向这个int数组。

但是所有的数组传入集合中,集合都不能进行添加动作

 

 

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