个人博客Faye’s Blog
一、面向对象概述
1.基础概念
对象中的数据称为实例域,操纵数据的过程称为方法。每个特定的对象都有一组特定的实例域值,这些值的集合称为该对象的状态。
2.封装
从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。
关键在于决不能让类中的方法直接访问其他类的实例域,程序仅通过对象的方法与对象数据进行交互。封装给对象赋予”黑盒“特征,提高了重用性和可用性。
3.对象
- 对象的行为
- 对象的状态
- 对象标识
4.类之间的关系
-
依赖(”usa-a“)
A类的方法操纵B类的对象,则称A类依赖B类
-
聚合(”has-a“)
A类的对象包含B类的对象,则称聚合
-
继承(“is-a”)
表示一般与特殊关系
5.一个对象变量并没有实际包含一个对象,而是应用了一个对象
6.隐式参数和显式参数
People p = new People();
p.say("hello");
-
方法名前的对象p就是隐式参数,括号中的是显式参数。
-
关键字
this
表示隐式参数
7.访问器方法
不要编写返回引用可变对象的访问器方法,否则就破坏了封装性。可以先对它进行克隆(clone)
public Date getHireDay(){
return (Date)hireDay.clone();
}
8.final实例域
- 大多应用于基本类型域或不可变内的域
- final关键字只是表示存储在变量中的对象引用不会再指示其他对象,但该对象可更改
二、静态域与静态方法
1.静态域
若将域定义为static,每个类中只有一个这样的域。每个对象对于所有实例域都有一份拷贝,但共享一个静态域。
静态域属于类,而不是某个独立的对象
2.静态方法
静态方法不能向对象实施操作,没有隐式参数,但可以访问自身类的静态域。
在下面两种情况下使用静态方法:
-
方法不需要访问对象状态,其所需参数均由显式参数提供
-
方法只需要访问类的静态域
-
工厂方法
使用静态工厂方法构造对象,原因主要有:
- 无法命名构造器,构造器的名字必须与类名相同
- 当使用构造器时,无法改变所构造的对象类型
三、方法参数
1.参数传递
-
Java总是采用按值调用。
-
方法不能修改一个基本数据类型的参数。因为方法得到的是参数值的一个拷贝
-
方法可以修改一个对象的状态。因为以对象引用为参数,方法得到的是对象引用的拷贝,但该拷贝引用同一个对象。
-
方法不能让对象参数引用一个新的对象,因为方法修改的是拷贝。
四、对象构造
1.重载(overloading)
方法签名:方法名及参数类型,不包括返回类型。
多个方法的方法名相同,参数类型(类型、个数、顺序)不同,即为重载。
2.默认域初始化
若未在构造器中显式给域赋予初值,就会自动赋为默认值。(0,false,null)(不推荐)
3.显式域初始化
可以在类定义中,直接将一个值赋给任何域。在执行构造器前,先执行赋值操作。(适用于一个类的所有构造器都希望把相同的值赋给摸个特定的实例域)(初始值不一定是常量值,可以调用方法)
4.无参构造器
若一个类没有编写构造器,则系统会提供一个无参构造器,将所有实例域设为默认值。
5.调用另一个构造器
若构造器的第一个语句形如this(...)
,这个构造器将调用该类对应的构造器。
6.初始化块
只要构造对象,这些快就会被执行。(不常见)
7.调用构造器具体处理步骤:
1.所有数据域被初始化为默认值
2.按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
3.若构造器第一行调用了第二个构造器,则执行第二个构造器
4.执行这个构造器主体
8.在内第一次加载时,就会进行静态域的初始化
五、类设计技巧
1.一定要保证数据私有
不要破坏封装性
2.一定要对数据进行初始化
3.不要在类中使用过多的基本类型
用其他的类代替多个相关的基本类型的使用
4.不是所有的域都需要独立的域访问器和域更改器
5.将职责过多的类进行分解
6.类名和方法名要能够体现其职责
7.优先使用不可变类