类和对象
1、类是构造对象的模板或蓝图,Java编写的所有代码都位于类的内部。
2、对象中的数据称为实例域(instance field),操纵对象的过程称为方法(method)。
3、实现封装的关键在于绝对不能让勒种的方法方位其他类的实例域。程序仅通过对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”的特征,这是提高重用性和可靠性的关键。
4、在扩展一个已有的类时,这个扩展后的信赖具有扩展的类的全部属性和方法。在新类中,只需要提供适用于这个新类的新方法和数据域就可以了。通过扩展一个类来建立另外一个类的过程称为继承(inheritance)。
5、对象的三个主要特性:对象的行为(behavior)(可以对对象施加那些操作,或可以对对象施加那些方法)、对象的状态(state)(当施加那些方法时,对象如何相应?)、对象的标识(identity)(如何辨别具有相同行为与状态的不同对象?)
6、最为一个类的实例,每个对象的标识永远是不同的,状态常常也存在着差异。
7、识别类的简单规则是分析问题的过程中寻找名词,而方法对应着动词。
8、类之间常见的关系有:依赖(“uses-a”)、聚合(“has-a”)、继承(“is-a”)。
9、如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
10、应该尽可能地将相互依赖的类减至最少,让类之间的耦合度最小。
11、Java中使用构造器(constructor)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。构造器的名字应该与类名相同。
12、对象与对象变量之间的区别:
Date deadline; // deadline doesn’t refer to any object.
一个对象变量并没有实际包含一个对象,而仅仅引用了一个对象。
13、GregorianCalendar类用于拜师熟悉的日历表示法。
14、对于实例域做出修改的方法称为更改器方法,仅访问实例域而不进行修改的方法称为访问器方法。在Java中,访问器方法和更改器方法在语法上没有明显的区别。
15、GregorianCalendar类常用方法:
·GregorianCalendar()
构造一个日历对象, 用来表示默认地区、默认时区的当前时间。
·GrogorianCalendar(int year, int month, int day, int hour, int minutes, int seconds)
用指定的日期和时间构造一个Gregorian日历对象。
参数:
year 该日期所在的年份
month 该日期所在的月份, 以0为基准;例如, 0表示一月
day 该月份中的日期
hour 小时(0到23之间)
minutes 分钟(0到59之间)
second 秒(0到59之间)
·int get(int field)
返回给定域的值。
参数:
field 可以是下述选项之一:Calendar.ERA、Calendar.YEAR、Calendar.MONTH、Calendar.WEEK_OF_YEAR、Calendar.WEEK_OF_MONTH、Calendar.DAY_OF_MONTH、Calendar.DAY_OF_YEAR、Calendar.DAY_OF_WEEK、Calendar.DAY_OF_WEEK_IN_MONTH、Calendar.AM_PM、Calendar.HOUR、Calendar.HOUR_OF_DAY、Calendar.MINUTE、Calendar.SECOND、Calendar.MILLISECOND、Calendar.ZONE_OFFSET、Calendar.DAT_OFFSET
·void set(int field, int value)
设置指定域的值。
参数:
field get接收的常量之一
value 新值
·void set(int year, int month, int day)
·void set(int year, int month, int day, int hour, int minutes, int seconds)
将日期与和时间域设置为新值
参数:
year 该日期所在的年份
month 该日期所在的月份, 以0为基准;例如, 0表示一月
day 该月份中的日期
hour 小时(0到23之间)
minutes 分钟(0到59之间)
second 秒(0到59之间)
·void add(int field, int amout)
这是一个可以对日期信息实时算术运算的方法。对给定的时间域增加指定数量的时间。例如,可以通过使用c.add(Calendar.DAY_OF_MONTH, 7),将日历的日期加上7天。
参数:
field 需要修改的域(可以使用get方法文档中给出的一个常量)
amound 域被改变的数量。
·void getFIrstDayOfWeek()
获取当前用户所在地区,一个星期中的第一天。例如:在美国一个星期中的第一天是Calendar.SUNDAY
·void setTime(Date time)
将日期设定为指定的时间点。
参数:
time 时间点
·Date getTime()
获得这个日历对象当前值所表达的时间点。
16、DateFormatSymbols类常用方法:
·String[] getShortWeekdays()
·String[] getShortMonths()
·String[] getWeekdays()
·String[] getMonths()
获得当前地区的星期几或几月份的名称。利用Calendar的星期和月份常量作为数组索引值。
用户自定义类
1、Java中 ,最简单的类的定义形式为:
class ClassName {
field1;
field2;
...
constructor1;
constructor2;
...
method1;
method2;
...
}
2、在一个源文件中只能有一个公有类,但可以有任意数目的非公有类(不包括内部类)。
3、构造器总是伴着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
4、构造器与类同名、每个类可以有一个以上的构造器、构造器可以有0个、1个或多个参数、构造器没有返回值。
5、所有的Java对象都是在堆中构造的。
6、Java方法中包含隐式参数和显式参数,其中显式参数明确地列在方法声明中,隐式参数则是调用方法的对象,不会出现在方法声明中。
7、在方法中,用关键字this表示隐式参数。
8、注意:不要编写返回引用可变对象的访问器方法。如果需要返回,可以对它进行克隆。
9、一个方法可以方位所属类的所有对象的私有数据。
10、可以将实例域定义为final。此时构建对象时,必须初始化这样的域,确保在每个构造器执行之后,这个域的值被设置。
11、如果将域定义为static,则每个类中只有一个这样的域,而每一个对象对于所有的实例域却又自己的一份拷贝。
12、静态方法是一种不能对对象实施操作的方法,没有this参数,不能访问实例域。
13、静态方法不需要使用对象就可以调用,但是也可以使用对象调用静态方法。
14、静态方法可以作为工厂方法,这也是静态方法的常见的用途。
15、每个类都可以有一个main方法,这是一个常用于对类进行单元测试的技巧。
16、按值调用(call by value)表示方法接收的是调用者提供的值;按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。
17、一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
18、Java程序设计语言总是按值调用,也就是说,方法得到的是所有参数值的一个拷贝。
19、方法参数共有两种类型:基本数据类型(数字、布尔值)、对象引用。但基本数据类型和对象引用进行的是值传递。
20、Java参数使用情况:
·一个方法不能修改一个基本数据类型的参数(数值类型、布尔值)
·一个方法可以改变一个对象的参数状态。
·一个方法不能让对象参数引用一个新的对象。
21、如果有多个方法有相同的名字,不同的参数,这种特征叫做重载。
22、要完整第描述一个方法,需要指出方法名称和参数类型,叫做方法签名。
23、默认初始化:如果在构造器中没有显式地赋予处置,那么类中的域就会被自动地赋为默认值:数值为0、布尔值为false、对象引用为null。这是域域局部变量的主要不同点。
24、如果编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器,这个构造器将所有实例域设置为默认值。
25、如果类中提供了至少一个构造器,但是没有提供无参数构造器,则在构造对象是,如果没有提供餐数据就会被视为不合法。
26、方法的参数变量可以将同样名字的实例域屏蔽起来,此时可以采用this关键字来访问实例域。
27、可以使用this关键字代用一个类的另一个构造器,但是不能循环调用。
28、初始化块:可以采用初始化块来初始化类中的域。在构建对象构成中,会首先运行初始化块,然后才运行构造器的主体部分。
29、Java调用构造器的具体处理步骤:
(1) 所有数据域被初始化为默认值。
(2) 按照类声明中出现的次序,依次执行所有域初始化语句和初始化块(先静态)。
(3) 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
(4) 执行这个构造器的主体。
30、如果对类的静态与进行初始化的代码比较复杂,那么可以使用静态的初始化块。
31、由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析够器。
32、可以为任何一个类添加finalize方法,该方法将在垃圾回收器清除对象之前调用。但是不要依赖于finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。
包
1、Java允许使用包(package)将类组织起来。
2、使用import语句导入类。
3、注意:只能使用星号导入一个包,下面的语句是错误的:
import java.util.*.*
4、使用import进行静态导入:
import static java.lang.System.*;
import static java.lang.System.out;
5、用package语句将类放入包中,如果类中没有package语句,那么类将会被放入默认包。
6、编译对文件(带有文件分隔符和扩展名.java文件)进行操作,而java解释器加载类(带有.分隔符)
javac com/mycompany/PayrollApp.java
java com.company.PayrollApp
7、如果没有指定public或private,这个部分(类、方法或变量)可以被同一个包中的所有方法访问。
8、设置类路径:
java -classpath /home/user/classdir; . ; /home/user/archives/archive.jar MyPro
set CLASSPATH = ...
类设计技巧
1、一定要保证数据私有。这是很重要的:绝对不要破坏封装性,有时候,需要编写一个访问器方法或更改器方法,但是最好还是保持实例域的私有性。很多惨痛的经验告诉我们,数据的表示形式可能会改变,但它们的使用方法却不会经常发生变化。当数据保持私有时,它们的表示形式的变化不会对类的使用者产生影响,即使出现bug也易于检测。
2、一定要对数据初始化。Java不对局部变量进行初始化,大师会对对象的实例域进行初始化。最好不要依赖于系统的默认值,而是应该显式地初始化所有的数据,具体的吃实话方式是提供默认值,也可以在所有构造器中设置默认值。
3、不要使用过多的基本类型。就是说,用其他的类代替多个相关的基本类型的使用。这样会使类更加易于理解且易于修改。例如,用一个称为Address的新类替换一个Customer类中的以下实例域:
private String street;
private String city;
private String state;
private int zip;
4、不是所有的域都需要独立的域访问器和域修改器。或许,需要获得雇员的薪金。而一旦构造了雇员的对象,就应该禁止更改雇佣日期、并且在对象中,常常包含一些不希望别人获得或设置的实例域,例如在Address类中,存放州缩写的数组。
5、将职责过多的类进行分解。这样说似乎有点含糊不清,究竟多少算是“过多”?每个人呢的看法不同。但是如果明显地可以将一个复杂的类分解成两个更为简单的类,就应该将其分解。
6、类名和方法名要能搞体现它们的职责。与变量应该有一个能反映其含义的名字一样,类也应该如此。命名类名的良好习惯是采用一个名词、前面有形容词修饰的名词或动名词修饰名词。对于方法来说,习惯是访问器方法用get开头,更改其方法用set开头。