继承的细节--重名与静态绑定

继承和多态概念还有一些相关的细节,具体包括:

  • 构造方法
  • 重名与静态绑定 now!
  • 重载和重写
  • 父子类型转换
  • 继承访问权限(protected)
  • 可见性重写
  • 防止继承(final)

重名

对于private变量和方法,它们只能在类内被访问,访问的也永远是当前类的对象。

对于public变量和方法,在类内访问的是当前类的,但子类可以通过super.明确指定访问父类的。

在类外,则要看访问变量的静态类型,静态类型是父类,则访问父类的变量和方法;静态类型是子类,则访问子类的变量和方法。

接下来举个栗子。父类Base代码如下:

1
2
3
4
5
6
7
8
9
//父类
public class Base {
public static String s = "static_base";
public String m = "base";

public static void staticTest() {
System.out.println("base static: "+s);
}
}

Base类定义了一个public静态变量s,一个public实例变量m、一个静态方法staticTest。

子类Child代码如下:

1
2
3
4
5
6
7
8
public class Child extends Base {
public static String s = "child_base";
public String m = "child";

public static void staticTest() {
System.out.println("child static: "+s);
}
}

子类定义了和父类重名的变量m、s和方法staticTest。

对于一个子类对象,它就有了两份变量和方法。在子类内部访问的时候,访问的是子类的。子类变量和方法隐藏了父类对应的变量和方法。

调用代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
Child c = new Child();
Base b = c;

System.out.println(b.s);
System.out.println(b.m);
b.staticTest();

System.out.println(c.s);
System.out.println(c.m);
c.staticTest();
}

创建一个子类对象new Child(),然后将该对象分别赋值给子类引用变量c和父类引用变量b。

再通过b和c分别引用变量和方法。

输出结果为:

1
2
3
4
5
6
static_base
base
base static: static_base
child_base
child
child static: child_base

通过b(静态类型Base)访问时,访问的是Base的变量和方法。通过c(静态类型Child)访问时,访问的是Child的变量和方法。

这叫做静态绑定,即访问绑定到变量的静态类型。

实例变量、静态变量、private方法,都是静态绑定的。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021 Silver Shaded
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信