对象与类
- 类
构造对象的模板或蓝图
封装(数据隐藏)
-
实例域
对象中的数据
-
方法
操纵数据的过程
- 对象
- 类之间的关系
-
依赖(uses-a)
一个类的方法操纵另一个类的对象
-
聚合(has-a)
一个对象包含另一个对象
继承(is -a)
-
对象与对象变量
对象与对象变量的关系是:对象变量引用了一个对象。在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用。由此可见,
new
操作符的返回值是新创建对象的引用。 -
更改器方法和访问器方法
对实例域做出修改的方法称为更改器方法
仅访问实例域不修改实例域的方法称为访问器方法
-
用户自定义类
在一个源文件中,只能有一个公有类,可以有多个非公有类。
-
隐式参数与显式参数
objectName.methodName(params);
隐式参数:objectName(方法名前的对象名称)。在每个方法中,关键字
this
表示隐式参数显式参数:params(方法名后括号里的参数)
-
私有方法
一般方法都是公有的,但是在一个类中,可能将一个计算代码划分成若干个独立的辅助方法,这些方法不应该成为公有接口的一部分,最好将这部分方法设计为私有的。
私有方法可以很方便的别删除,因为除了本身类的方法依赖于它外,其它类不会使用这些私有方法。
-
final实例域
构建对象时,必须对final实例域进行初始化。
-
静态域
用
static
修饰的域。也被称为类域,每个类中,静态域的名称是唯一的。类的所有实例共享该类的静态域
静态域可以直接通过ClassName.fieldName(类名.域名)访问;没有被
static
修饰的域,只能通过类的对象来访问。 -
静态常量
用
static final
修饰的域。 -
静态方法
用
static
修饰的方法,不能向对象实施操作的方法,正因不能操作对象,所以静态方法无法访问实例域,但是可以访问自身类中的静态域。下列两种情况下使用静态方法:
一个方法不需要访问对象状态,其所需参数全部通过显示参数提供
一个方法只需要访问类的静态域
-
工厂方法
静态方法的一种常见的用途。类使用工厂方法产生不同风格的对象。
使用工厂方法是因为构造器无法做到以下两单:
- 无法命名构造器。构造器名称需要与类名相同,无法通过不同的名称来构造两个实例。
- 当使用构造器时,无法改变所构造的对象类型。使用工厂方法,可以返回该类的不同子类实例。
-
main方法
main方法是一个静态方法,不需要通过对象来调用。所以程序通过main方法来创建程序所需的对象
-
方法参数
按值调用: 方法接收的是调用者提供的值
按引用调用: 方法接收的是调用者提供的变量地址
java采用按值调用
因此:
一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)【只有为基本数据类型参数赋值方法返回值】;
一个方法可以改变一个对象参数的状态。【调用者调用方法,传给方法的对象参数是对象的引用,方法复制对象的引用,并使用新的对象参数对对象进行操作】
一个方法不能让对象参数引用新的对象。【(同1)只能:方法返回新对象,调用者对对象参数重新赋值。】
-
对象构造
重载,重载解析
在构造器中,使用
this(params1,params2)
来调用另一个构造函数 -
默认域初始化
域:属于类的参数
域应该在对象的构造方法中进行初始化,如果在构造器中没有显式的对域进行赋值,那么就会自动地赋予默认值(数值为0,布尔为false,对象为null)
-
初始化块
对象初始化块
class Employee { private static int nextId; private int id; private String name; private double salary; // 对象初始化块 { id = nextId; nextId++; } public Employee(String n, double s){ name = n; salary = s; } public Employee(){ name = ""; salary = 0; } . . . }
初始化块会在构造类的对象时自动执行。
建议将初始化块放在域定义之后
静态初始化块
对静态域进行初始化
private static int nextId = 1
static { Random generator = new Random(); nextId = generator.nextInt(10000); }
-
包
使用包的主要原因是确保类名的唯一性
-
类的导入
一个类可以使用所属包的所有类和其它包的公共类
通过
import
导入一个包或者特定的类import java.util.*;//导入java.util包的所有类 import java.sql.Date;//导入java.sql包的Date类
只能用星号导入一个包
-
静态导入
使用
import static
来导入一个类的静态方法和静态域 -
将类放入包中
将包名放在源文件的开头,定义类的代码之前
package xxx.xxx.xxx;
如果没有在源文件中放置
package
语句,这个源文件中的类就被放置在默认包中,默认包是一个没有名字的包。将包中的文件放在与完整的包名所匹配的子目录中。
-
包的作用域
public
:可以被任意类使用private
:可以被定义它们的类使用如果没有访问修饰符,则这个部分可以被同一个包中的所有方法访问