Java语言中有关访问权限的修饰符一共有4种:
public protect friendly private
在初学阶段非常容易搞混,记不清,也不知道在什么时候该用哪一个…
首先,记住这张表
作用域 | 当前类 | 同一package | 子孙类 | 其他package |
---|---|---|---|---|
private | √ | × | × | × |
friendly | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
意思是说
1.private:
被private修饰的内容,除了拥有该内容的类自己能够访问或调用外,其余地方一律不能直接访问或调用,是一个类的私有财产,个人财产,神圣不可侵犯。
2.friendly:(也叫default)
当我们在写代码时,如果不加任何访问修饰符,虚拟机会默认为我们加上friendly,但是你不能自己写一个,它是一个隐式声明,被它修饰后,只有当前类和同一包下的内容可以访问。
3.protected:
加上修饰符protected后,当前类、同一包都可以访问,同时当前类的子类也可以访问(子类可以在其他包中),你可想象成是,保护自家族的财产,自家地里可以用,自己的孩子也可随便用。
!详细说明,protected的可见性在于两点:
1. 基类的protected成员是包内可见的,并且对子类可见; 2. 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。4.public:
共有属性,应该是见的最多的,一个工程内所有地方都能用,谁都可以用。
!其中只有default和public才能修饰一个类(内部类除外)
那么,在设计程序时,什么场景下该用哪一个呢?
1.private
在设计一个类时,一般的成员变量,都要加上private,并加上对应的getter、setter方法,方法对外公开,这是为了保证封装性。
class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public Person() {
}
}
如果,你不希望其他任何对象对该类拥有访问权,你可以把所有的构造器都指定为private的,从而阻止外部对该类的对象的创建。 这个时候,该类的对象就只能在其static成员内部进行创建。一般会在单例设计模式中出现。
class Test {
// private Constructor!
private Test() {}
// Allow creation via static method:
public static Test getTest() {
return new Test();
}
}
2.friendly(default)
当你希望一个类,或某一个类中的成员只能在所在包中被访问时,就可以不写访问修饰符,即默认为friendly,构成包访问权限,在同一包中可以随意访问。
3.protected
有些程序员认为,将大多数的实例域定义为protected是一个不错的主意,这样,子类才能在需要的时候直接访问它们。然而,protected机制并不能带来更好的保护,原因有两点:
1.子类是无限制的,任何一个人都能够由某个类派生一个子类,并编写代码直接访问protected的实例域,从而破坏了封装性。
2.在Java程序设计语言中,在同一包中的所有类都可以访问protected域,而不管它是否为这个类的子类。
不过,protected方法对于指示那些不提供一般用途而应在子类中重新定义的方法很有用。
总结:
在学习过程中,我对Java访问权限修饰符的总结如下:
1.protected和默认(default)出现较少,在自己进行设计程序时,一般也不要使用。
2.自己设计一个一般类时,类修饰为public,类中成员变量都修饰为private,并设置getter、setter方法,类中一般方法都修饰为public。(这一条记为保证封装性!)
3.在一些设计模式中,有时类中所有的构造方法都修饰为private,即构造方法私有化,以防止该类产生实例化对象。