赞
踩
目录
示意图
private | (default) | protected | public | |
本类 | Yes | Yes | Yes | Yes |
同包的类 | No | Yes | Yes | Yes |
不同包的父子关系 | No | No | Yes | Yes |
不同包的非父子关系 | No | No | No | Yes |
注意点:外部类只能由public或不写修饰符(default)修饰。
1、可以修饰成员属性,构造方法(若是修饰了构造函数,且构造函数只有一个,则该类不能在外部类创建对象,或者被其他类继承(因为继承时,会先调用父类的构造函数),其他修饰符按照各自修饰范围限制),成员方法,内部类,不能修饰外部类。
2、被private修饰的成员,只能在定义它们的类中使用(也就是定义类的{},大括号里面),在其他类中不能访问。
默认不写修饰符,就是默认权限,不能主动写default关键字,否则编译器会报错。
1、类,成员属性,构造方法,成员方法都能使用默认权限,只需不写任何修饰符关键字即可。
2、默认权限即同包权限,同包权限只能由本类以及同包的类访问。
1、可以修饰成员属性,构造方法,成员方法,内部类。
2、被protected修饰的成员,能在定义它们的类或同包的类被访问。
3、如果有不同包的类想访问调用它们,那么这个类必须是定义它们的类的子类。(在该类的{}中,通过this或者创建该类的对象访问它们,不能通过创建定义类对象访问)。
如下图,Test类的msg成员属性被protected修饰符修饰,
不同包下的Red想要访问msg属性,则只能通过继承Test类,然后通过this.msg访问,或创建Red对象red,通过red.msg访问。
在Red类中,创建Test对象test,不能通过test访问msg。
1、可以修饰类,成员属性,构造方法,成员方法。
2、被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
判断是否可访问成员的逻辑:
类A若想通过对象(类B或类B的子类)访问类B的成员,先判断对象是否拥有该成员(例如对象类型是类B的子类,子类是否能正常继承类B的成员),若是对象拥有该成员,则根据成员的修饰符、类A与类B(定义成员的类)的关系(是否在同一个包、是否是父子关系等)判断是否可访问该成员。
例如类A中,通过创建类C(继承了类B)对象c访问类B的成员msg,因为类B的msg属性修饰符为protected,所以类C能继承类B的msg属性,且类A和类B在同一个包中,符合protected的要求,所以在类A中,能通过c访问msg属性。
假设将类A移到类C包中,没与类B在同一个包中,且类A没继承类B,则不符合protected的要求,所以无法通过c对象访问msg属性。
如想访问到类B的msg属性,只能与类B同一个包,或者继承类B,在类A中通过this.msg或者创建类A的对象访问msg属性。
参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。