title: java字段修饰符
layout: post
date: 2017-03-20 13:01:33
tags: [java基础]
java修饰符主要分为访问控制修饰符 和非访问修饰符。修饰符用来定义类、方法或者变量,通常放在语句最前端。比如
public class DemoClass{
private boolean flag;
static final double length=3.2;
protected static final int width=4;
public static void main(String[]arguments){
}
}
访问权限 | 类 | 包 | 子类 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
- default 即为默认的,如果不指明就为default。使用default声明的变量和方法接口中的变量都隐式声明为public static final,接口里的方法默认情况下访问权限为public
- 被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private
- Java 程序的 main() 方法必须设置成public ,否则,Java 解释器将不能运行该类。
- protected 访问修饰符不能修饰类和接口,方法和成员变量能够声明为 protected,但是接口的成员变量和成员方法不能声明为 protected。
- 访问控制和继承 :
- 父类中声明为public的方法在子类中也必须是public
- 父类中声明为protected的方法在子类中必须是public或者protected,不可以是private
- 父类中声明为private的方法不可被继承
java中的非访问修饰符现在有 static, final, abstract, synchronized, volatile
修饰符 | 作用简介 |
---|---|
static | 创建类方法和类变量 |
final | 修饰类、方法、变量。final修饰的类不能被继承,修饰的方法不能被继承类重定义,修饰的变量为常量不可修改 |
abstract | 创建抽象类和抽象方法 |
synchronized,volatile | 用于线程的编程 |
transient | 不让变量被持久化??? |
- 静态变量:独立于对象存在。无论一个类实例化多少个对象,静态变量只有一份拷贝。静态变量也叫类变量。局部变量不可用static修饰
- 静态方法 :独立于对象的方法,不可使用类的非静态对象。静态方法从参数列表获得数据进行处理。
- 类的静态方法和静态变量可直接用
类名.变量
或类名.方法
访问,比如 用Math.max(a,b)
可以得到变量a,b中的较大值
- final变量
- 可以被显示初始化一次且仅一次。被声明为final的对象的引用不能变为其他对象,但是这个对象里的数据可以改变
- final和static常一起用来创建类常量
- final方法
- 可以被子类继承但不可修改。
- 方法声明为final主要为了防止被修改
- final类
- 不可被继承
- 抽象类
- 抽象类不能用来实例化对象
- 一个类不可同时被abstract和final修饰。如果一个类包含抽象方法则一定要声明为抽象类,抽象类可以同时有抽象和非抽象方法。
- 抽象方法
- 抽象方法无实现,具体实现由子类提供。
- 抽象方法不能被声明为final或static
- 任何继承抽象类的子类必须实现父类所有抽象方法,除非子类也是抽象类
- 抽象方法的声明以分号结尾
- 抽象类 和 接口 关系 参考 类比C++中的虚函数 纯虚函数 参考
synchronized声明的方法或代码块同一时间只能被一个线程访问
- 只能修饰变量不能修饰方法和类,且不能修饰local variant
- 被transient修饰的变量不能被序列化,而静态变量无论是否有transient修饰都不会被序列化。(了解下序列化和持久化的区别与联系)
- 但如果序列化操作的是externalizable对象就不一定。参考
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。