Java 访问修饰符,在练习 java 程序时,您必须已经看过公共,私有和受保护的关键字,这些被称为访问修饰符。访问修饰符限制对另一个类中的类,构造函数,数据成员和方法的访问。在 java 中我们有四个访问修饰符:
- 默认
private
protected
public
默认访问修饰符
当我们没有提到任何访问修饰符时,它被称为默认访问修饰符。此修饰符的范围仅限于包。这意味着如果我们在包中有一个具有默认访问修饰符的类,则只有此包中的那些类才能访问此类。此程序包之外的其他任何类都无法访问此类。类似地,如果我们在类中有一个默认方法或数据成员,它将在另一个包的类中不可见。让我们看一个例子来理解这个:
Java 中的默认访问修饰符示例
要理解这个例子,你必须具备 java 中包的知识。
在这个例子中我们有两个类,Test
类试图访问Addition
类的默认方法,因为类Test
属于不同的包,这个程序会抛出编译错误,因为默认修饰符的范围仅限于同一个包中宣布它。
Addition.java
package abcpackage;
public class Addition {
/* Since we didn't mention any access modifier here, it would
* be considered as default.
*/
int addTwoNumbers(int a, int b){
return a+b;
}
}
Test.java
package xyzpackage;
/* We are importing the abcpackage
* but still we will get error because the
* class we are trying to use has default access
* modifier.
*/
import abcpackage.*;
public class Test {
public static void main(String args[]){
Addition obj = new Addition();
/* It will throw error because we are trying to access
* the default method in another package
*/
obj.addTwoNumbers(10, 21);
}
}
输出:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method addTwoNumbers(int, int) from the type Addition is not visible
at xyzpackage.Test.main(Test.java:12)
私有访问修饰符
private
修饰符的范围仅限于类。
- 私有数据成员和方法只能在类中访问
- 类和接口不能声明为私有
- 如果某个类具有私有构造函数,那么您无法从该类外部创建该类的对象。
让我们看一个例子来理解这个:
java 中的私有访问修饰符示例
此示例抛出编译错误,因为我们尝试在类Example
中访问类ABC
的私有数据成员和方法。私有数据成员和方法只能在类中访问。
class ABC{
private double num = 100;
private int square(int a){
return a*a;
}
}
public class Example{
public static void main(String args[]){
ABC obj = new ABC();
System.out.println(obj.num);
System.out.println(obj.square(10));
}
}
输出:
Compile - time error
受保护的访问修饰符
受保护的数据成员和方法只能由同一个包的类和任何包中的子类访问。您还可以说受保护的访问修饰符与默认访问修饰符类似,但有一个例外是它在子类中具有可见性。
类不能声明受保护。此访问修饰符通常用于父子关系。
Java 中的受保护访问修饰符示例
在此示例中,另一个包中存在的类Test
能够调用addTwoNumbers()
方法,该方法被声明为protected
。这是因为Test
类扩展了类Addition
,而protected
修饰符允许在子类(在任何包中)访问受保护的成员。
Addition.java
package abcpackage;
public class Addition {
protected int addTwoNumbers(int a, int b){
return a+b;
}
}
Test.java
package xyzpackage;
import abcpackage.*;
class Test extends Addition{
public static void main(String args[]){
Test obj = new Test();
System.out.println(obj.addTwoNumbers(11, 22));
}
}
输出:
33
公共访问修饰符
可以从任何地方访问声明为public
的成员,方法和类。此修饰符不对访问权限施加任何限制。
java 中的公共访问修饰符示例
让我们看一下上面看到的相同的例子,但这次方法addTwoNumbers()
有public
修饰符,类Test
能够访问这个方法,甚至不需要扩展Addition
类。这是因为公共修饰符随处可见。
Addition.java
package abcpackage;
public class Addition {
public int addTwoNumbers(int a, int b){
return a+b;
}
}
Test.java
package xyzpackage;
import abcpackage.*;
class Test{
public static void main(String args[]){
Addition obj = new Addition();
System.out.println(obj.addTwoNumbers(100, 1));
}
}
输出:
101
让我们以表格形式查看这些访问修饰符的范围:
表格形式的访问修饰符的范围
------------+-------+---------+--------------+--------------+--------
| Class | Package | Subclass | Subclass |Outside|
| | |(same package)|(diff package)|Class |
————————————+———————+—————————+——————————----+—————————----—+————————
public | Yes | Yes | Yes | Yes | Yes |
————————————+———————+—————————+—————————----—+—————————----—+————————
protected | Yes | Yes | Yes | Yes | No |
————————————+———————+—————————+————————----——+————————----——+————————
default | Yes | Yes | Yes | No | No |
————————————+———————+—————————+————————----——+————————----——+————————
private | Yes | No | No | No | No |
------------+-------+---------+--------------+--------------+--------