本章重点:
- 面向对象程序设计
- 使用现有Java类
- 自定义类
面向对象程序设计
面向对象核心概念:
class
instance(instance fields, method, constructor)
面向对象的三个特征:
- encapsulation
- inheritance
- polymorphism
类之间的关系:
- 依赖(uses-a): 减少类之间耦合。
- 聚合(has-a)
- 继承(is-a)
使用现有类
构造器、new关键字、getter/setter(accessor/mutator method)
自定义类
最简单的类定义形式
class ClassName { constructor1 constructor2 ... method1 method2 ... field1 field2}
多个源文件的使用
Employee.java、EmployeeTest.java。EmpolyeeTest.java依赖Employee.java:javac EmployeeTest.java
即可。
原理:java编译器发现EmployeeTest.java使用了Employee类时会查找Employee.class的文件,如果没有找到这个文件或者Employee.java比Employee.class新,就会自动搜索Employee.java,然后对它编译。
简要剖析java类:
- java访问权限: public、protected、private、default
- java constructor
- 方法的implicit参数和explicit参数(this就是implicit参数)
- private fields && accessor, mutator
基于类的访问权限:方法可以访问所属类的私有特征(包括private fields和private methods)- final
通常final应用于类的primitive or immutable class(不可变类)类型的fields。比如: String就是一个immutable class, 而Date就不是immutable class
static
静态域: private static int nextId = 1;
静态常量: private static final int PI = 3.14;
静态方法: Math.pow(x, a);
静态方法有一个常见的用途:Factory方法
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();NumberFormat percentFormatter = NumberFormat.getPercentInstance();String currency = currencyFormatter.format(0.1);String percent = currencyFormatter.format(0.1);
Factory方法的两个原因:
- 无法命名构造器.
- 当使用构造器时,无法改变所构造的对象类型,而Factory方法可以返回该类的子类实例.
对象构造
- overloading. Java允许重载任何方法,包括构造器.
- 默认构造器. 如果一个类没有一个显式构造器,系统会生成一个默认构造器,所有的实例域会被设置成默认值,最好不要使用默认构造器.
- 域显式初始化.
- 调用另一个构造器(this(...)).
- java可以在三个地方初始化fields:构造器、声明中、初始化块(initialization block).
初始化对象域的步骤:
- 所有数据域被初始化默认值(0, false, null).
- 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块.
- 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体.
- 执行这个构造器的主体.
类设计技巧
- 一定将数据设计为private.
- 一定要对数据初始化.
- 将职能过多的类进行拆分.
- 类名和方法名能够体现它们的职责.
- 1楼遗忘千年
- 说的太绝对了,不过总体讲的还可以,就是有的名词不太习惯(和我当时学习的时候蛮有出入的),个人感觉java的单继承关系有必要在学习力的时候讲一下,毕竟作为面向对象的语言是和c作为对比参照才产生的,应该讲一下和c的继承差别
- Re: nil2inf
- @遗忘千年,有很多名词,有多个同义词,比如: 超类,可以叫父类. 毕竟java之前面向对象已经出来很久了,但是 java规范里面就是 superclass超类。再比如成员变量,在java里面就叫field. 我现在是尽量用java的术语,但是毕竟我是C++出身的,所以很多不时候不自觉会使用C++的术语。其实我是那种使用java挺久的人了,只是想重新深入学习java。所以前面几章,特别是语言特性不会讲的很详尽,作为一个记录了。