有两种类型的修饰符在Java:访问修饰符和non-access修饰符。
用Java访问修饰符指定字段的可访问性或范围,方法,构造函数或类。我们可以改变字段的访问级别,构造函数,通过应用方法和类的访问修饰符。
有四种类型的Java访问修饰符:
- private私人:私人的访问级别修改器只是在类。它不能从外部类访问。
- default默认值:一个默认的访问级别的修饰符只在包中。不能从包的外部访问它。如果你不指定任何访问级别,它将默认。
- protected保护:保护修饰符的访问级别是在外面的包和包通过子类。如果你不使子类,它不能从包的外部访问。
- public公众:公共修饰词无处不在的访问级别。它可以从内部访问类,在类外,在包和外部包。
理解Java访问修饰符
让我们了解Java的访问修饰符由一个简单的表。
访问修饰符 | 内部类 | 内包 | 以外包的子类 | 外面的包装 |
---|---|---|---|---|
Private | Y | N | N | N |
默认的 | Y | Y | N | N |
Protected | Y | Y | Y | N |
Public | Y | Y | Y | Y |
私有访问修饰符只能在类中访问。
私有访问修饰符的简单示例
【Java访问修饰符】在本例中,我们创建了两个类A和Simple。类包含私有数据成员和私有方法。我们从类外部访问这些私有成员,因此存在编译时错误。
class A{
private int data=http://www.srcmini.com/40;
private void msg(){System.out.println("Hello java");
}
}public class Simple{
public static void main(String args[]){
A obj=new A();
System.out.println(obj.data);
//Compile Time Error
obj.msg();
//Compile Time Error
}
}
私人构造器的角色
如果将任何类构造函数设为私有,则无法从类外部创建该类的实例。例如:
class A{
private A(){}//private constructor
void msg(){System.out.println("Hello java");
}
}
public class Simple{
public static void main(String args[]){
A obj=new A();
//Compile Time Error
}
}
注意:除嵌套类外,类不能是私有的或受保护的。2) Default
如果你不使用任何修饰符,默认情况下它被视为默认值。默认的修饰符只能在包中访问。不能从包外部访问它。它提供了比私有更多的可访问性。但是,它比受保护的、公共的限制更多。
默认访问修饰符的示例
在本例中,我们创建了两个package pack和mypack。我们从类的包外部访问它,因为类不是公共的,所以不能从包外部访问它。
//save by A.java
package pack;
class A{
void msg(){System.out.println("Hello");
}
}
//save by B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
//Compile Time Error
obj.msg();
//Compile Time Error
}
}
在上面的例子中,类A的作用域及其方法msg()是默认的,因此不能从包外部访问它。
3) Protected
受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。
受保护的访问修饰符可以应用于数据成员、方法和构造函数。它不能应用到课堂上。
它提供了比默认修改器更多的可访问性。
受保护的访问修饰符的示例
在本例中,我们创建了两个包pack和mypack。类包包是公共的,因此可以从包外部访问。但是这个包的msg方法被声明为受保护的,所以只能通过继承从类外部访问它。
//save by A.java
package pack;
public class A{
protected void msg(){System.out.println("Hello");
}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
obj.msg();
}
}
Output:Hello
4) Public
公共访问修饰符在任何地方都是可访问的。在所有其他修饰词中,它的范围最广。
公共访问修饰符的示例
//save by A.javapackage pack;
public class A{
public void msg(){System.out.println("Hello");
}
}
//save by B.javapackage mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
Output:Hello
具有方法覆盖的Java访问修饰符
如果你覆盖了任何方法,那么被覆盖的方法(即在子类中声明的方法)不能有更多的限制。
class A{
protected void msg(){System.out.println("Hello java");
}
}public class Simple extends A{
void msg(){System.out.println("Hello java");
}//C.T.Error
public static void main(String args[]){
Simple obj=new Simple();
obj.msg();
}
}
默认的修饰符比protected的约束更多。这就是为什么存在编译时错误的原因。
推荐阅读
- Java封装
- Java包package
- Java接口
- Java抽象类和接口的区别
- Java抽象类
- Java instanceof操作符
- Java静态绑定和动态绑定
- Java多态性
- Java实例初始化块