俗话说没有规矩就没有方圆,java作为一门严谨的面向对象的高级编程语言,自然对权限整个重要的问题有严格的控制。
Java一共有四种权限,private (私有),public(公有)。Protected(受保护)还有友好型。
在java里,这些语句都可以修饰类中的成员变量和方法,但是只有public和友好型可以修饰类。举个例子:
接下来就详细解释一下这几种权限的差别(博客最后有表格)按权限由低到高:(高权限有低权限所有特性)
Private:
类中的所有private方法和private 成员变量只能在类中访问而不能在其他类中访问。
例如:
packageMain;
publicclassPrivate {
privateinta;
privateintb;
Protected (){
this.a=1;
this.b=2;//a和b只能在Private类中调用
}
privatevoidset(){
System.out.println(""+a+""+b+"\n");
}
voidPrint(){
this.set();//只能在这里用;
}
}package Main;
public class Private {
private int a;
private int b;
Protected (){
this.a=1;
this.b=2;//a和b只能在Private类中调用
}
private void set(){
System.out.println(""+a+""+b+"\n");
}
void Print(){
this.set();//只能在这里用;
}
}
友好型和protected:
如果在另一个类中声明其他的一个类,如果这两个在一个包中那么另一个类能访问这个其他类的友好型变量不同包不能访问:
如果在另一个B类中声明其他的一个类A,如果这两个在一个包中那么另一个类B也能能访问这个其他类A的protected变量(或方法),如果不在一个包,那么如果类A有一个父类C如果,如果父类C中有一个protected变量(或方法),只要B,C在一个包中,B就能使用A中从父类继承的protected方法。如果A是B的子类,如果AB不在一个包中,那么A可以使用B中protected方法。
例如:
packageMain;
importProtected.*;
publicclassMain {
publicstaticvoidmain(String args[]){
Protected jkl=newProtected();
jkl.Print();//调用jkl父类的protect方法
Frindly prot =newFrindly();
System.out.println(prot.a);//在Main类中调用友好型的变量
prot.set();//在Main类中调用友好型的方法
}
}
packageMain;
publicclassFrindly {
inta,b,c,d;
Frindly(){
a=b=c=d=1;
}
voidset (){
System.out.print(""+a+" "+b+"\n");
}
}
packageMain;
publicclassProtectedfather{
protectedinta;
privateintb;
protectedProtectedfather (){
this.a=1;
this.b=2;//a和b只能在Protected中调用
}
privatevoidset(){
System.out.println(""+a+""+b+"\n");
}
protectedvoidPrint(){
this.set();//只能在这里用;
}
}
packageProtected;
importMain.*;
publicclassProtectedextendsProtectedfather{
publicProtected(){
super();//在另一个包中调用里父类中的protect构造方法
super.a=12;//调用父类的protect变量
}
}package Main;
import Protected.*;
public class Main {
public static void main(String args[]){
Protected jkl=new Protected();
jkl.Print();//调用jkl父类的protect方法
Frindly prot =new Frindly();
System.out.println(prot.a);//在Main类中调用友好型的变量
prot.set();//在Main类中调用友好型的方法
}
}
package Main;
public class Frindly {
int a,b,c,d;
Frindly(){
a=b=c=d=1;
}
void set (){
System.out.print(""+a+" "+b+"\n");
}
}
package Main;
public class Protectedfather{
protected int a;
private int b;
protected Protectedfather (){
this.a=1;
this.b=2;//a和b只能在Protected中调用
}
private void set(){
System.out.println(""+a+""+b+"\n");
}
protected void Print(){
this.set();//只能在这里用;
}
}
package Protected;
import Main.*;
public class Protected extends Protectedfather{
public Protected(){
super();//在另一个包中调用里父类中的protect构造方法
super.a=12;//调用父类的protect变量
}
}
Public:
如果类中的方法或者变量是public,那么就可以在别的类中调用,没有限制(用在夸包)。A带掉用别的包中的B类
packageMain;
importPublic.*;
publicclassMain {
publicstaticvoidmain(String args[]){
inta;
Public p=newPublic();//调用public类中的public方法
a=p.a;//调用Public类中的public变量
p.set();
}
}
packagePublic;
publicclassPublic {
publicinta=12;
publicvoidset (){
System.out.println("OK\n");
}
}package Main;
import Public.*;
public class Main {
public static void main(String args[]){
int a;
Public p=new Public();//调用public类中的public方法
a=p.a;//调用Public类中的public变量
p.set();
}
}
package Public;
public class Public {
public int a=12;
public void set (){
System.out.println("OK\n");
}
}
总结表格::
同一类
同包
不同包
子类
非子类
子类
非子类
Private
是
否
否
否
否
友好型
是
是
是
否
否
Protected
是
是
是
是
否
Public
是
是
是
是
是