final

final关键字做标识有“最终的”含义。

1.数据
final属性:该类的属性不会进行隐式地初始化。
在定义处 或者 在构造方法中对final进行赋值 (但二者只能选其一)

final变量:该变量只能赋值一次,声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。

  • 对于基本类型,final 使数值不变;
  • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
  1. final int x = 1;
  2. // x = 2; // cannot assign value to final variable 'x'
  3. class Point{
  4. public int x;
  5. public int y;
  6. public Point(int x,int y){
  7. this.x=x;
  8. this.y=y;
  9. }
  10. }
  11. final Point p = new Point(1,2);
  12. p.x=3;p.y=4;
  13. // p = new Point(3,4); // 不能引用其他对象,会抛出异常

final参数:无法在方法中更改参数引用所指向的对象。
这一特性主要用来向匿名内部类传递数据

  1. // void f(final int i){i++;} // Can't change
  2. // You can only read from a final primitive
  3. int g(final int i){return i+1;}
  4. // f()和g()展示了当基本类型的参数被指明为final时所出现的结果:你可以读参数,但却无法修改参数
  1. class Point{
  2. private int x;
  3. private int y;
  4. public Point(int x,int y){
  5. this.x=x;
  6. this.y=y;
  7. }
  8. public Point(final Point p){
  9. p.x=3;
  10. p.y=4;
  11. // p = new Point(1,1); 这个是不允许的,不允许修改它的引用,可以修改里面的值
  12. }
  13. }

2.方法
声明方法不能被子类重写
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。

  1. class A{
  2. private void test(int a){
  3. System.out.println(a);
  4. }
  5. }
  6. public class B extends A {
  7. public void test(int a){
  8. System.out.println(a+1);
  9. }
  10. public static void main(String[] args){
  11. B f = new B();
  12. f.test(2);
  13. }
  14. }

3. 类
声明类不允许被继承

static

static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!
①静态成员(类变量)
属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!

②静态方法(类方法)
静态方法中可以直接调用静态成员,但不能直接调用非静态成员,需通过创建类的对象,再通过对象访问非静态变量。
静态方法中不能直接调用非静态方法,需通过对象来访问非静态方法。
普通成员方法中可以直接访问同类的非静态方法和静态方法。

③静态初始块
静态初始块只在类加载时执行,且只会执行一次,同时静态初始块只能给静态变量赋值,不能初始化普通成员变量。
程序运行时,最先被运行的是静态初始块,再普通初始块,最后才是构造方法。

④静态内部类

  1. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
  2. 静态内部类可以直接访问外部类用final修饰的常量
  3. 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
  4. 创建静态内部类的对象时,不需要外部类的对象,在外部类中可以直接创建 内部类 对象名= new 内部类(); ,在外部类之外可以用 外部类.内部类 对象名= new 外部类.内部类();

⑤静态导包
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。

  1. import static com.xxx.ClassName.*

this

对象创建的过程和this的本质

构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。
创建一个对象分为如下四步:

  1. 分配对象空间,并将对象成员变量初始化为0或空
  2. 执行属性值的显示初始化
  3. 执行构造方法
  4. 返回对象的地址给相关的变量

this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

this最常的用法:
1. 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
3. this不能用于static方法中。