面向对象程序设计(OOP):不必关心对象的具体实现,只要能满足用户的需求即可。
一、类
概念:构造对象的模板或蓝图,而类构造对象的过程称为创建类的实例。
封装:将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。
继承:扩展一个已有的类,这个扩展后的新类具有所扩展的类的全部属性和方法。在新类中,只需提供适用于新类的新方法和数据域就可以了。这种通过扩展一个类来创建新类的过程称为继承。
( 1 ) 构造器:构造器是一种特殊的方法,用来构造并初始化对象。
例如:new Date( );
注:1>任何对象变量并没有实际包含一个对象,而仅仅引用一个对象。
2>在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用,new操作符的返回值也是一个引用。
3>构造器与类同名、
4>所有Java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用。每一个类可以有一个以上的构造器、
构造器可以有0个、1个或多个参数
构造器没有返回值
构造器总是伴随着new操作一起调用
( 2 )Java类库中的日期和时间
类库设计者将保存时间与给时间点命名分开,标准的Java类库分别包含两个类:表示时间点的Date类和日历表示法的GregorianCalendar类。
GregorianCalendar类扩展了一个更加通用的Calendar类,用来描述日历的一般属性。
实际上Date类有getDay、getMonth以及getYear方法,但并不推荐使用。对于日历的信息使用日历类更好。
( 3 )更改器方法和访问器方法:
get方法仅仅查看并返回对象的状态,而set方法却对对象的状态进行修改。对实例域做出修改的方法称为更改器方法,仅访问实例域而不进行修改的方法称为访问器方法。
( 4 )静态方法
静态方法是一种不能向对象实施操作的方法,所以不能再静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。
注:使用静态方法的情况:
1>一个方法不需要访问对象状态,其所需参数都是通过显式参数提供
2>一个方法只需要访问类的静态域。
( 5 )方法参数:共有两种类型:基本数据类型、对象引用
一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不同,可以很容易修改其中的状态。
注:实际上,对象引用进行的是值传递。
总结:1>一个方法不能修改一个基本数据类型的参数。
2>一个方法可以改变一个对象参数的状态。
3>一个方法不能让对象参数引用一个新的对象。
( 6 )对象构造
1>重载:多个方法有相同的名字、不同的参数,便产生了重载。
要完整描述一个方法需要指出方法名以及参数类型,这叫做方法的签名。
2>默认域初始化
如果构造器中没有显式地给域赋予初值,那么就会被自动地赋为默认值。
然而这并不提倡,会影响程序代码的可读性。
3>无参数构造器
注:很多类都包含一个无参数的构造函数,对象由无参数构造函数创建时,其状态会设置为适当的默认值。
a>如果编写一个类时没有编写构造器,那么系统会提供一个无参数的构造器,这个构造器会将所有的实例域设置为默认值。
b>如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会视为不合法。
4>显示域初始化
在执行构造器之前,先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时,这种方式特别有用。class Employee{ private String name = ""; }
5>调用另一个构造器
关键字this引用方法的隐式参数,然而还有另外的含义。
public Employee( double s ){ //调用Employee的另一个构造函数 this("Employee",s); }
6>初始化块
i>初始化数据域的方法:在构造器中设置值、在声明中赋值、使用初始化块。
class Employee{ private int id; //初始化块 { id = 4; } public Employee(int k){ id = k; } }
在构造器构造对象之前先运行初始化块,但这种机制不是必需的,也不常见。
ii>数据初始化步骤:
a>所有数据域被初始化为默认值。
b>按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
c>如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
d>执行这个构造器主体。
iii>静态数据的初始化:
a>提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化。
static{ id = 4; }
在类第一次加载的时候,将会进行静态域的初始化。
7>对象析构与finalize方法
i>有些面向对象的程序设计语言,如c++,有显示的析构器方法,其中放置一些当对象不再使用时需要执行的清理代码。常见操作是回收分配给对象的存储空间。
由于Java有自动垃圾回收器,不需要人工回收内存,所以不支持析构器。
ii>对于某些对象使用了内存之外的其他资源,例如:文件或使用系统资源的另外一个对象的句柄,回收和再利用将显得十分重要。
可以为任何一个类添加finalize方法,在垃圾回收器清除对象之前调用。但是实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,因为很难知道这个方法什么时候才能够调用。
注: a>System.runFinalizersOnExit(true)的方法能够确保finalize方法在Java关闭前被调用,不过并不安全,不鼓励使用。
b>有一种代替的方法使用Runtime.addShutdownHook添加“关闭钩”。
( 7 )包
主要原因:确保类名的唯一性。
1>类的导入:一个类可以使用所属包的所有类,以及其他包的公有类。
i>导入方法:
或者java.util.Date today = new java.util.Date();
注:使用import java.util.*;与import java.util.Date;两者对代码的大小没有任何负面影响。import java.util.*;
当然明确指明所导入的类将会是代码的读者更加明确加载的类。
2>访问修饰符
访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×