Java关键字我们接触的也都不少了,就以这篇文章收录下一些特殊使用的关键字,作为深入学习的记录。

一、修饰变量的关键字

1.transient
  将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。
https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc

2.volatile
当一个变量定义为 volatile 之后,将具备两种特性:
  (1)保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。
  (2)禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。
  
https://www.cnblogs.com/dolphin0520/p/3920373.html
https://www.cnblogs.com/zhengbin/p/5654805.html

二、修饰方法的关键字

1.synchronized
(1)修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;

public void method()
{synchronized(this) {// todo}
}

(2)修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;

public synchronized void method()
{// todo
}

(3)修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;

public synchronized static void method() {// todo
}

(4)修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。

class ClassName {public void method() {synchronized(ClassName.class) {// todo}}
}

注意:
上面说到的“这个类的所有对象”其实指的就是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁。

总结:
(1)无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
(2)每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
(3)实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

2.native
  native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。
  一个native方法就是一个Java调用非Java代码的接口。在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。

Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI(Java Native Interface)接口调用其他语言来实现对底层的访问。

JNI 调用C流程图:

3.strictfp
  Java2新增的关键字。strictfp的意思是FP-strict,strict float point (精确浮点),也就是说精确浮点的意思。
  strictfp 关键字可应用于类、接口或方法;但是不允许对接口中的方法以及构造函数声明strictfp关键字。
  在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。

public strictfp class MyClass{}
public strictfp double add(float a, double b){}

4.abstract
可用于修饰类或方法,表示抽象类和抽象方法。
(1)抽象方法
1)抽象方法跟普通方法是有区别的,它没有自己的主体(没有{}包起来的
业务逻辑),跟接口中的方法有点类似。所以我们没法直接调用抽象方法。
2)抽象方法不能用private修饰,因为抽象方法必须被子类实现(覆写),而private权限对于子类来说是不能访问的,所以就会产生矛盾。
3)抽象方法也不能用static修饰,试想一下,如果用static修饰了,那么我们可以直接通过类名调用,而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了。

(2)抽象类
1)用abstract关键字来表达的类,其表达形式为:(public)abstract class 类名{}
2)抽象类不能被实例化,也就是说我们没法直接new 一个抽象类。抽象类本身就代表了一个类型,无法确定为一个具体的对象,所以不能实例化就合乎情理了,只能有它的继承类实例化。
3)抽象类虽然不能被实例化,但有自己的构造方法(这个后面再讨论)
4)抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池。
5)抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承,而对于抽象类来说就是需要通过继承去实现抽象方法,这又会产生矛盾。

(3)抽象类与抽象方法的关联
1)如果一个类中至少有一个抽象方法,那么这个类一定是抽象类,但反之则不然。也就是说一个抽象类中可以没有抽象方法。这样做的目的是为了此类不能被实例化。
2)如果一个类继承了一个抽象类,那么它必须全部覆写抽象类中的抽象方法,当然也可以不全部覆写,如果不覆写全部抽象方法则这个子类也必须是抽象类(这样做就无意义了)

疑问1:为什么抽象方法不能实例化却有构造器呢?
  我们知道调用子类对象的时候,会优先调用父类的构造方法初始化,因为抽象类在有抽象方法的时候,抽象方法的实现是由子类继承并重写来实现的,若抽象类没有构造器,那就也就没有继承实现这一说了。
疑问2:抽象类中的非静态和非抽象方法中的this关键字指的是什么?
  指的是派生类,而并非抽象类本身,因为抽象类本身不能实例化。如果有多个继承类,谁调用this就代表谁。

三、公共的(即能修饰变量,也能修饰方法)

1.public
  对任何人都是可用的。

2.private
  除类型创建者和类型的内部方法之外的任何人都不能访问的元素。

3.protected
  继承的类可以访问以及和private一样的权限。

4.static
  static表示“全局”或者“静态”的意思,用来修饰成员变量成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
  被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内一定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象
  用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。 static变量前可以有private修饰,private是访问权限限定,表示这个变量可以在这个唯一类的静态代码块中,或者这个唯一类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。static表示不要实例化就可以使用。

5.final
final关键字可以用来修饰引用、方法和类。
(1)用来修饰一个引用
  1) 如果引用为基本数据类型,则该引用为常量,该值无法修改;
  2)如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  3)如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
(2)用来修饰一个方法
  当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)用来修饰类
  当用final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。

6.synthetic
  编译器通过生成一些在源代码中不存在的synthetic方法和类的方式,实现了对private级别的字段和类的访问,从而绕开了语言限制,这可以算是一种trick。
  在实际生产和应用中,基本不存在程序员需要考虑synthetic的地方。
