概述
部分内容参考于 Java - Access Modifiers
Java的4种访问控制修饰符
Java使用访问控制修饰符(Access Modifiers)来保护对类、变量、方法和构造方法的访问。
- 共有的,以public 修饰符指定,对所有类可见。
- 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。
- 默认的,也称为 default,在同一包内可见,不使用任何修饰符(No Keyword)。
- 私有的,以 private 修饰符指定,在同一类内可见。
Java provides a number of access modifiers to set access levels
for classes, variables, methods, and constructors. The four access
levels are
- Visible to the package, the default. No modifiers are needed.
- Visible to the class only (private).
- Visible to the world (public).
- Visible to the package and all subclasses (protected).
可以采用以下表格形式描述方便大家记忆:
访问修饰符 | 类内部 | 当前包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
继承规则中的访问控制
方法的继承
Java中子类继承父类方法时,有如下规则:
- 父类或超类中的public方法,在子类中也必须是public。
- 父类中的protected方法,在子类中必须是protected或public,不能为private。
- 父类中private的方法不能被继承。
Access Control and Inheritance
The following rules for inherited methods are enforced.
- Methods declared public in a superclass also must be public in all subclasses.
- Methods declared protected in a superclass must either be protected or public in subclasses; they cannot be private.
- Methods declared private are not inherited at all, so there is no rule for them.
属性的继承
另外,对于子类继承父类属性(成员变量)需注意:
- 从父类继承的成员变量,其访问控制符仍然相同。
- 子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存;默认情况下,父类的成员变量是被隐藏的,如果你非要调用父类的成员变量可使用super关键字。
静态属性方法的继承
而对于静态属性(成员变量)与静态方法:
- 静态属性和静态方法可以被继承,但是不是被重写(override)而是被隐藏。这是因为静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。
- 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象;非静态方法可以被继承和重写,因此可以实现多态。
构造方法在继承关系下的调用
最后还有一点,请注意:
- Java继承中对构造函数是不继承的,只是隐式或显式的调用(显而易见,构造函数命名与类同名,子类和父类不可能同名,也就谈不上继承覆盖)。
Java中创建类的对象时,如果该类存在父类,则先调用父类的构造方法,然后再调用子类的构造方法。
- 如果父类没有定义构造方法,则调用编译器自动创建的不带参数的默认构造方法。(如果没有任何构造方法,系统会默认有一个无参构造方法)
- 如果父类定义了public的无参的构造方法,则在调用子类的构造方法前会自动先调用该无参的构造方法。
- 如果父类只有有参的构造方法,没有无参的构造方法,则子类必须在构造方法中必须显式调用super(参数列表)来指定某个有参的构造方法。(因为创建有参构造方法后,系统就不再有默认无参构造方法了)
- 如果父类定义了无参的构造方法,也有有参的构造方法,则子类可以指定调用某个构造方法,如果没有指定,则调用无参构造方法。
- 如果父类定义有无参的构造方法,但无参的构造方法声明为private,则子类同样必须在构造方法中必须显式调用super(参数列表)来指定某个有参的构造方法。
- 如果父类定义有无参的构造方法,但无参的构造方法声明为private,而且没有其他的有参构造方法,则子类无法创建。
最后
以上就是笨笨蚂蚁为你收集整理的Java访问控制修饰符与继承Java的4种访问控制修饰符继承规则中的访问控制的全部内容,希望文章能够帮你解决Java访问控制修饰符与继承Java的4种访问控制修饰符继承规则中的访问控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复