文章目录
- 一、修饰符
- (一)、访问修饰符
- 1、default访问修饰符
- 2、private访问修饰符
- 3、public访问修饰符
- 4、protected访问修饰符
- 5、访问控制与继承的原则
- (二)、非访问修饰符
- 1、static修饰符
- 2、final修饰符
- 3、abstract修饰符
- 4、synchronized修饰符
- 5、transient修饰符
- 6、volatile修饰符
一、修饰符
Java中修饰符主要分为以下两种,它用于定义类(class)、方法(method)和变量(variable),通常放在语句最前端。
- 访问修饰符
- 非访问修饰符
(一)、访问修饰符
Java中使用访问修饰符可以保护被修饰的类、方法和变量,有以下四种:
- default:默认,即不加以修饰类、接口、变量和方法。
- private:私有,即在同一类可见,但在其他类中不可见(不能用于修饰外部class)。
- public:公有,即对所有类都可见。
- protected:对同一包内(package)的类及子类可见(不能用于修饰外部class)。
访问修饰符 | 当前类 | 同一包内及包内子孙类 | 不同包的子孙类 | 其他包 |
default | Y | Y | N | N |
private | Y | N | N | N |
public | Y | Y | Y | Y |
protected | Y | Y | Y or N | N |
1、default访问修饰符
使用默认修饰符修饰的变量和方法对于同一包的类是可见的,接口内变量隐式声明为public static final,而接口内的方法的访问修饰符默认为public。
2、private访问修饰符
使用私有访问修饰符的方法、变量和构造方法只能被所属类访问,并且类和接口不能被修饰为该访问修饰符。它保护了被修饰得方法、变量和构造方法免受其他类篡改,体现程序设计安全性的概念。若想让外部类可以访问到private修饰的变量,可以通过在类中编写构造方法并赋值或输出该私有变量。如下表示。
//Access.java
package day4;
public class Access {
private String myName = "seanOY";
public String getPrivateVariable() {
return this.myName;
}
public void setPrivateVariable(String newName) {
this.myName = newName;
}
}
//AccessModifier.java
package day4;
public class AccessModifier {
public static void main(String[] args) {
// TODO Auto-generated method stub
String cartoonName = "哆啦A梦";
Access access = new Access();
System.out.println(access.getPrivateVariable());
access.setPrivateVariable(cartoonName);
System.out.println(access.getPrivateVariable());
}
}
/* 输出信息
seanOY
哆啦A梦
*/
3、public访问修饰符
使用公有访问修饰符的变量、方法和类对任何类都可访问。如果不同的public类分布在不同的包,则需要import对应的包。
4、protected访问修饰符
使用protected访问修饰符产生的结果需要分两点来分析,详见Java protected 关键字详解:
- 子类和父类在同一个包:被protected声明的变量、方法和构造器能被同一包中的任意类访问。
- 子类和父类不在同一个包:子类实例可以访问从父类继承的方法,但不能访问父类实例的protected方法。
package day4;
public class Access {
public class Father{
protected String printName()
{
return "seanOY";
}
}
class Son extends Father{//子类重写了父类的printName()方法
protected String printName() {
return "Seanoy";
}
}
}
5、访问控制与继承的原则
声明父类的修饰符 | 声明子类的修饰符 |
public | public |
protected | protected/public |
private | 不能被继承 |
(二)、非访问修饰符
非访问修饰符主要有以下几种:
- static:用于声明静态变量,局部变量不能声明为静态变量。(类似C/C++ static)
- final:通常和static一起出现,用于声明常量。
- abstract:用于创建抽象类和抽象方法。
- synchronized和volatile:主要用于线程的编程。
- transient:用于预处理类和变量的数据类型。
1、static修饰符
静态的意思,用此修饰符的变量和方法有如下描述:
- 静态变量
独立于对象,且对象会保存(拷贝)静态变量的值。(类似C/C++的static修饰符) - 静态方法
独立于对象,且静态方法不能使用类的非静态变量(non static variable)。
p.s. 对类的静态变量和方法可以用完全限定名(如classname.variablename)来获取。
2、final修饰符
最终的意思,用于修饰常量。并且用final修饰的父类可以被子类继承,但不能被其重写。
3、abstract修饰符
抽象的意思,抽象类不能实例化对象,其目的是为了日后能对该类进行扩充。它不能与final一起出现;如果一个类含有抽象方法,那么它需要是抽象类;抽象方法的实现由子类提供,且子类需要实现父类的所有抽象方法,除非子类也是抽象类。
4、synchronized修饰符
同步的意思,用于多线程时保护变量,同一时间该变量只能被同一线程访问。
5、transient修饰符
短暂的意思,序列化的对象包含被transient修饰符修饰过的实例变量时,JVM将跳过该变量(不保存该变量)。
6、volatile修饰符
容易变化的意思,使用volatile修饰的成员变量在每次被线程访问时,都会强制从共享内存中重新读取该成员变量的值,更改该变量时也强制线程将变化值写入共享内存。此目的为使多个线程总会见到某个成员变量的同一个值。(volatile引用对象可能为null)
参考链接:
菜鸟教程-Java 修饰符