Java对象与类
java文件
通常一个java文件只会有一个类,但是有多个类也是允许的
只是public修饰的公共类要与java文件名相同,但是编译的结果也是每个类会有一个.class文件(包括内部类A与外部类Test)
类组成
实例域与方法域
static静态域:
final域:
方法参数
隐式参数:调用该方法的实例对象,在方法中this表示隐式参数
显式参数:方法括号里的参数
构造器
public修饰,名字与class名相同,如果没有写则会有一个默认的无参构造器,当写了构造器就不会有这个默认的无参构造器而需自己添加
默认域初始化
实例域如果定义时未赋值,且在构造器中未被初始化,那么就会自动地将其赋予默认值(数值型变量->0,布尔型->false,对象引用->null)
在一个构造器中调用另一个构造器
public Employee(){ } public Employee(int salary,Date workDate){ //调用无参构造器 this(); this.salary=salary; this.workDate=workDate; }
初始化块
当只要调用构造器时,就会按顺序执行代码块
{ this.salary=100; }
调用构造器具体步骤
- 所有数据域都被初始化
- 按声明顺序依次执行初始化块
- 执行构造器,如果在一个构造器中调用了第二个构造器,那么就去执行第二个构造器主体
- 执行完第二个构造器主体则接着执行第一个构造器主体
封装
将类内部的实例域设为private,外部不可访问,然后提供Getter和Setter方法来访问与修改
需要注意的是在Getter函数中,若是返回一个可变的对象,需要在Getter中clone再返回,不然私有域会被修改破坏封装性
public Date getWorkDate(){
//clone得到对象副本,将副本返回,避免被修改
return (Date)workDate.clone();
}
如果直接return workDate;那么外部就能引用同一个对象,直接跳过setter对private进行修改
注意事项
1.构造器不应该写与类的实例域的同名局部变量,有同名参数会直接报错
没有同名参数时会覆盖类中的实例域,导致逻辑错误
public Employee() { //覆盖了实例域,导致逻辑错误 int salary=100; }