Java访问控制修饰符与继承

部分内容参考于 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,而且没有其他的有参构造方法,则子类无法创建。

猜你喜欢

转载自blog.csdn.net/woaixiaoyu520/article/details/77451050