native
我们先来看看native关键字
jdk1.8 中的Class类中有这么一个方法:
public native boolean isInstance(Object obj);
我们不管这个方法是做什么的,但是一看这个方法我们会觉得很奇怪,因为Class是一个类,而不是一个接口,居然还存在没有方法体的方法,带着疑问继续了解;
那么native这个单词有本地的意思,被native修饰的方法称作本地方法,是一个原生态的方法,它的实现不在当前文件中。
那么为什么不在当前文件中实现呢?要搞得这么麻烦!!
首先我们了解了虚拟机,知道java跨平台是因为虚拟机,而虚拟机通过接口来和不同的平台对接,因此java语言有了跨平台的特性,但也是因为如此,java语言不能去对操作系统的底层进行访问和操作,需要来借助其他语言来实现(比如C/C++);
volatile
这个关键字说起来,估计要连带出一系列的问题(balabala.....)
简单的说Volatile关键字实际下有两层含义:
A)保证了内存的可见性;
B)禁止了指令的重排序;
何为内存的可见性,就是在我从主存中读取数据放到缓存区中的时候,我们修改数据,就会造成缓存中的数据和主内存中的数据不一致,而用volatile修饰的变量,一旦修改,就会写入内存中,而普通变量写入主内存的时机我们是不确定的;
指令的重排序:在我们写的代码中,jvm运行的时候并非都是按照代码的顺序来执行的,可以通过重排序来优化代码;
重排序:
int a=1;
int b=20;
int c=a+b;
我们先给a赋值,然后给b赋值,但是在运行时,jvm很有可能会先给b赋值,在给a赋值;
final 表示常量
- 修饰基础变量时,表示不可改变变量的值
2. 修饰引用变量的时候,表示不可改变引用的地址,但是引用对象中的数据可以改变
3.修饰类表示类不可被继承
4.修饰方法且方法使用public修饰,表示方法不可被重写,但方法可以被继承
重写报错
继承
public class Userfinal {
public final void show(){
System.out.println("i am show");
}
public static void main(String[] args) {
Sonfinal sonfinal=new Sonfinal();
sonfinal.show();
}
}
class Sonfinal extends Userfinal{
}
结果
i am show
如果使用private修饰方法:则表示次方法不可被继承,但是在son中可以有方法show
public class Userfinal {
private final void show(){
System.out.println("i am show");
}
public static void main(String[] args) {
Sonfinal sonfinal=new Sonfinal();
sonfinal.show();
}
}
class Sonfinal extends Userfinal{
public void show(){
System.out.println("i am son show");
}
}
i am son show