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;
    }

调用构造器具体步骤

  1. 所有数据域都被初始化
  2. 按声明顺序依次执行初始化块
  3. 执行构造器,如果在一个构造器中调用了第二个构造器,那么就去执行第二个构造器主体
  4. 执行完第二个构造器主体则接着执行第一个构造器主体

 

封装

将类内部的实例域设为private,外部不可访问,然后提供Getter和Setter方法来访问与修改

需要注意的是在Getter函数中,若是返回一个可变的对象,需要在Getter中clone再返回,不然私有域会被修改破坏封装性

    public Date getWorkDate(){
        //clone得到对象副本,将副本返回,避免被修改
        return (Date)workDate.clone(); }

如果直接return workDate;那么外部就能引用同一个对象,直接跳过setter对private进行修改

 

注意事项

1.构造器不应该写与类的实例域的同名局部变量,有同名参数会直接报错

没有同名参数时会覆盖类中的实例域,导致逻辑错误

    public Employee() {
        //覆盖了实例域,导致逻辑错误
        int salary=100;
    }