作用域 | 当前类 | 同一 package | 子孙类 | 其他 package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
不写时默认为 default
final 修饰符
final 具有不可更改的意思,它可以修饰非抽象类 ,非抽象成员方法和变量 。
用 final 修饰的类不能被继承,没有子类。 如 String
用 final 修饰的方法不能被子类的方法覆盖
用 final 修饰的变量表示常量,只能被赋值一次
用 final 不能修饰构造方法 ,因为方法覆盖这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系,因此用 final 修饰构造方法是豪无意义的。
父类中用 private 修饰的方法不能被子类的方法覆盖,因此 private 类型的方法默认是 final 类型的 。
final 类
String 类 ,不让继承,封装实现的细节。
final 方法
在某些情况下,出于安全的原因,父类不允许子类覆盖某个方法,此时可以把这个方法声明为 finnal 类型。 java.lang.Object 类, getClass ()为 final 类型, equals ()不为 final 类型。
final 变量
用 final 修饰的变量表示取值不会改变的常量。
final 修饰符可以修饰静态变量,实例变量和局部变量,分别表示静态常量,实例常量和局部常量。
例如 出生日期,年龄的限制等。
final 变量都必须显示初始化,否则会导致编译错误。
final 变量只能被赋值一次。
在程序中使用 final 修饰符来定义常量的作用
提高程序的安全性,禁止非法修改取值固定并且不允许修改的数据
提高程序代码的可维护性。
static 关键字
static 修饰符可以用来修饰类的成员变量,成员方法和代码块 。
用 static 修饰的成员变量表示静态变量 ,可以直接通过类来访问 。
用 static 修饰的成员方法表示静态方法 ,可以直接通过类名来访问 。
用 static 修饰的程序代码块表示静态代码块 ,当 JAVA 虚拟机加载类时 ,就会执行该代码块 。
被 static 所修饰的成员变量和成员方法标明归某个类所有,它不依赖于类的特定实例,被类的所有实例共享 。只要这个类被加载, JAVA 虚拟机就能根据类名在运行时数据区的方法区定位到它们。
static 变量
类的成员变量有两种,一个是实例变量,没有被 static 修饰,一种是被 static 修饰过的变量,叫类变量或者静态变量。
静态变量和实例变量的 区别:
静态变量在内存中只有一个拷贝,运行时 JAVA 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。可以直接通过类名访问静态变量。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
static 方法
成员方法分为静态方法和实例方法 。用 static 修饰的方法叫做静态方法,或者类方法。静态方法和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。
因为静态方法不需要通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用 this 和 super 关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。在 static 方法内,不能直接访问非 static 变量或者方法。
static 代码块
类中可以包含静态代码块,它不存在于任何方法体中。在 JAVA 虚拟机加载类时会执行这些静态代码块。如果类中包含多个静态块,那么 JAVA 虚拟机将按照他们在类中出现的顺序依次执行它,并且每个代码块只会被执行一次。
static 和 abstract 永远不能放在一起用
abstract 修饰符与 final 修饰符连用
如果一个方法是静态的 ,它就必须自力更生,自己实现该方法 。如果一个方法是抽象 的,那么它就只表示类所具有的功能,但不会去实现它 ,在子类中 才会去实现它 。
abstract 修饰符
abstract 修饰符可以用来修饰类 和成员方法
用 abstract 修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化 ,即不允许创建抽象类本身的实 例。没有用 abstract 修饰的类称为具体类,具体类可以被实例化。
用 abstract 修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用 abstract 修饰的方法称为具体方法,具体方法具有方法体。
abstract 语法规则:
抽象类可以没有抽象方法 ,但包括了抽象方法的类必须被定义为抽象类 。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类 。
抽象类中可以有非抽象的构造方法 ,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
抽象类及抽象方法不能被 final 修饰符修饰 。因为抽象类只允许创建子类,它的抽象方法才能被实现,并且只有它的具体子类才能被实例化,而用 final 修饰的类不允许拥有子类,用 final 修饰的方法不允许被子类方法覆盖,因此把 abstract 修饰符与 final 修饰符连用,会导致自相矛盾。