Java编程思想读书笔记第五章: 初始化和清理

方法的重载

  • 重载方法可以通过参数列表进行区分,包括参数的类型,数量不同,如下所示
void driver(int i);
void driver(short i);
void dirver(int i, short i);
  • 参数类型为基本类型,如果形参类型小于实参,形参类型将会被提升,反之形参需要强转成比实参小的类型,如下所示, 调用short方法,i需要被强转,j则变成了short类型
void driver(short prams);

int  i= 5;
driver((short)i);
byte j = 0;
driver(j);
  • 返回值不一样,不能区分重载方法,如果我们按照下面这么调用,编译器根本不知道你调用的是哪个方法。
void f();
int f();

f();


this关键字的用法

  • 在方法中可以调用当前的类的成员变量或者方法,不过一般不建议这么使用
this.a = 10;
this.f();
  • 在方法返回值中被使用,表示返回当前对象引用,可以对同一个对象执行多次操作,如Rxjava中的流式调用
public Car {
    Car driver() {
        prinf("dirver");
        return this;
    }
    
    Car stop() {
        printf("stop");
        return this;
    }
}

Car car = new Car();
car.driver().stop();
  • 构造器调用构造器,如果类中有多个构造器可以使用this调用其他构造器,只能在构造器中使用,并且只能调用一个构造器
public Car {
    public car() {
        this(5);
    }
    
    public car(int i) {
        print(i);
    }
}
  • 不要过于使用this关键字,比如在一个类中,调用类一个方法中调用另外一个方法,因为编译器能帮你自动添加,只有当明确指出当前对象的引用时,才使用this关键字。
public class A {
  void f() {
    this.p();//不要这么用
    p(); //推荐
  }
  void p() {

  }
}


成员初始化

  • 可以在定义成员变量处就为其指定初始值,基本变量会被默认赋予初值,比如
public Car {
    int i = 5;
    People people = new People();
}
  • 构造器初始化, 比如
public Car {
    int i;
    public Car() {
    }
}
  • 调用顺序,先指定初始化,后构造函数初始化,如果指定了初值后,后构造器被调用,则值会被覆盖,比如,i 先被赋值5, 后调用构造器,i变成了10
public Car {
    int i = 5;
    public Car() {
        i = 10;
    }
}


静态数据初始化

  • 静态数据可以通过上述两种方法初始化,只要类被加载,就会被初始化,比如调用Car.j, 这时i,j, people 都会被初始化,如果不访问Car类,数据就永远不会被初始化
public Car {
    public static int j = 20;
    public static int i = 10;
    staic People pleple = new People();
}
  • 静态数据只会被初始化一次,比如按照如下方法进行调用,输出分别是10和11,可以看出即使new了一个新的Car对象,也不会再去对i重新赋值了
class Car {
    public static int i = 10;
    public void add() {
        i++;
    }
}

Car car1 = new Car();
print(Car.i);
car1.add();
Car car2 = new Car();
print(Car.i);

//output 10, 11


对象创建过程

  • 首先会加载Car.class文件,有关静态变量都会被初始化。
  • new Car()对象,在堆上分配足够的内存空间,并且清空这块存储空间,所有的基本类型都会被赋初值,比如int会被赋值为0。
  • 执行所有变量指定初始化动作,也是在字段定义处。
  • 执行构造函数。
class Car {
    public static int i = 10;
    int j = 20;
    public car() {
        printf("init");
    }
}

Car car = new Car()


显示静态初始化

  • 可以使用static {}构建静态代码块,可以里理解成由多个静态初始化动作组成。需要注意的是在静态代码块中不论是调用变量还是方法都必须是静态的。
  • 静态代码块仅执行一次,执行时机是在首次访问该类的时候,如new一个对象,访问该类的成员变量。
public class Spoone
{
    static i;
    staic {
      i = 10;
      f();
    }
    public static f() {
      System.out.println(i);
    }
}

Spoone.i;
Spoone s = new Spoone();

非静态实例初始化

  • 用一个{}构建非静态实例代码块,当对象被new时就会被调用,在构造函数之前被调用,无论调用哪个构造函数都会调用该代码块
class Mug {
  {
    print("f(" + marker + ")");
  }
}

数组初始化

  • 数组的两种初始化方式 , 第一种方式只能定义在声明数组变量的地方。第二种形式可以定义在任何地方。
int[] a = {1,2,3,5};
Integer[] b = new Integer[5]; 
  • 可变参数,调用时可以传递任意数量参数(包括0),使用方式如下, 注意如果如果出现方法重载,当不传入任何参数时,让人很难弄清楚到底调用的是哪个函数,代码可读性就变得很差,所以最好在某个方法中添加一个非可变参数作为区分。
void f (String... args) {
}

void f() {
}

f("1","2","3");

你可能感兴趣的:(Java编程思想读书笔记第五章: 初始化和清理)