一、前言

关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高。接口中、常量、静态方法等等。但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来。下面,对这两个关键字的常见用法做点总结记录,方便之后的回顾以及突击知识点。

二、关键字 final

final,一如字面意思 “最终的”,大体在 Java 中表示 “不可变的”。可用来修饰类、方法、方法参数以及变量。

1、修饰类

final 在修饰类的时候,代表的是此类不能被继承。也就是说如果一个类确定不会被继承使用,则可以设计成 final类型的。典型的例子就是 String 类。

2、修饰方法

final 修饰的方法,能被继承,但是不能重写。可以重载。

3、修饰方法参数

final 在修饰方法参数的时候,表示的是在执行方法的内部,不能够去改变参数的值。但是如果是引用对象,是可以改变应用对象的属性值。

4、修饰变量

final 在修饰变量,代表的是不可变,也即是常说的 “常量”。 final 在修饰的时候,允许一次赋值,之后在生命周期类,不允许对其进行修改。

修饰变量存在两种情况:基本类型的数据 和  对象数据。在修饰基本类型数据的时候,值是不可变的。在修饰对象数据的是,对象的引用是不可改变的,但是,可以修改对象内部的属性值。

final 修饰的变量必须在使用前进行初始化,一种方式是在声明的时候就给出默认值。还有一种就是通过构造方法去设置。

5、代码示例

package com.cfang;

import java.util.Calendar;

import lombok.Data;

import lombok.extern.slf4j.Slf4j;

@Slf4jpublic classT3 {public static voidmain(String[] args) {//-- 修饰变量

final int b = 0;/**

* 编译报错:The final local variable b cannot be assigned. It must be blank and not using a compound assignment*/

//b = 2;//-- 修饰方法参数

DemoCls cls = newDemoCls();

cls.setAge(10);

log.info("democls age : {}", cls.getAge());int a = 10;

sayHello(a, cls);

log.info("after call sayHello, democls age : {}", cls.getAge());

}private static void sayHello(final inta, final DemoCls cls) {/**

* 编译报错:The final local variable a cannot be assigned. It must be blank and not using a compound assignment*/

//a = 11;//cls = new DemoCls();

cls.setAge(11);

}

}

@DataclassDemoCls{private intage;

}//-- 修饰方法

@Slf4jclassPerson {public final voidsaySth() {

log.info("i am person");

}

}

@Slf4jclassMale extends Person{/**

* 编译出错 : Cannot override the final method from Person

* 修饰的方法不能够被重写*/

//public final void saySth() {//log.info("i am male");//}

public final voidsaySth(String msg) {

log.info("i am male");

}

}

其中,修饰方法参数,如果是引用对象,是可以改变对象的属性值,这一点也很好理解:cls 是引用变量,final 修饰引用变量,只是限定了此引用变量 cls 的引用不能改变,而实际引用的对象的本身的值是可以进行修改的。文字语言组织可能不是很清晰,如下图所示,一目了然的就知道说要表述的意思了。

三、关键字 static

static,静态的。在 Java 中,static 通常可被用于修饰 变量、方法以及代码块。

1、修饰变量

static 修饰的变量,叫做静态变量。static 变量被所有类对象共享,在内存中仅一份,随着类的初始化而被加载。与之对应的非静态变量,是属于每个实例对象本身,内存中存在多份,相互间不影响。

2、修饰方法

static 修饰的方法,叫做静态方法。调用静态方法,不依赖于实例对象就可以进行访问,所以,静态方法是没有 this的。由于此特性以及非静态方法依赖于实例对象调用,所以静态方法中是不能够直接使用非静态的成员属性和方法。与之相反的是,非静态方法是可以直接访问使用静态成员变量和方法。同样的,静态方法也是没有 super 的。可以一句话总结下:由于 static 和具体的实例对象无关,而 this、super和具体的实例对象息息相关,所以,static 和 this、super 势如水火,一如白天与黑夜。

3、修饰代码块

static 修饰代码块,在类初始化加载的时候,会按照 static 块的顺序进行加载,并且,生命周期内,只加载一次。基于此特性,可以设计优化程序的性能,一些只需要一次性初始化加载的内容,就可以放在 static 块中进行。

4、代码示例

package com.cfang;

import lombok.extern.slf4j.Slf4j;

@Slf4jpublic classT4 {private static inta;private static intb;private static intc;static{

log.info("init value a");

a= 10;

}

{/**

* 普通代码块,依赖于实例对象*/log.info("init value c");

c= 12;

}public static voidmain(String[] args) {//-- 静态方法调用非静态

/**

* 不可直接访问*/

//sayHello1();

newT4().sayHello1();//-- 静态方法直接调用

sayHello();//-- 静态代码块初始化资源

log.info("value a : {}", a);

log.info("value b : {}", b);

log.info("value c : {}", c);

}private static voidsayHello() {

log.info("say hello");

}private voidsayHello1() {

log.info("say hello1");//-- 非静态方法直接调用

sayHello();

}static{

log.info("init value b");

b= 11;

}

}

5、static 常见误区

package com.cfang;

import lombok.Data;

