访问控制修饰符
- default: 在同一包内可见,不使用任何修饰符。
- private: 同一类内可见。注意:不能修饰类
- public: 对所有类可见。
- protected: 对同一包内的类和所有子类可见。
类存在就是为了继承,更好的实例化成对象,如果设置成private和protected那这个类存在的意义也就没有那么大了。然后对于某些类中的方法、变量,我们不想被外部类直接访问,可以通过设置private和protected(非同一包内)修饰符来阻止访问,使得外部类仅能通过通过该类中提供的方法,如set(),get()方法来访问变量,实现类中变量的封装。
接口中的变量都隐式声明为 public static final
,接口里的方法默认情况下访问权限为 public
因为接口中的方法是需要靠继承的子类去实现的,如果设置成不允许访问,也就无法实现。
- private: 最严格的访问级别,被其修饰的方法、变量只能被所属类访问。
- protected: 让子类都能访问,其他类不能访问。
父类中声明为 public 的方法在子类中也必须为 public。
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。(要能传下去(能被继承),不能到了一个子类中就被私有化了)
父类中声明为 private 的方法,不能够被继承。
非访问控制修饰符
-
final :
-final 修饰符通常和 static 修饰符一起使用来创建类常量
-父类方法可以被继承,不能被重写(overwrite) -
abstract:
-抽象类不能被实例化,声明抽象类的目的是为了进行通过子类继承来对该类进行扩充。
-类包含抽象方法,一定要声明为抽象类。抽象类
abstract class Animal { private String name; public abstract void eat(); //抽象方法 public abstract void walk(); }
抽象方法:没有方法体,由子类实现。继承抽象类的子类必须实现父类所有的抽象方法,除非该子类也是抽象类。
-
synchronize
synchronize声明的方法同一时间只能被一个线程所访问。 -
transient //易变的
序列化时JVM跳过该特定的变量
public transient int limit = 22; //不会持久化
public int b; // 持久化
- volatile
volatile修饰的变量被线程访问时强制从共享内存中重新读取值,当成员变量发生变化时,强制线程将变化值回写到共享内存中。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
public class MyRunnable implements Runnable {
private volatile boolean active;
public void run(){
active = true;
while(active) {
}
}
// 其他线程调用stop()后,前一个线程调用的run()中的循环会停止
public void stop(){
active = false;
}
}