举例详解Java中的访问权限修饰符
访问权限符:
(1)public:
对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中。
对于类来说: 也是一样。
(2)friendly:
对于成员老说:如果一个类的成员没有任何权限修饰,那么它门就是缺省包访问权限,用friendly来表示,注
意friendly不是Java中的关键字,这里是个人喜欢的方式用它表示而已。同一个包内其它类可以访问,但包外
就不可以。对于同一个文件夹下的、没有用package的classes,Java会自动将这些classes初见为隶属于该目录
的defaultpackage,可以相互调用class中的friendly成员。如以下两个class分别在同一个文件夹的两个文件
中,虽然没有引入package,但隶属于相同的defaultpackage。
classSundae{ //以下两个方法缺省为friendly Sundae(){} Voidf(){System.out.println(“Sundae.f()”); } publicclassIceCream{ publicstaticvoidmain(String[]args){ Sundaex=newSundae(); x.f(); } }
对于类来说:同一个包中的类可以用。总之,类只可以声明为public或者friendly。
(3)private:
对于对于成员来说:只能在该成员隶属于的类中访问。
classSundae{ privateSundae(){}//只能在Sundaeclass中被调用 Sundae(inti){} staticSundaemakASundae(){ returnnewSundae(); } } publicclassIceCream{ publicstaticvoidmain(String[]args){ //Sundaeclass中构造函数Sundae()是private, //所以不能用它进行初始化 //Sundaex=newSundae(); Sundaey=newSundae(1);//Sundae(int)是friendly,可以在此调用 Sundaez=Sundae.makASundae(); } }
对于类来说:类不可以声明为private。
(4)protected:
对于对于成员来说:相同包中的类可以访问(包访问权限);基类通过protected把基类中的成员的访问权限赋予派生类不是所有类(派生类访问权限)。
(5)default(默认权限)
类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。
例子:packagec05.local;
importpack1.Cookie; //注意:在这里ChocolateChip继承了类Cookie,按道理bite()方法也在 //ChocolateChip中,可以用x.bite直接调用,但是不可以的,因为类ChocolateChip //和Cookie类不在一个包中,各自具有包访问权限,为了能够使用x.bite()必须要把 //Cookie方法的访问权限换成public或者protected,但是一旦换成public所有的人就 //可以访问了,这样达不到隐私的要求,所以设置成protected最好,既可以顺利访问,也可以 //避免外面的类调用,保护好隐私的作用 publicclassChocolateChipextendsCookie{ publicChocolateChip(){ System.out.println("ChocolateChipconstructor"); } publicstaticvoidmain(String[]args){ ChocolateChipx=newChocolateChip(); x.bite();//Can'taccessbite } }///:~
packagepack1; publicclassCookie{ publicCookie() { System.out.println("Cookieconstructor"); } protectedvoidbite(){System.out.println("bite");} }
对于类来说:类不可以声明为protected
对于类的权限修饰,下面有更好的解释:
Class类的访问权限:
public:可以供所有的类访问。
默认:默认可以称为friendly但是,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++。默认的访问权限是包级访问权限。
即如果写了一个类没有写访问权限修饰符,那么就是默认的访问权限,同一个包下的类都可以访问到,即使可以实例化该类
(当然如果这个类不具有实例化的能力除外,比如该类没有提供public的构造函数)。
说明:
1、每个编译单元(类文件)都仅能有一个publicclass
2、publicclass的名称(包含大小写)必须和其类文件同名。
3、一个类文件(*.java)中可以不存在publicclass。
这种形式的存在的场景:如果我们在某个包内撰写一个class,仅仅是为了配合同包内的其他类工作,而且
我们不想再为了撰写说明文档给客户(不一定是现实意义的客户,可能是调用这个类的类)看而伤脑筋,而且有可能过一段时间之后
有可能会彻底改变原有的做法,并完全舍弃旧版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的static的成员(属性和方法)可以办到。
综合示例:
First.java:
packageNumber; importTest.*; publicclassFristextendsTest { protectedStrings1="你好"; publicstaticvoidmain(String[]args) { Strings2="java"; //System.out.println(s1); System.out.println(s2); Fristt=newFrist(); System.out.println(t.s); t.show(); return; } } Test.java: packageTest; publicclassTest { protectedStrings="hellotest";//可以被同包中的类访问以及子类访问,该子类可以是与包Test不同 publicvoidshow() { Test1t1=newTest1(); return; } } classTest1 { Test1() { Testt=newTest(); System.out.println(t.s); } }
输出:
java hellotest hellotest