Java访问修饰符

时间:2020-02-23 14:36:20  来源:igfitidea点击:

Java访问修饰符用于在Java中提供访问控制。
Java通过三个关键字(私有,保护和公共)提供访问控制。
我们不需要总是使用这些访问修饰符,因此我们有另一个名称,即"默认访问权限"," package-private"或者"无修饰符"。

Java访问修饰符

我们可以将Java访问修饰符与类以及类变量和方法一起使用。

我们只允许对Java类使用" public"或者" default"访问修饰符。

  • 如果某个类是"公共"类,那么我们可以从任何地方访问它,即可以从位于任何其他包中的任何其他类等访问它。

  • 源文件中只能有一个"公共"类,并且文件名应与公共类名相同。

  • 如果该类具有"默认访问权限",则只能从同一程序包中的其他类进行访问。

具有类成员的Java Access修饰符

我们可以为类成员变量和方法提供所有四个访问修饰符。
但是,成员访问修饰符规则在类级别访问规则之后应用。
例如,如果一个类具有默认访问权限,则它将在其他包中不可见,因此该类的方法和变量也将不可见。

我们将分别研究它们中的每一个,然后通过一个简单的程序显示java访问修饰符的用法。

Java Access修饰符–公共关键字

如果类成员是"公开的",则可以从任何地方访问它。
成员变量或者方法是全局访问的。
这是提供对类成员的访问的最简单方法。
但是,我们应该注意将此关键字与类变量一起使用,否则任何人都可以更改值。
通常,类变量将保留为私有变量,并提供使用getter-setter方法来使用它们。

Java Access修饰符–专用关键字

如果类成员是"私人",则只能在同一类内访问。
这是最受限制的访问,并且外部成员将看不到该类成员。
通常,我们将类变量保持为私有,而只允许在类内部使用的方法为私有。

Java访问修饰符–受保护的关键字

如果类成员是"受保护的",则只有同一包中的类和子类才能访问它。
此修饰符受私人访问的限制较小,但受公共访问的限制更大。
通常,我们使用此关键字来确保类变量只能由子类访问。

Java访问修饰符–默认访问

如果类成员未指定任何访问修饰符,则将使用默认访问权限进行处理。
访问规则与类相似,具有默认访问权限的类成员仅可用于同一包中的类。
此访问权限比公共访问权限受更多限制,受保护的访问权限少于私有访问权限。

(最少访问权限)私人<默认<受保护<公共(最多访问)

下表总结了关于同一包或者其他包和子类中不同类的上述访问修饰符。

让我们写一些简单的类,其中我们将看到Java访问修饰符的作用。

TestA.java

package com.theitroad.access;

class TestA {

	public void methodPublic(){
		methodPrivate();
	}
	
	protected void methodProtected(){
		methodPrivate();
	}
	
	void methodDefault(){
		methodPrivate();
	}
	
	private void methodPrivate(){}
}

请注意,TestA类具有默认访问权限,私有类方法可用于同一类的所有其他部分。

TestB.java

package com.theitroad.access;

import com.theitroad.access.TestA;

public class TestB {

	public static void main(String args[]) {
		new TestA().methodPublic();
		new TestA().methodProtected();
		new TestA().methodDefault();

	}

	public void methodPublic() {

	}

	protected void methodProtected() {

	}

	void methodDefault() {

	}

	private void methodPrivate() {
	}

}

请注意,TestB与TestA类位于同一包中,因此它可以访问其类成员。
私有成员不可访问,但由于相同的软件包,所有其他成员均可访问。

TestC.java

package com.theitroad.access.child;

import com.theitroad.access.TestB;

public class TestC {

	public static void main(String[] args) {
		new TestB().methodPublic();
	}

}

由于TestB类是公开的,因此可以访问。
由于TestC类不在同一个包中,也不在其TestB的子类中,因此只能访问TestB类的公共成员。

TestE.java

package com.theitroad.util;

import com.theitroad.access.TestB;

public class TestE extends TestB {

	public static void main(String[] args) {
		new TestB().methodPublic();
		new TestB().methodProtected(); //compile time error

		//works, accessing super class protected method using subclass
		new TestE().methodProtected();

	}

}

由于TestE类是TestB的子类,因此我们可以通过子类TestE访问受TestB保护的成员。
如果尝试直接访问超类受保护的方法,则会收到编译时错误。

这就是java访问修饰符的全部内容,很容易理解。
只是不要混淆默认访问和受保护的访问。