final:

  1. 修饰类:类不能被继承
  2. 修饰方法:方法不能被重写
  3. 修饰变量:不能修改变量的指向,且只能赋值一次
    1. 全局变量是有默认值的,所以如果用final修饰全局变量,能在定义的同时赋值,或在构造函数中赋值(注意,其他方法不能给final全局变量赋值,会报错)
    2. 局部变量不会默认赋值,因此如果用final修饰,可以初始化一次
    3. 注意:final变量是不能修改指向(即地址),但不代表不能改值,引用类型的话是可以改值的

代码:

1.赋值问题

final变量可以在构造函数内赋值,这个特性可能会使人疑惑。

因为全局变量是会默认赋值的,并且这个赋值操作是先于构造函数执行的,

所以可以在构造函数中赋值看起来似乎是不可能的。

但这确实是可以的,但也只能是构造函数,其他方法并不行。

这是因为Java有一个“空白final”的东西,"空白final"指的是被申明final但未给初值的域。

此外,Java还规定空白final在使用之前必须初始化。

二者兼和,就出现了上面所说的特殊情况

eg.

class  Test{

    final int m =3;//,正常初始化,并赋值为3,不存在“空白final”

    final int  n; //正常初始化,并初始化为“空白final”

    Test(){

        n = 3; // “空白final”被赋值为3

    }

    /*

     * 注意,在非构造方法内给”空白final“赋值是非法的

     *  final int error ;

     *  void show(){

     *      error = 3; 这是会报错的            

     *   }

}
2.改值问题

calss Test1{

    final int m =3; //基本数据类型,m里面存放的是常量3的地址,所以m的值是无法改变的

    final Test2 test2;

    Test1(){

        test = new Test2();

        test.m = 4; //合法

        test.n = 8; //合法

        test  = new Test2();//不合法,test不能指向新的地址

    }

}

class Test2{

    int m = 3;

    int n= 6;

}

static 方法


“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”

  • static在对象存在前就存在(不是类存在前)
  • static不能访问非静态方法和变量,反之可以
  • static方法无法使用this,应为不存在对象

static变量


  • static成员变量的初始化顺序按照定义的顺序进行初始化。

  • 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化

static代码块


static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

优化前,每次创建两个对象

class Person{
private Date birthDate; public Person(Date birthDate) {
this.birthDate = birthDate;
} boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}

优化后,只需创建一个

class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
} public Person(Date birthDate) {
this.birthDate = birthDate;
} boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}

注意:

 class staticTest{
static int a=47; } staticTest t1 = new staticTest();
staticTest t2 = new staticTest(); t1和t2是一个对象,不是两个

static final

  • java中的常量
  • 变量名全部大写()
  • 必须在申明的同时赋值
  • 由类名.访问
  • 在编译时自动替换,效率高
  • 不可改变
public static final double PI = 3.1415926;

java final static的更多相关文章

  1. Java final static关键字

    Java中的final关键字 使用 final 关键字做标识有 “最终的” 含义. final 可以修饰 类.方法.属性.变量 final 修饰类: 则该类不允许被继承 final 修饰方法:则该方法 ...

  2. Java final static abstract关键字介绍

    一,抽象类:abstract 1,只要有一个或一个以上抽象方法的类,必须用abstract声明为抽象类; 2,抽象类中可以有具体的实现方法; 3,抽象类中可以没有抽象方法; 4,抽象类中的抽象方法必须 ...

  3. Java final,static 关键字

    final关键字: 这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.final方法不能被子类 ...

  4. java final .static修饰符

    static静态修饰符(使用static修饰符修饰的成员变量.常量.和成员方法成为静态变量.常量和方法,他们统称为静态成员,归整个类所有,不依赖于类的特定实例,被类的所有实例共享,只要这个类被加载,J ...

  5. java final static 和final区别

    static 和非static 之间的差异,只有当值在运行期间初始化的前提下,这种差异才会揭示出来.因为编译期间的值被编译器认为是相 同的. package thinking; public clas ...

  6. java修饰符public final static abstract transient

    JAVA 修饰符public final static abstract transient  关键字: public final static abstract ...  1.public prot ...

  7. java中static特殊性和final(static成员直接被访问,this不能用在static方法中,static不可访问非static)

    java的static关键字 java中,static修饰的成员变量和成员方法叫静态变量和静态方法,不依赖类特定的实例,被类的所有实例共享. 静态变量或类变量 和 实例变量,区别是: 静态变量在内存中 ...

  8. JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac

    记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...

  9. Java中static、final、static final的区别(转)+transient

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

随机推荐

  1. flutter -icons

    icon 合集 https://material.io/tools/icons/?icon=account_balance&style=baseline

  2. Python并发编程之线程池&进程池

    引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  3. Scrum Meeting 合集

    一.Alpha [Alpha]Scrum meeting 1 [Alpha]Scrum meeting 2 [Alpha]Scrum meeting 3 [Alpha]Scrum meeting 4 ...

  4. node全局安装说明(create-react-app、)

    1.使用 create-react-app 快速构建 React 开发环境 国内使用 npm 速度很慢,你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm: $ np ...

  5. 将项目添加到服务上时报web modules的错误

    将项目添加到服务上时报web modules的错误如下图: 这是tomcat的版本和web modules的版本不支持造成的,如果在如下地方修改不了: 这时候就要在项目的根目录修改如下图: 用工具打开 ...

  6. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

  7. Cordova开箱注意事项

    在进行cd 目录切换的时候 一定要 注意大小写 不然 node_modules 下的依赖包 会报错 区分大小写 Cordova 在打包的时候报错 一般是版本或sdk问题 cordova 的版本要和co ...

  8. 安装与配置apache WEB服务器(Linux环境)

    Linux环境下安装一个软件的方式多数为两种: 1.通过命令从远程源下载自动默认安装 2.编译安装 第一种较为简单,直接通过 yum 或者 apt-get 直接安装即可,但是对我来说,编译安装可能更加 ...

  9. 目标指定法——S.M.A.R.T.

    一个有效的目标一定要是 具体的(Specific), 可测量的(Measureable), 可实现的(Attainable), 有现实意义的(Realistic), 以及有明确期限的(Time-bas ...

  10. 人生苦短,我用Python——博客目录

    计算机基础 计算机硬件基础知识 操作系统基础 Python基础 Windows环境下Python2和Python3的安装 交互式环境与变量的使用 简单介绍Python基本数据类型及程序交互 基本运算符 ...