import lombok.extern.slf4j.Slf4j;

@Slf4jpublic classT5 {private static int a = 10;public static voidmain(String[] args) {newT5().printVal();//-- The field DemoCls01.b is not visible

DemoCls01.b;

}private voidprintVal() {int a = 11;

log.info("value a : {}", this.a);

}

}

@DataclassDemoCls01{private static intb;

}

5.1、static 的 this

上述代码中,最终运行 printVal 方法,输出的结果是 :value a : 10  。 其实这也很好理解: this 指代的当前对象,而通过 new T5().printVal() 调用的话,this 指代的就是当前新创建的实例对象,static 修饰的变量本身是被所有类对象所共享的,而 printVal 方法中 a 属于局部变量,跟 this 实例对象并没有关联。所以,输出的就是 10。

5.2、static 与 可见性

static 并不能改变变量或者方法的可见性。上述代码中,main 方法中,DemoCls01.b 会编译报错。

5.3、static 与 局部变量

Java规范中,明确说明了 :static 关键字不可修饰局部变量。

四、总结

final 和 static ,联合使用修饰属性表示一旦给值,就不可修改,并且可以通过类名访问;修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。

突然想到,接口 interface 中,成员变量的默认修饰符为 public static final,方法的默认修饰符 public abstract 。

java final static_Java基础之final、static关键字相关推荐

  1. Java基础篇:static关键字

    目录: 一.静态类与非静态类: 二.静态方法与非静态方法: 三.静态变量与非静态变量的区别: 四.静态代码块与非静态代码块: 五.静态构造函数与非静态构造函数: 六.相关问题: Java中的stati ...

  2. Java入门到精通——基础篇之static关键字

    一.概述        static 关键字是声明静态变量,静态方法用的.static的含义是属于类且不属于类对象的变量和函数. 二.static的产生.         在创建对象的时候除非用new ...

  3. java 静态代码块 作用域_java static关键字和代码块

    static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑使用static关键字 static概述: 多个对象共享同一份数据 static ...

  4. Java实习面试基础题-Final理解总结

    积土成山,风雨兴焉:积水成渊,蛟龙生焉:积善成德,而神明自得,圣心备焉.故不积跬步,无以至千里,不积小流无以成江海.齐骥一跃,不能十步,驽马十驾,功不在舍.面对悬崖峭壁,一百年也看不出一条裂缝来,但用 ...

  5. java关键字static_Java中的static关键字

    java关键字static static keyword in Java is used a lot in java programming. Java static keyword is used ...

  6. java面试题6 牛客:哪个关键字可以对对象加互斥锁?

    哪个关键字可以对对象加互斥锁?() A synchronized B volatile C serialize D static synchronized的4种用法 1.方法声明时使用,放在范围操作符 ...

  7. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  8. 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字

    文章目录 1.关键字:static 1.1.static的使用 1.2.类变量 vs 实例变量内存解析 1.3.自定义 ArrayUtil工具类的优化 1.4.static 的应用举例 1.5.练习 ...

  9. 面向小姐姐的编程——java面向对象之final、static关键字

    文章目录 final关键字 final的概念 final的作用 修饰类: 修饰变量: 总结 代码示例 static关键字 static的概念 static的作用 调用方式 static修饰成员变量 特点: ...

最新文章

  1. R语言应用实战-基于R的C4.5算法和C5.0算法原理解析及应用案例
  2. 计时器StopWatch示例
  3. 面向.NET开发人员的Dapr——目录
  4. 第一部分----HTML的基本结构与基本标签
  5. liunx中常用命令 -大数据
  6. windows实用软件
  7. 一次HBase问题的解决过程(Status: INCONSISTENT)
  8. django:自动生成接口文档
  9. 【wav音频解析】之wavread函数的C++实现
  10. linux performance test
  11. 技术团队管理经验总结(持续更新)
  12. 《建筑工程定额与预算》
  13. php 处理png图片白色背景色改为透明色
  14. python名片管理系统难点总结_Python学习笔记之名片管理系统
  15. Linux 基础实战(二)
  16. log+android+bp,第二章:Android.bp语法
  17. 模拟Android内存不足 activity回收 值保存 状态恢复
  18. The long goodbye 漫长的告别 | 经济学人中英双语对照精读笔记
  19. 新零售全能商城多商户拼团砍价秒杀周期购分销论坛投票收银台点餐外卖小程序公众号
  20. vb.net 如何实现报表打印_如何实现流水条码的特殊排版打印

热门文章

  1. Spring Boot2 整合 Shiro ,两种方式全总结!
  2. flowable 多实例动态添加人
  3. eclipse项目导入idea部署到tomcat
  4. 在新项目中使用 Vue3 使用总结
  5. Leetcode 206.反转链表(双指针迭代法和递归操作)
  6. linux服务器监控zabbix,Linux监控之--使用ZABBIX监控web服务器
  7. GPUImage – 色阶 GPUImageLevelsFilter
  8. Python min 函数 - Python零基础入门教程
  9. Python 函数声明和调用 - Python零基础入门教程
  10. 包机制、阿里巴巴开发手册