1.类之间的关系:uses-a依赖,has-a聚合,is-a继承。
- uses-a:依赖,一个类的方法操纵另外一个类的对象,尽可能减少,耦合。
- has-a: 聚合,类A的对象包含类B的对象。
- Is-a: 特殊与一般的关系。
2.初始化:程序开始时,main方法进栈,在堆内存中分配空间创建的成员变量,局部变量保存在栈中,注:创建数组则是在堆中,分配空间后默认初始化值。
- 成员变量会初始化,byte,short,int会初始化为0,Long初始化为0L,char会初始化为空格(\u0000),float初始化为0.0f,double为0.0d,boolean为false,引用类型(class,interface,array)为nul。
- 局部变量不会自动地初始化,必须通过调用new或者其他初始化方法。
3.日期类:
- Date类:getDay/getMonth/getYear方法,before/after方法
- GregorianCalendar类(set/get/add方法 getTime()/setTime(time)方法)
- 常用getTime()/setTime(time)方法进行Date和GregorianCalendar的转换,已知年月日要构造Date对象,先创建GregorianCalendar对象,然后调用getTime方法获得一个日期;
GregorianCalendar ca=new GregorianCalendar(year,month,day);
Date da=ca.getTime()
4.获得这个月第一天是星期几
GregorianCalendar d=new GregorianCalendar();
int doday=d.get(Calendar.DAY_OF_MONTH)
int month=d.get(Calendar.MONTH)
d.set(Calendar.DAY_OF_MONTH,1);
int weekday=d.get(Calendar.DAY_OF_WEEK);
//设置不同的时区:在main方法的第一行中添加代码
Locale.setDefault(Locale.ITALY)
5.遍历数组方法
Employee[] staff=new Employee[3];
//方法1
for(Employee e:staff){
e.raiseSalary(5);
}
//方法2
Iterator it = staff.iterator();
while(it.hasNext()){
it.raiseSalary(5);
}
//方法3
for(Iterator it2 = staff.iterator();it2.hasNext();){
it2.raiseSalary(5);
}
//方法4
for(int i=0;i<staff.size();i++){
staff.get(i).raiseSalary(5);
}
6.遍历map的方法
//方法1.要遍历键和值的方法,要求JDK5以上
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
//方法2.只需要键和值的方法
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
//方法3.遍历键和值的方法,同时可以在遍历时删除entries
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
//方法3 不使用泛型
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
7.概念理解
- 有多个类的文件中,以public类的名字作为文件名,在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。编译源代码的时候,会创建多个class文件
- 封装性:不要编写返回引用可变对象的访问器方法。如果需要返回一个可变对象的引用,应该首先对其进行clone,对象clone是指存放在另一个位置上的对象副本。return date.clone();
- final实例域:构建对象时,必须初始化这样的域,并且在后面的操作中,不能再修改(没有set方法);
- 静态域:static,每个类中只有一个这样的域,而每一个对象对于所有实例域都有一份自己的拷贝。都可以操作它。
- 静态常量:例如Math.PI,如果定义的关键字static去掉,Pi就变成了Math类的一个实例域,需要通过Math类的对象访问PI,并且每一个Math类的对象都需要有自己的一份PI拷贝。
- 静态方法:是一种不能向对象实施操作的方法,例如Math.pow(x,a),没有隐式的参数,可以认为静态方法是没有this参数的方法,静态方法不能操作对象,所以不能在静态方法中访问实例域,但是静态方法可以访问自身类中的静态域。可以用类名调用静态方法。
- Static:属于类而不属于类对象的变量和函数,为了表示退出一个块之后依然存在的局部变量。
- Main:每一个类都可以有一个main方法,这是一个常用于对类进行单元测试的技巧。如果小类是大类应用中的一部分,那么执行时不会执行小类的main方法。
- 方法参数:
- 一个方法不能修改一个基本数据类型的参数(数值型和布尔型,局部变了,方法结束没有变)
- 一个方法可以改变一个对象参数的状态(对象.属性改变)
- 一个方法不能让对象参数引用一个新的对象(交换)
- 函数重载:多个函数有相同的名字,不同的参数。返回类型不是函数重载签名的一部分,也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值得方法。
- 如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则构造对象时,如果没有提供参数就会被视为不合法。
- java有自动的垃圾回收器,不需要人工回收内存,所以不支持析构器。如果对象使用了内存之外的资源,例如文件或者系统资源的另一个对象的句柄,当资源不再需要时,要将其回收。
可以为任何一个类添加finalize方法,在垃圾回收器清除对象之前调用。
System.runFinalizersOnExit(true)方法能够确保finalizer方法在java关闭前被调用。不过这个方法并不安全。
代替方法:Runtime.addAhutdownHook添加关闭钩 - 包:如果两个程序员同时建立了Employee类,只要将这些类放置在不同的包中,就不会产生冲突。一个类可以使用所属包中的所有类,以及其他包中的公有类。
- 编译器编译源文件的时候不检查目录结构,即使目录下没有文件,也可以进行编译,如果他不依赖其他包就不会出现编译错误,但是最终的程序也无法运行,因为虚拟机找不到类文件。
- 如果没有指定public或者private,那么这个类/方法/变量就可能被同一个包中所有的方法访问,访问修饰符是default。
- import不仅可以导入类,还增加了导入静态方法和静态域的功能。
import static java.lang.System.*; //就可以使用System类的静态方法和静态域.
out.println();
exit()