在此提一个的常见的存在synthetic的案例:
  如果同时用到了Enum和switch,如先定义一个enum枚举,然后用switch遍历这个枚举,java编译器会偷偷生成一个synthetic的数组,数组内容是enum的实例。

Java中修饰变量和方法的关键字总结分析相关推荐

  1. java中私有变量和方法_Java 私有变量和私有方法

    作者: Jakob Jenkov 译者:叶文海(yewenhai@gamil.com) 内容索引 访问私有变量 访问私有方法 在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是 Java ...

  2. java中 static变量和方法到底是存在内存什么区域?

    JVM内存总体一共分为了  4个部分(stack segment.heap segment.code segment.data segment)  当我们在程序中,申明一个局部变量的时候,此变量就存放 ...

  3. java中容易混淆的方法_java中容易混淆的区别

    本文会随时更新一些java中容易混淆的关键字或者知识点,如有偏见之处,望留言! final和static的差别: 1,final的英语意思"最后的",在java中修饰类,方法和变量 ...

  4. java final 变量 回收_java入门教程-Java中final,finally,finalize三个关键字的区别

    final 当这个关键字修饰一个类时,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final.当final修饰变量或者方法时,可以保证他们在使用中不会被 ...

  5. Java Ucase_JSP页面中的变量和方法声明(Declaration)、表达式(Expression)和Java程序片(Scriptlet)统称为JSP标记。...

    JSP页面中的变量和方法声明(Declaration).表达式(Expression)和Java程序片(Scriptlet)统称为JSP标记. 面中Access2010数据库7个对象中,()是实际存放 ...

  6. java 中成员变量的名字和类的方法的名字可以一样.

    java 中成员变量的名字和类的方法的名字可以一样. public class fourone {public static void main(String[] args) {int first[] ...

  7. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  8. java常量使用_在Java中使用常量的方法

    在Java中使用常量的方法 发布时间:2020-08-20 14:38:32 来源:亿速云 阅读:92 作者:小新 小编给大家分享一下在Java中使用常量的方法,相信大部分人都还不怎么了解,因此分享这 ...

  9. java中成员变量和全局变量的区别_成员变量与全局变量的区别

    全局变量:也叫成员变量,是指在类中定义的变量:它在整个类中都有效 全局变量又可分为:类变量和实例变量 1.类变量:又叫静态变量  用static修饰  它可以直接用类名调用  也可以用对象调用   而 ...

  10. java中静态变量和静态方法分别有什么特点?

    java中静态变量和静态方法分别有什么特点? 悬赏分:0 - 解决时间:2006-4-10 10:28 提问者: vv_clear - 二级 最佳答案 为什么问了两次?再贴上另一篇 Thinking: ...

最新文章

  1. MDFR:基于人脸图像复原和人脸转正联合模型的人脸识别方法
  2. C++ STL lower_bound,upper_bound的使用总结
  3. basys2数码管共阳还是共阴_数据选择器Multiplexer || 数码管动态显示 ||实现逻辑函数 || 重难考点 || 数电...
  4. CAS单点登录详细流程
  5. 二叉树经典题之二叉树的非递归遍历
  6. 话里话外:实践企业内控,需与流程沟通(二)
  7. tab 切换显示网页链接的标签_chromium如何管理Tab
  8. 东北大学 16春学期《实用写作》在线作业1-3 答案
  9. C#对MySql进行增删该查
  10. linux怎么查看hwaddr_linux如何查看mac地址_查看linux的mac地址_linux 查看mac地址
  11. 苹果电脑安装双系统有必要吗?
  12. 申论公文题-总结类-1
  13. 如何成为一名合格的LINUX系统管理员
  14. android系统通过图片绝对路径获取URI的三种方法
  15. 物联网资产暴露情况分析
  16. 2021银川高考成绩查询,2021银川市地区高考成绩排名查询,银川市高考各高中成绩喜报榜单...
  17. 携手“懂行人” ,护航自贸区综保区高质量发展
  18. linux怎么进入bios看raid,教程:BIOS中如何打开RAID模式
  19. Ubuntu环境R程序安装ncdf4包:错误,找不到nc-config或不可执行
  20. 使用3CX Update 4 Alpha版本轻松保护您的备份和录音文件

热门文章

  1. Java 笔试练习 01: T1~19
  2. 图像翻译三部曲:pix2pix, pix2pixHD, vid2vid
  3. ado控件 怎么链接mysql,通过ADO控件访问数据库,ADO连接数据库
  4. java截取文件名后缀
  5. 水质环境监测系统解决方案
  6. (后台)Openbravo如何实现业务事件监听处理
  7. 计算机网络第七版--概述知识点总结
  8. 如何添加油猴脚本用以模拟点击网页按钮
  9. html中的图片路径ie8,IE8下文件上传时获取文件的真实路径
  10. (声明)“天外野草”为本人今后的笔名以及网名