【访问限定修饰符的作用域与可见性】
作用域与可见性 | 当前类 | 同一package | 子类 | 其他package |
public | √ | √ | √ | √ |
private | √ | × | × | × |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
① public。表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直接访问。
② private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外的其他类或者对象没有访问权限。
③ protected。表明该成员变量或方法对该类自身,与它在同一个包中的其他类,在其他包中的该类的子类都可见。
④ default。表明该成员变量或方法只有自己和与其位于同一包内的类可见。若父类与子类位于同一包内,则子类对父类的default成员变量或方法都具有访问权限;若父类与子类位于不同的包内,则没有访问权限。
注意:public、protected、private和default只能修饰成员变量,不能用来修饰局部变量。private与protected不能用来修饰类(只有public、abstract或final能用来修饰类)。
【static关键字】static关键字主要有两种作用:第一,为特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,实现某个方法或属性与类而不是对象关联在一起,也就是说在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。
static关键字主要有四种使用情况:静态成员变量、静态成员方法、静态代码块和静态内部类。
【静态成员变量】用static关键字修饰的变量为静态变量。静态变量属于类,在内存中只有一个复制(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配存储空间,因此就可以被使用了。对静态变量的引用有两种方式,分别为:类.静态变量和对象.静态变量。
Java中还有以一种变量是不用static关键字修饰的实例变量。实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个复制。只能用对象.实例变量的方式引用。
【静态成员方法】static方法不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没有被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。
【静态代码块】JVM在加载类时会先执行static代码块。
【静态内部类】静态内部类是指被声明为static的内部类,它可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)。
【final关键字】final关键字用来声明属性、方法和类。分别表示属性不可变、方法不可覆盖(重写)和类不可继承(不能派生出新的子类)。
【final属性】final属性指的是引用的不可变性,即它只能指向初始时指向的那个对象,而不关系指向对象内容的变化。所以,被final修饰的变量必须被初始化。
【final方法】当一个方法声明为final时,该方法不允许任何子类重写这个方法,但子类仍然可以使用这个方法。
【final参数】用来表示这个参数在这个函数内部不允许被修改。
【final类】当类被声明为final时,该类不能继承,所有方法都不能被重写。但是这并不代表final类的成员变量也是不可改变的,要想做到final类的成员变量不可改变,必须给成员变量增加final修饰。值得注意的是,一个类既不能被声明为abstract、又被声明为final。