内容来自网络搜集整理
图片原文链接:https://blog.csdn.net/z1web/article/details/89068217
一、native
参考链接:https://blog.csdn.net/funneies/article/details/8949660?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1328760.1071.16171808089191777&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
参考链接:https://blog.csdn.net/bifuguo/article/details/81513526。
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如
C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言
来实现对底层的访问。
JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java
Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。
Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代
码内部调用Java代码。
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控
制,就要一些其他语言的帮助,这个就是native的作用了。使用native关键字说明这个方法是原生函数,也就是这
个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。这些函数的实现体在DLL中,JDK的源代码中
并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同
的平台上调用不同的native方法实现对操作系统的访问的。
Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1)在Java中声明native()方法,然后编译;
2)用javah产生一个.h文件;
3)写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带
的jni.h文件); jni.h 这个文件,在/%JAVA_HOME%include里。
4)将第三步的.cpp文件编译成动态链接库文件;
5)在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在
Java中被访问了。
JAVA本地方法适用的情况:
1)为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问
2)为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的
3)为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
二、strictfp
参考链接:https://blog.csdn.net/qq_34163820/article/details/52412930
即strict float point (精确浮点)。
strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和
double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中
的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必
须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。如果你想让你的浮点运算更加精确,而且
不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp。
三、transient
参考链接:https://blog.csdn.net/qq_40845019/article/details/108898147
参考链接:https://www.runoob.com/java/java-serialization.html
参考链接:https://blog.csdn.net/qq_35890572/article/details/81630052
在不需要被序列化的属性前添加关键字transient,在序列化对象的时候,这个属性就不会被序列化。
java的serialization提供了一个非常棒的存储对象状态的机制,即serialization是把对象的状态存储到硬盘
上,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient
的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的字
段,他的生命周期仅仅在内存中,不会被写到磁盘中。
Java序列化:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节
序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从
文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以
用来在内存中新建对象。整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以
在另一个完全不同的平台上反序列化该对象。类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据
流,它们包含反序列化和序列化对象的方法。
1)序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点
(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。
2)反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
3)序列化的作用:
① 想把内存中的对象保存到一个文件中或者数据库中时候;
② 想用套接字(Socket=(IP地址:端口号))在网络上传送对象的时候;
③ 想通过RMI(Java的一组拥护开发分布式应用程序的API)传输对象的时候
四、volatile
参考链接:https://blog.csdn.net/tianping168/article/details/2486671?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-4&spm=1001.2101.3001.4242
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生
变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个
值。
防止方法没有同步,导致线程读到脏数据,有方法:
1)声明两个方法为synchronized 的,防止两个方法同时被执行,还可以保证变量值被同时更新,这样一来
变量值一直是一样的
2)把共同变量声明为volatile
五、Java所有关键字及其作用总结
参考链接:https://blog.csdn.net/z1web/article/details/89068217
1.private 一种访问控制方式:私用模式 (权限修饰符:同类 √ 同包 × 不同包的子类 × 不同包的非子类 ×)
2.protected 一种访问控制方式:保护模式(权限修饰符:同类 √ 同包 √ 不同包的子类 √ 不同包的非子类 ×)
3.public 一种访问控制方式:共用模式 (权限修饰符:同类 √ 同包 √ 不同包的子类 √ 不同包的非子类 √)
4.abstract 表明类或者成员方法具有抽象属性。
参考链接:https://www.runoob.com/w3cnote/java-abstract-interface-different.html
抽象类 不一定有抽象方法,有抽象方法的一定是抽象类或接口;
抽象类 可以拥有成员变量和普通的成员方法;
抽象类 不可被实例化,不能直接用new去创建抽象类对象;
抽象类 不可被final修饰,因为抽象类要求必须被子类继承才有意义,而被final修饰的类不允许有子类;
抽象类 能有构造方法,流程与普通类一样,当非抽象类子类实例化时,先实例化了抽象父类,此时在堆空间
有了对应抽象类对象。
抽象类和普通类的区别主要有三点:
1)抽象方法权限修饰符必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无
法实现该方法),默认情况下默认为 public;
2)抽象类不能用来创建对象;
3)一个类继承于一个抽象类,则子类必须实现父类的抽象方法,如果子类没有实现父类的抽象方法,则必须
将子类也定义为为 abstract 类。
5.class 类
6.extends 表明一个类型是另一个类型的子类型。(Java 不支持多继承,但支持多重继承。extends后面
只可继承一个类,但可以A类被B类继承,B类被C类继承,...)
7.final 用来说明最终属性。
1)被final修饰 的类被继承,即不能有子类;
2)被final修饰的成员方法不能被覆盖(重写);
3)被final修饰的成员域的值不能被改变;
4)被final修饰的局部变量可先声明,再赋值,但只允许赋值一次,之后不可改变;被final修饰的成员变
量,必须在声明的时候赋值,之后不可改变。
8.implements 表明一个类实现了给定的接口。
9.interface 接口
参考链接:https://www.runoob.com/w3cnote/java-abstract-interface-different.html
参考链接:https://blog.csdn.net/qq_40062380/article/details/78687171
1)接口中可以含有变量和方法;
2)接口中的变量会被隐式地指定为 public static final 变量(只能是 public static final变量,用其他修饰会
报编译错误),方法会被隐式地指定为 public abstract 方法且只能是 public abstract 方法(用其他关键字修饰会
报编译错误);
3)接口中所有的方法不能有具体的实现,必须都是抽象方法;
4)一个类可实现多个接口。
Q:为什么接口中的常量必须使用public static final修饰:
1)public : 使接口的实现类可以使用这个常量
2)static :static修饰就表示它属于类的,随的类的加载而存在的, 如果是非static的话,就表示属于对象
的,只有建立对象时才有它,而接口是不能建立对象的 ,所以接口的常量必须定义为static;
3)final :final修饰就是保证接口定义的常量不能被实现类去修改,如果没有final的话,由子类随意去修改的
话,接口建立这个常量就没有意义了。
Q:抽象类和接口的区别
语法层面上的区别:
1)抽象类可以提供成员方法的实现细节(普通的成员方法),而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final(全局常量)类型的;
3)抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
设计层面上的区别
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包
括属性、行为,但是接口却是对类局部(行为)进行抽象。继承是一个 "是不是"的关系,而接口实现则是 "有没
有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,如麻雀类是鸟类;而接口实现则是有没
有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个“飞行”接口,不
能飞行就不实现这个接口。
2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
10.native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
11.new 用来创建新实例对象
12.static 表明具有静态属性。
参考链接:https://blog.csdn.net/yubujian_l/article/details/86498238
1)用于修饰类的成员方法、类的成员变量
2)静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任
何对象。由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变
量都必须依赖具体的对象才能够被调用。但是在非静态成员方法中是可以访问静态成员方法/变量的。
但是我们在非静态方法中能够通过this访问静态方法成员变量。
3)静态变量和非静态变量的区别是:
静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化(实例化第
一个类对象时)。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副
本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
4)static还有一个比较重要的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地
方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会
执行一次。 static块可以优化程序性能,是因为它的特性:只会在类被初次加载的时候执行一次。
5)Java中的static关键字不会影响到变量的变量或者方法的作用域;在Java中static是不允许用于修饰局部变量的。
13.strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
14.synchronized 表明一段代码需要同步执行
15.transient 声明不用序列化的成员域
16.volatile 表明两个或者多个变量必须同步地发生变化
17.break 提前跳出一个块
18.continue 回到一个块的开始处
19.return 从成员方法中返回数据
20.do 用在do-while循环结构中
21.while 用在循环结构中
22.if 条件语句的引导词
23.else 用在条件语句中,表明当条件不成立时的分支
24.for 一种循环结构的引导词
25.instanceof 用来测试一个对象是否是指定类型的实例对象
26.switch 分支语句结构的引导词
27.case 用在switch语句之中,表示其中的一个分支
28.default 默认,例如,用在switch语句中,表明一个默认的分支
29.try 尝试一个可能抛出异常的程序块
30.catch 用在异常处理中,用来捕捉异常(可捕捉多个异常)
31.throw 抛出一个异常(抛到调用处处理异常)
32.throws 声明在当前定义的成员方法中所有需要抛出的异常(人为抛出)
33.import 表明要访问指定的类或包
34.package 包
35.boolean 基本数据类型之一,布尔类型
36.byte 基本数据类型之一,字节类型
37.char 基本数据类型之一,字符类型(可存取一个汉字,一个汉字对应的Unicode码是两个字节,char类型
数据是两个字节存储空间)
38.double 基本数据类型之一,双精度浮点数类型
39.float 基本数据类型之一,单精度浮点数类型(eg: float f = 3.14f; //要加 f 或 F后缀,数据默认double
型,存在兼容性问题)
40.int 基本数据类型之一,整数类型
41.long 基本数据类型之一,长整数类型(eg:long f = 100000L; //要加 l 或 L 后缀,数据默认int型)
42.short 基本数据类型之一,短整数类型
43.super
参考链接:https://blog.csdn.net/zai_xia/article/details/79946984
表明当前对象的父类型的引用或者父类型的构造方法;super关键字表示对某个类的父类的引用。
一般而言,super有两种通用形式:
第一种 用来访问被子类的成员隐藏的父类成员。如子类和父类有同名的成员变量或方法,则父类的成员将
会被覆盖,使用 super.<成员变量名> 和 super.<成员方法名>;
Java语言中,用过继承关系实现对成员的访问是按照最近匹配原则进行的。
1)在子类中访问成员变量和方法时,将先查找是否在本类中已经定义,如果在本类中存在,则使用本类的,
否则,按照继承层次的顺序往父类查找,如果未找到,继续逐层向上到其祖先类查找。
2)super特指访问父类的成员,使用super首先到直接父类查找匹配成员,如果未找到,再逐层向上到祖先类查找。
第二种 则是可以调用父类的构造函数。使用 super(调用参数列表),其中调用参数列表必须和父类的某个构
造函数方法的参数列表完全匹配。
子类与其直接父类之间的构造方法存在约束关系,有以下几条重要原则:
1)按继承关系,构造方法是从顶向下进行调用的;
2)如果子类没有构造方法,则它默认调用父类无参的构造方法,如果父类中没有无参数的构造方法,则将产生错误。
3)如果子类有构造方法,那么创建子类的对象时,先执行父类的构造方法,再执行子类的构造方法。
4)如果子类有构造方法,但子类的构造方法中没有super关键字,则系统默认执行该构造方法时会产生
super()代码,即该构造方法会调用父类无参数的构造方法。
5)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必
须是子类构造函数方法中的第一条语句。
6)Java语言中规定当一个类中含有一个或多个有参构造方法,系统不提供默认的构造方法(即不含参数的构
造方法),所以当父类中定义了多个有参数构造方法时,应考虑写一个无参数的构造方法,以防子类省略super关
键字时出现错误。
44.this
参考链接:https://blog.csdn.net/weixin_42386014/article/details/81138684
指向当前实例对象的引用
1)this.属性名称。指的是访问类中的成员变量,用来区分成员变量和局部变量(解决重名问题);
2)this.方法名称。用来访问本类的成员方法。
3) this()。 访问本类的构造方法,()中可以有参数,如果有参数就是调用指定的有参构造方法。
注:this() 不能使用在普通方法中 只能写在构造方法中,且必须是构造方法中的第一条语句。
45.void 声明当前成员方法没有返回值
46.goto 保留关键字,没有具体含义
47.const 保留关键字,没有具体含义