访问控制:private 、protected、public
序号 | 范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 本类访问 | √ | √ | √ | √ |
2 | 同一包下的不同类访问 | × | √ | √ | √ |
3 | 不同包下的子类访问 | × | × | √ | √ |
4 | 不同包下的非子类 访问 | × | × | × | √ |
private:private修饰的变量和方法只能在本类中访问
default:如果一个类的方法和变量,不使用private,protected,public 修饰,则可以在同一个包下的不同类访问这个类的实例方法和变量
protected:如果一个类的方法和变量,使用protected的修饰,则可以在本类、同一包下的不同类、不同包下的子类内部使用,但是在不同包下创建的子类实例是不能调用protected修饰的方法和变量的
父类,包demo.demo1
package demo.demo1;
public class DemoProtecedParent {
protected Integer a;
protected String getSay(String name){
return name;
}
}
子类在demo.demo2包下,在子类内部调用父类的protected方法
package demo.demo2;
import demo.demo1.DemoProtecedParent;
public class DemoProtectedChild extends DemoProtecedParent {
public static void main(String[] args) {
DemoProtectedChild demoProtectedChild = new DemoProtectedChild();
demoProtectedChild.getSay("只能在自己子类内部使用");
Integer a = demoProtectedChild.a;
}
}
子类在demo.demo2包下,即不同包下的非子类 ,不能调用子类继承至父类的getSay方法和 a 属性,编译报错
package demo.demo2;
public class Demo2 {
public static void main(String[] args) {
DemoProtectedChild child = new DemoProtectedChild();
Integer a = child.a; //编译报错
child.getSay("不同包下不同类,不能调用子类实例的getSay方法");
}
}
public:public修饰的变量和方法,其他类可以通过该实例对象调用public方法
同步变量:volatile
volatile关键字用于表示可以被多个线程异步修改的成员变量。
volatile的目标用途是为了确保所有线程所看到的指定变量的值都是相同的。
调用外部语言:native
native关键字可以应用于方法,以指示该方法是用Java以外的语言实现的。
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
transient:非序列化
transient 关键字可以应用于类的成员变量,以便指出该成员变量不应在包含它的类实例已序列化时被序列化。
当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
延伸一下序列化
1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
final 最终、不可改变
final 关键字可以应用于类,以指示不能扩展该类(不能有子类)。final 关键字可以应用于方法,以指示在子类中不能重写此方法。一个类不能同时是 abstract 又是 final。abstract 意味着必须扩展类,final 意味着不能扩展类。一个方法不能同时是 abstract 又是 final。abstract 意味着必须重写方法,final 意味着不能重写方法。