我想学习Java的朋友应该都在学习的路上遇到过这样的疑问,Java中的修饰符,对public,private,protected还算熟悉,
可是对final,static等就不太清楚了,对Java中类,方法,变量的默认修饰符好像就更不了解了,我们今天就和大家一起
学习一下,Java中各种各样奇妙的修饰符。
一、范围介绍
首先,我们要明白在Java中修饰符的作用主要有两种,一种是用来控制访问权限的,另一种是用来控制其他方面的(比如值是否可改,访问的方式,是否可覆盖等等)。而,在访问权限方面,一般分为以下几种:类内可访问,包内可访问,子类可访问等几种范围。我们也主要围绕这几种范围进行分析。
二、变量的修饰符
Java中的变量,主要分为两类,一类是方法内的变量,一类是类内的变量(或者叫类的属性或字段)。而方法内的变量只能用一种修饰符final。表示常量,不能更改。类内的变量却是有很多,下面我们来具体分析一下。
1. 访问权限控制方面:
// 变量的修饰符,关于访问权限控制方面
public String publicString = "public";
protected String protectedString = "protected";
private String privateString = "private";
String defaultString = "default";
我们可以看到主要有四类修饰符,public,protected,private还有一个是默认的(default)。那么他们的访问权限如何呢?
public: 任何地方都可以访问,对访问无限制。
protected: 同一个包内或者不同包内的子类可以访问。
private: 同一个类内可以访问。
默认(default): 同一个包内可以访问。
2. 其他控制方面:
class Test{
static String staticString = "static";
final String finalString = "final";
}
我们可以看到其他方面的控制修饰符主要有两个,static,final。
static表示该变量无需获得其所属类的对象就可以访问。什么意思呢?就是说,对于上面的例子,我可以通过Test.staticString的方式,直接访问staticString这个变量。当然了,你也可以通过Test test = new Test(); test.staticString的方式进行访问,但是并不推荐通过这种方式进行访问。
final表示该变量一旦赋值之后,其值将不会再发生改变。如上面所示,如果你再使用finalString = “hello”的方式修改其值的话,就会报错,且无法修改。
三、非构造函数的修饰符
1. 访问权限控制方面
// 关于方法的修饰符
public void printPublic() {
System.out.println("public method");
}
protected void printProtected() {
System.out.println("protected method");
}
private void printPrivate() {
System.out.println("private method");
}
void printDefault() {
System.out.println("default method");
}
非构造函数的访问权限与变量的完全相同,这里不再赘述。
2. 其他控制方面:
static void printStatic() {
System.out.println("static method");
}
final void printFinal() {
System.out.println("final method");
}
abstract void printAbstract();
其中static和变量中的static具有相同的含义。final也表示,在继承关系中,这个方法是不可以被子类覆盖重写的。而abstract是指需要子类实现的抽象方法。
四、构造函数的修饰符
构造函数的修饰符只有访问权限控制方面:
class TestA {
//关于构造函数的修饰类
public TestA(){
}
protected TestA(int i){
}
private TestA(int i,int j){
}
TestA(String string){
}
}
其中,private限制构造函数后,其他类中将不能够通过new的方式来获取这个类的对象,能够有效控制对象的创建行为,这在有些设计模式中是非常重要的。
五、类的修饰符
关于类的修饰符主要有四种,如下:
// public,默认,abstract,final。
public class Test1 {}
class Test2{}
abstract class Test3{}
final class Test4{}
其中public,和默认(default)是访问控制修饰符,和变量的完全相同,不再赘述。
abstract是表示该类为一个抽象类,不能实例化该类,即不能使用Test3 test3 = new Test3();的方式获取Test3的实例。
final表示该类不能被子类继承,该类即为最终类,不可再被继承。
六、关于接口
接口比较特殊,接口的修饰符只有public和默认(default),其控制权限和变量完全相同,不再赘述。
值得注意的是,接口中的变量只能为:public static final 变量名。当然了,你也可以不写这些修饰符,编译器会自动帮你加上的,因为编译器默认情况下就是这样修饰的。
接口中的方法,只能用public和abstract修饰符,当然了,你也可以不写这些修饰符,同样,编译器会自动帮你加上的。
PS:至于变量为什么必须声明为public static final请参照我的另一篇博客:Java接口中的成员变量为什么必须声明为public static final?