一说到Java访问权限大家想到的一定是 public
, protected
,以及 private
。如果你心里想的也是这三个访问权限那就错了,其实还有一个访问权限是经常被大家忽视的,那就是 包访问权限
。
protected: 只有继承的子类可以访问该关键字修饰的成员。 注意同一个包内的其他类也可以访问protected修饰的成员。 也就是说在同一个包内,除了明确标记为private的,其他都能访问。
private:除了在定义的类内部可以访问该成员,其他类都不可以访问。
包访问权限:在同一个包内可以互相访问。 注意没有被以上三个关键字修饰的成员,都是包访问权限 。所以在Java的世界里每个属性都是有访问权限的。
看具体的例子。
//注意我的包名 package com.frank.demo.access.box1; public class Cat { public String name; private String color; protected int weight; //没有被任何权限关键字修饰 包访问权限 void call(){ System.out.println("喵喵"); } public void sayColor(){ //private color 属性只能在这个类内部被访问。 this.color = "blue"; System.out.println("this is a" + this.color + "cat"); } }
和Cat类在同一个包下的Children.
package com.frank.demo.access.box1; public class Children { public static void main(String[] args){ Cat cat = new Cat(); //public 可以访问。 cat.name = "tom"; //protected weight 在同一个包下即便是protected也可以访问 cat.weight = 30; //包访问权限,可以访问因为在同一个包下。 cat.call(); //private color 不可以访问。 //cat.color; } }
再来看另外一个Children 和Cat不在同一个包下。
package com.frank.demo.access.box2; import com.frank.demo.access.box1.Cat; public class Children { public static void main(String[] args){ Cat cat = new Cat(); //public 可以访问 cat.name = "tom"; //protected 不可以访问,不在同一个包下,而且不存在继承关系。 //cat.weight; //private 不可以访问 //cat.color; //包访问权限,不在同一个包下,不可以访问。 //cat.call(); } }
以上三段简单的代码基本说清楚了,Java访问权限的事情。大家一定要仔细看我的代码注释部分哦!
Java设计了这样一套访问控制权限的意义就在于让我们写出更灵活更具可维护性的代码。
比如我们设计的类库有些细节和使用者没有关系,甚至我们都不希望让使用者看到它,更别说修改它了,我们可以把它设计成private的。而且把某些属性和方法设计成private对我们自己有个好处就是随时可以改变它,而不用担心对使用者造成任何影响。
每个程序员都希望自己写的代码被很多人用到,如何把自己的类库写的优雅完美,掌握Java访问权限只是一个最基本的要素点。希望大家能够在实战中多多理解这些规则,做到融会贯通。