详解JAVA语言中的访问控制

来源:互联网 发布:arduino图形化编程软件 编辑:程序博客网 时间:2024/06/06 18:54
 
详解JAVA语言中的访问控制
 
JAVA中的访问控制包括两个方面:类的访问控制、类成员(方法和域)的访问控制。也就是说,其他类是否能够访问定义了访问控制级别的类或类成员。即定义了访问控制级别的类或类成员对其他类的可见性怎样。
每一个类和每一个类成员,都有唯一一个访问控制级别。它们是:
1、 public:任意类都可以访问
2、 protected:包内非子类访问、包内子类访问、包外子类访问
3、 默认(无访问控制修饰符):包内非子类访问、包内子类访问
4、 private:本类访问
对于类来说,只允许声明public和默认访问控制级别。而对于类成员来说,则可以声明以上四种访问控制级别,并且任何一种访问控制级别的类成员都对本类可见。
声明了访问控制级别的类或类成员对其他类的可见性是对以下类来说的:
1、 包内任何类(非子类)
2、 包内子类
3、 包外任何类(非子类)
4、 包外子类
 
下面根据以上四种不同的访问控制级别对四种不同位置的类的可见性做详细解释。
一、public类
如果一个类声明为 public,则所有其他类(包内、包外)都可以导入此类、创建此类的实例、扩展此类。
(一)   类成员:方法
public方法:
1、 包内任何类(非子类)都可以通过创建public类的实例来访问此方法。
2、 包内子类通过扩展public类可以创建子类或超类实例来访问此方法。
3、 包外任何类(非子类)都可以通过创建public类的实例来访问此方法。
4、 包外子类通过扩展public类可以创建子类或超类实例来访问此方法。
protected方法:
1、 包内任何类(非子类)都可以通过创建public类的实例来访问此方法。
2、 包内子类通过扩展public类可以创建子类或超类实例来访问此方法。
3、 包外任何类(非子类)不能通过创建public类的实例来访问此方法。
4、 包外子类通过扩展public类可以创建子类实例来访问此方法。
注意:
1、 包内子类可以创建子类或超类实例来访问此方法,而包外子类只能创建子类实例来访问此方法,而一定不能创建超类实例来访问此方法,虽然包外子类可以创建超类实例。
2、 错误:当一个包外子类通过扩展public类继承了超类的protected方法,此方法在包外子类中依然保持为protected(对包外子类的子类和同一个中非包外子类的子类来说),所以与包外子类在同一个包中的其他类(非包外子类的子类)可以通过创建包外子类的实例来访问此方法。
正确:实际上,当一个包外子类通过扩展public类继承了超类的protected方法,此方法在包外子类中则变为private(对同一个包中非包外子类的子类来说,而对包外子类的子类来说,依然为protected),所以与包外子类在同一个包中的其他类(非包外子类的子类)不能通过创建包外子类的实例来访问此方法,只有包外子类的子类可以通过创建包外子类的实例或包外子类的子类实例来访问此方法。
默认方法:
1、 包内任何类(非子类)都可以通过创建public类的实例来访问此方法。
2、 包内子类通过扩展public类可以创建子类或超类实例来访问此方法。
3、 包外的任何类都不能通过创建public类的实例来访问此方法。
Private方法:
1、 仅本类可以访问,本类外的其他类虽可以创建public类的实例,但不能访问此方法。
注意:子类不能继承超类的private方法。
(二)   类成员:域
public static final 域:
1、 本类可直接访问。
2、 包内任何类(非子类)都可以通过创建public类的实例来访问此域。
3、 包内子类通过扩展public类可直接访问或创建子类或超类实例来访问此域。(可在静态方法中访问public static final 域)
4、 包外任何类(非子类)都可以通过创建public类的实例来访问此域。
5、 包外子类通过扩展public类可直接访问或创建子类或超类实例来访问此域。(可在静态方法中访问public static final 域)
Protected域:
1、 包内任何类(非子类)都可以通过创建public类的实例来访问此域。
2、 包内子类通过扩展public类可直接访问或创建子类或超类实例来访问此域。(不能在静态方法中访问Protected域,特别是静态mian方法)
3、 包外任何类(非子类)不能通过创建public类的实例来访问此域。
4、 包外子类通过扩展public类可直接访问或创建子类实例来访问此域。(不能在静态方法中访问Protected域,特别是静态mian方法)
注意:
1、 包内子类可以创建子类或超类实例来访问此域,而包外子类只能创建子类实例来访问此域,而一定不能创建超类实例来访问此域,虽然包外子类可以创建超类实例。
2、 错误:当一个包外子类通过扩展public类继承了超类的protected域,此域在包外子类中依然保持为protected(对包外子类的子类和同一个包中非包外子类的子类来说),所以与包外子类在同一个包中的其他类(非包外子类的子类)可以通过创建包外子类的实例来访问此域。
正确:实际上,当一个包外子类通过扩展public类继承了超类的protected域,此域在包外子类中则变为private(对同一个包中非包外子类的子类来说,而对包外子类的子类来说,依然为protected),所以与包外子类在同一个包中的其他类(非包外子类的子类)不能通过创建包外子类的实例来访问此域,只有包外子类的子类可以通过创建包外子类的实例或包外子类的子类实例来访问此域。
默认域:
1、 包内任何类(非子类)都可以通过创建public类的实例来访问此域。
2、 包内子类通过扩展public类可直接访问或创建子类或超类实例来访问此域。(不能在静态方法中访问默认域,特别是静态mian方法)
3、 包外的任何类都不能通过创建public类的实例来访问此域。
Private域:
1、 仅本类可以访问,本类外的其他类虽可以创建public类的实例,但不能访问此域。
注意:对于子类来说,子类虽然拥有此域,但不能直接访问,必须通过超类的方法来访问此域。包内子类可通过超类的public方法、protected方法、默认方法访问超类的Private域。包外子类可通过超类的public方法、protected方法访问超类的Private域。
二、默认类
如果一个类声明为默认类,则只有同一个包内的其他类可以导入此类、创建此类的实例、扩展此类。
不管默认类的成员是何种访问控制级别,都仅限于同一个包中。 
原创粉丝点击