Posted: 十一月 22, 2011 at 1:21 下午 | Tags: ArrayList, Java, Java集合, LinkedList, 学习笔记 0
1.对于Java中的常量的命名规则:所有单词的字母都是大写,如果有多个单词,那么使用下划线连接即可。比如说:
public static final int AGE_OF_PERSON = 20;
2.在Java中声明final常量时通常都会加上static关键字,这样对象的每个实例都会访问唯一一份常量值。
3.Java集合:
ArrayList实现类中方法:
- add(): 加入数据类型。
- get(index):返回一个Object。
- size():相当于数组当中的length,检索长度。
- clear():清除元素中的所有数据
- isEmpty():判断是否为空。
- remove(index):删除元素。
- indexOf(numberof):判断某个对象的索引在第几个位置上。
- toArray():转换成一个数组。
注:集合中只能放对象,不能放原生数据类型。
4.集合中存放的依然是对象的引用而不是对象本身。
5.ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的object类型数组。
6.如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新的素组当中。当新素组无法容纳增加的元素时,重复该过程。
7.对于 ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。
8.集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加到集合当中。
9.集合当中放置的都是object类型,因此取出来的也是object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。
Continue Reading
Posted: 十一月 19, 2011 at 2:11 下午 | Tags: Java, 学习笔记, 数组 0
1.包装类(wrapper class)。针对于原生数据类型的包装。所有的包装类(8个)都位于java.lang包下。Java中的8个包装类分别是:
Byte,short,Integer,long,float,Double,Character,Boolean.他们的使用方式都是一样的,可以实现原生数据类型与包装类型的双向转换。
2.数组(Array):相同类型数据的集合就叫数组。
3.如何定义数组:type[] 变量名 = new type[数组长度];可以按照下列方式定义长度为10的数组:
int[] a = new int[10];或者int a[] = new int[2];
4.数组中的元素索引是从0开始的。对于数组来说,最大索引== 数组的长度 – 1。
5.定义数组的第3中方式:type[] 变量名 = new type[]{逗号分隔的初始化值列表}; 或:int[] a = {1,2,3,4,5,6,7,8};
6.Java中的每个数组都有一个名为length的属性,它表示数组的长度。length属性是public ,final ,int 的。数组长度一旦确定就不能改变大小。
7.int[] a = new int[10],其中a是一个引用,它指向了生成的数组对象的首地址,数组中每个元素都是int类型,其中仅存放数据值本身。
8.二维数组:二维数组是一种平面的二维结构,本质上是数组的数组。二维数组的定义方式:type[][] a = new type[2][3];
9.三维数组。type[][][] a = new type[2][3][4];
Posted: 十一月 17, 2011 at 6:46 上午 | Tags: Java, 单例模式, 设计模式 0
单例模式(Singleton Pattern)
前面说提到的五种创建模式,主要解决的问题是如何创建对象,获得产品。而单例模式最要关心的则是对象创建的次数以及何时被创建。
Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图)。但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论、涉及到多个类加载器(ClassLoader)协同时、涉及到跨JVM(集群、远程EJB等)时、涉及到单例对象被销毁后重建等。对于复杂的情况,本章中会涉及到其中一些
目的:
希望对象只创建一个实例,并且提供一个全局的访问点。
场景:
Kerrigan对于Zerg来说是个至关重要的灵魂人物,无数的Drone、Zergling、Hydralisk……可以被创造、被牺牲,但是Kerrigan得存在关系到Zerg在这局游戏中的生存,而且Kerrigan是不允许被多次创造的,必须有且只有一个虫族刀锋女王的实例存在,这不是游戏规则,但这是个政治问题。
分析:
如前面一样,我们还是尝试使用代码来描述访问Kerrigan的过程,看看下面的UML图,简单得我都不怎么好意思放上来占版面。

