乐趣区

笔记java-in-a-Nutshell-2

类定义中,有 4 种常见的成员
类字段、类方法
实例字段、实例方法

5 种常见的引用类型:class, interface, array, enumerated, annotation

public class Integer extends Number implements Serializable, Comparable {// class members go here}

abstract class 抽象类,

无法被实例化
任何包含一个抽象方法的类都必须是抽象类

final class
该类无法被继承(扩展)
一个类无法同时声明为 abstract 和 final

volatile 表示类中字段,可能被多个线程同时调用,读取必须从主存到主存,不能从 cpu 缓存中读取

一般,类中 static field 都和 final 一起使用,用于定义常量

类字段:
可以当作全局变量
没有必要赋予初始化值,编译器将会给定初始值(如果没有初始值)

类方法:
可以看成是全局方法
可以使用同一个类中任意的类字段和类方法,或者其他类中的类方法和类字段
无法使用类中的实例字段和实例方法

实例字段:
是面向对象编程的关键,保存着对象的状态信息,用于区别不同的对象
没有必要赋予初始化值,编译器将会给定初始值(如果没有初始值)

实例方法:
可以使用所有同一个对象实例的字段
可以使用类字段、类方法
对象可以看作是一组状态(通过实例字段)和在此状态下的一组行为(通过实例方法)的集合

this:
通常情况下,不需要显示声明 this(当引用对象实例中的成员)
当本地变量或者实例方法中的变量名称和类字段相同时候,需要使用 this

类构造函数:
任意类都至少有一个构造函数,用于创建对象后,进行对象初始化
如果源码中没有定义构造函数,javac 编译器将创建一个默认的构造函数(没有传参,也没有特殊初始化)

有关名称、声明、编写构造函数:

  1. 名称总是和类名称相同;
  2. 声明中没有返回值类型
  3. 内部为初始化对象实例代码,相当于构造 this 引用的属性
  4. 没有返回值

定义多个构造函数类似于重载方法
构造函数中可以使用 this,调用该类中的其他构造函数

类字段初始化 vs 实例字段初始化

  1. 类字段初始化

javac 编译器自动生成一个类初始化方法
类字段将在该初始化方法中真正初始化
通常在类首次调用之前(类第一次加载到 jvm 中),调用类初始化方法
也可以自定义一些类初始化块,它们将会合并到类初始化方法中(自动生成)

// We can draw the outline of a circle using trigonometric functions
// Trigonometry is slow, though, so we precompute a bunch of values
public class TrigCircle {
  // Here are our static lookup tables and their own initializers
  private static final int NUMPTS = 500;
  private static double sines[] = new double[NUMPTS];
  private static double cosines[] = new double[NUMPTS];

  // Here's a static initializer that fills in the arrays
  static {
    double x = 0.0;
    double delta_x = (Circle.PI/2)/(NUMPTS-1);
    for(int i = 0, x = 0.0; i < NUMPTS; i++, x += delta_x) {sines[i] = Math.sin(x);
      cosines[i] = Math.cos(x);
    }
  }
  // The rest of the class is omitted...
}
  1. 实例字段初始化

java 编译器将自动生成字段的初始化代码,并且将之加入构造函数中
按照实例字段出现的顺序先后,将实例字段添加到构造函数中
如果构造函数 1 通过 this 调用构造函数 2,构造函数 2 中才会实际处理初始化字段

public class SampleClass {
  public int len = 10;
  public int[] table = new int[len];

  public SampleClass() {for(int i = 0; i < len; i++) table[i] = i;
  }

  // The rest of the class is omitted...
}
public SampleClass() {
  len = 10;
  table = new int[len];
  for(int i = 0; i < len; i++) table[i] = i;
}

子类和继承:

退出移动版