权限修饰符是什么?有哪些?
权限修饰符,通俗点来说就是访问和使用,不同的权限范围不一样
权限修饰符有:public,private,protected,default
权限修饰符怎么写?
权限修饰符直接写在在类的最前面,方法的最前面,全局变量的最前面就行
默认不写就是default. 如果你想要显示的写出default 则要在接口或者switch中才能写.
这边你写default void fun(){}会报错
类(即第一行的那个class)只能用public来修饰
什么时候用哪个好点?
public
public是范围最大的.只要是用这个修饰符修饰的东西.那么在这个项目中哪里都能范围到.
上面的那个在model包里,下面的在service包底下的又一个小包中.
但是底下的那个SerialNumberService里面用public以外的东西修饰.上面那个RequestResult就访问不到了.
所以如果你想要某一个方法,某一个变量要所有人都能用,那么你就用Public修饰
public是用的最多的权限修饰符
private
private是访问最小的,它不能修饰类,也就是不能private class 这样写,不然报错.
它只能写在方法和变量的最前面.
private int num = 0;
private int getNum(){}
类似这样写.
被private修饰的东西只能在当前这个类用.通俗点就是只能有在当前这个.java文件用.
在messageConstant里用private修饰的东西只能在messageConstant里使用
所以如果你想要某个方法或者变量只在当前这个文件内使用,它永远不会被别的java文件需要.那么你就用private修饰
当然,如果某一天,你要这个方法或者变量为别的java文件使用.private改成public就行啦
default
当方法,或成员变量不写权限修饰符时,它的权限修饰符就是default,default同样不能写在类前面,即default class 这样会报错
但是class能被default修饰. 即直接写class 名称是不会报错的
default的范围如何?这个包内的所有类都能用,
比如在BaseConstant写一个 void fun(){} 用default修饰的方法.
那么它只有底下两个在同一个包里的MessageConstant和OrderStutusConstant能够使用,
在另外一个包里的AppVersionController就用不到了
方法和变量默认不写就是default,但如果我偏要写呢?
你会发现default void fun(){}你这样写它会报错.没错就是不给你写.
但它确实是一个存在的关键字.
但什么时候能写default呢?
使用switch时能写,这个default表示所有条件不符合时执行
接口中定义default时,必须写.否则报错
所以,什么时候用default?
1,你要它只能在当前这个包内用时,永远不会别被的包内的类使用,用default.
2,使用switch时,所有条件都不符合时执行的代码,用default
default的使用比较少.
protected
protected访问范围
1,包内可见
2,继承可见,子类直接从父类继承下来的protected方法可见.但父类实例的protected的方法不可见.即
package package1;
public class Father { protected void fun(){}}
package package2;
public class Child extend Father{
public void test(){
Father father = new Father();
father.fun();//报错
fun();//编译通过
}
}
同样,protected不能修饰class,即protected class会报错
protected用的不多
在你要使用protected方法前.分析一下它的来源(来自那个包)。就能够确定它的可见范围
看一下以下几个例子,来了解下protected的可见性
package package1;
public class Father { protected void fun(){}}
package package1;
public class Child1 extend Father{}
package package1;
public class Child2 extend Father{}
package package1;
public class Text1{
public void test(){
Child1 child1 = new Child1();
Child2 child2 = new Child2();
child1.fun();//通过
child2.fun();//通过
}
}
package package2;
public class Text2{
public void test(){
Child1 child1 = new Child1();
Child2 child2 = new Child2();
child1.fun();//错误
child2.fun();//错误
}
}
fun()方法来自Father 所以Father的子类以及其同一个包里的类可见
Test1类与Father在同一个包内,所以可见。两个Child实例可以访问fun()方法
对与Test2中的fun()方法,它在Child1和Child2类是可见的.但对Text2不可见.所以编译错误
更多的例子可查看菜鸟教程的
http://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html