图6.1 单例模式的UML图
Continue Reading
Posted: 十一月 17, 2011 at 3:09 上午 | Tags: Java, 学习笔记, 抽象类, 接口 0
1.接口中所声明的方法都是抽象方法。接口中的方法都是public的。
2.接口中也可以定义成员变量。接口中的成员变量都是public,final,static的。
3.一个类不能即是final,,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,这样abstract希望该类可以被继承而final明确说明该类不能被继承,两者矛盾。因此一个类不能即是final的,又是abstract的。
4. Desing Pattern(设计模式)。单例模式(Singleton):表示一个类只会生成唯一的一个对象。
5.包(package)。用于将完成不同功能的类分门别类,放在不同的目录(包)下。包的命名规则:将公司域名反转作为包名,对于包名:每个字母都需要小写。如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package)。
6.编译带有package声明的java源文件有两种方式:
一.直接编译,然后根据类中所定义的包名,逐一手工建立目录结构,最后将生成的class文件放到该目录结构中。
二.使用编译参数 -d,方式为:javac -d .源文件.java,这样在编译后,编译器会自动帮助我们建立好包所对应的目录结构。
三.执行通过java 目录.class文件。
7.有两个包名,分别是aa.bb.cc与aa.bb.cc.dd,那么我们称后者为前者的子包。
8.导入(import),将使用package分离的各个类导入回来,让编译器能够找到所需要的类。
9.import的语法:import com.csssea.PackageTest;
10.import con.csssea.* ,表示导入com.csssea包下面的所有类。
11.import aa.bb.* 并不会导入aa.bb.cc包下面的类。这时需要这样写:
import aa.bb.*;
import aa.bb.cc.*;
12.关于package,import,class的顺序问题:
一.首先需要定义包(package),可选。
二.接下来使用import进行导入,可选。
三.然后才是class或interface的定义。
13.如果两个类在同一个包下面,那么则不需要导入,直接使用即可。
14.访问修饰符(access modifier)。
1) public(公共的):被public所修饰的属性和方法可以被所有类访问。
2)protected(受保护的):被protected所修饰的属性和方法可以在类内部,相同包以及该类的子类访问。
3) private(私有的):被private所修饰的属性和方法只能在该类内部使用。
4)默认的(不加任何访问修饰符):在类内部以及相同包下面的类所使用。
Continue Reading
Posted: 八月 8, 2011 at 10:38 上午 | Tags: Java, polymorphism, 多态 4
第十季 面向对象之多态(polymorphism)
- 多态:我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的对象。
- Parent p = new Child();当使用多态调用方法时,首先检查父类中是否有sing()方法,如果没有则编译出错,如果有,再去调用哪个子类的sing()方法。
- 一共有两种类型的强制类型转换:
a) 向上类型转换(upcast):比如说:将Cat类型转换成Animal类型,将子类型转换为父类型。对于向上类型转换,不需要显式
b) 向下类型转换(downcast):比如说将Animal类型转换成Cat类型,即将类型转换为子类型,对于向下类型转换,必须要显示指定(必须要使用强制类型转换)。
- instanceof运算符
instanceof运算符的作用:在强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功地转换,从而保证代码更加健壮。
例如:
Object hello = “疯狂的鱼”;
If(object instanceof String)
{
System.out.println(“类型符合”);
}
- 抽象类(abstract class):
使用abstract关键字所修饰的类叫做抽象类。抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例)。
- 抽象方法(abstract method):
使用abstract关键字说修饰的方法叫做抽象方法。抽象方法需要定义在抽象类中定义。相对于抽象方法,之前说定义的方法叫做具体方法(有声明,有实现)。
- 如果一个类包含了抽象方法,那么这个类一定是抽象类。
- 如果某个类是抽象类,那么该类可以包含具体的方法(有声明,有实现)。
- 如果一个类中包含了抽象方法,那么这个类一定要声明成abstract class ,也就是说,该类一定是一个抽象类;反之,如果某个类是抽象类,那么该类既可以包含抽象方法,也可以包含具体方法。
10.无论何种情况,只要一个类是抽象类,那么这个类就无法实例化。
11.在子类继承父类(父类是个抽象类)的情况下,那么该子类必须要实现父类中所定义的所有抽象方法;否则,该子类需要声明一个abstract class。
Posted: 八月 6, 2011 at 7:31 上午 | Tags: Java, 继承 01
第九季 面向对象之继承(inheritence)
- 继承:表示父子关系,Java是单继承的,它表示一个类只能从另一个类继承(被继承的类叫做父类(基类base class)继承的类叫做子类),Java中的继承使用extends关键字。
- 当生成子类对象时,Java默认首先调用父类的不带参数的构造方法。然后执行该构造方法,然后生成父类对象,接下来,再去调用子类的构造方法,生成子类的对象。(要想生成子类的对象,首先需要生成父类的对象,没有父类对象就没有子类对象,比如说:没有父亲,就没有孩子)。
- super关键字:super表示对父类对象的引用。this 表示对当前自己对象的引用。
- 如果子类使用super()显示调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法,而不会再去寻找父类的布袋参数的构造方法。与this 一样,super也必须要作为构造方法的第一条执行语句,前面不能有其他可执行语句。
- 关于继承的3点:
a) 父类有的,子类也有。
b) 父类没有的,子类可以增加。
c) 父类有的,子类可以改变。
- 关于继承的注意事项
a) 构造方法不能被继承
b) 方法和属性可以被继承
c) 子类的构造方法隐式地调用父类的不带参数的构造方法。
d) 当父类没有不带参数构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用,super关键字必须是构造方法中的第一行语句。
7.方法重写(override):又叫做覆写,子类与父类的方法返回类型一样,方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。
8.方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。
9.当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run() 方法,其中super.run()不比放在第一行语句,因此此时对象已经构造完毕,先调用父类的run() 方法还是先调用子类的run()方法是根据程序的逻辑决定的。
10. 在定义一个类的时候,如果没有显示指定该类的父类,那么该类就会继承于Java.lang.Object类(JDK提供的一个类,object类是Java中所有类的直接和间接父类)。
Posted: 八月 5, 2011 at 3:09 上午 | Tags: Java, 封装 0
第八季 面向对象之封装 二
- 类中的属性又叫做成员变量(member ariable),属性用英文表示为property或者attribute。
- 对象(object)又叫做实例(instance),生成一个对象的过程又叫做类的实例化。
- 命令约定
a) 类:首字母大写,如果一个类名由多个单词构成,那么每个单词的首字母都大写,而且中间不使用任何的连接符,比如:Person类,MemberTest类。
b) 方法:首字母小写。如果一个方法由多个单词构成,那么第一个单词的所有字母全都小写,从第二个单词开始,每个单词的手写字母大写。比如:add,addThreeInt。
c) 属性:命令约定与方法相同。比如说:age,ageOfPerson。
4.属性需要定义在类中,又叫做成员变量;而定义在方法中的变量叫做局部变量。
5. 如何定义属性?
public class Person
{
修饰符 类型 属性名称;
}
如何使用属性? 与方法一样,使用.运算符。首先需要生成类的实例,然后使用实例+“.”的方式来使用属性。
比如:
Person person = new person();
person.age;
6. 局部变量(定义在方法中的变量)使用前必须要声明并赋初值。成员变量使用前必须要声明,但可以不赋初值。
7. 成员变量与局部变量的联系与区别:
a) 无论是成员变量还是局部变量,使用前都需要声明(定义)。
b) 对于局部变量来说,使用前必须要初始化,对于成员变量来说,使用前可以不初始化。如果没有初始化成员变量就开始使用,那么每个类型的成员变量都有一个默认的初始值。
1) byte , short ,int long 类型的初始值为 0 ;
2) float,double 类型的初始值为0.0
3) char类型的初始值 ‘\u0000’
4) Boolean 类型的初始值为 false
8.引用类型(reference type):引用类型是用在对象上的。一个对象可以被多个引用所指向,但同一时刻,每个引用只能指向唯一的一个对象,如果一个对象被多个应用所指向。那么无论哪个引用对象的属性进行了修改,都会反映到其他的引用当中。
Continue Reading
New Comments