super的三种用法:
super.父类成员变量
super.父类成员方法
super();//调用父类构造方法
然后对着三种用法做了一个介绍:
1.调用父类的构造方法
在下面的代码中,进行了一个简单的类的继承。
关于调用父类的构造方法我写了两种格式,一种是隐式的调用父类的构造方法,一种是显示的调用父类的构造方法。
隐式的调用:什么都不写,程序会默认去调用其父类的构造方法。
详情如下:
首先我们要注意一下:
必须在子类的构造方法中对父类的构造方法进行调用,不能在子类的其他方法中。
调用父类的构造方法的代码,必须写在子类构造方法的第一行。
在上面的代码中,写了三个类。测试类,和一个Fu类,还有一个Zi类。
其中,Zi类继承了Fu类。
其中Fu类中有两个构造方法,一个是无参的,一个是有参的。Zi类也有两个构造方法,
一个是有参的,一个是无参的。仔细观察,会看到,Zi类中的构造方法并没有显式的去调用父
类的构造方法。那么,按照我上面说的,程序会默认的去调用父类的无参构造方法。
在主类中,我们分别实例化了两个Zi的对象。第一个调用子类的无参构造,第二个调用子
类的有参构造。
按照上面所说,那么,在调用子类的无参构造方法之前会先调用父类的无参构造方法。同样,
在调用子类的带参构造方法之前会先调用子类的无参构造方法。所以上面程序的运行结果会是:
显示的调用:就是直观的用代码写出来去调用。
根据上面的说话,结果都是一样的。
这样就是super调用父类的构造方法的两种形式。
然后我们说一下调用父类的成员方法和成员变量
super.父类成员变量
super.父类成员方法
当子类继承了父类,那么就会继承其属性和方法。既然已经继承了,那就可以直接用,为什么反而要去调用父类的呢。
这就涉及到了一个覆盖重写的概念。覆盖重写,指的是,子类将父类的属性或者方法重新定义
了一次。属性的名字类型都一样;方法的名字,参数,返回值类型,访问权限(最好相同)都一样,
只是方法体不同。
代码如下:
上面的代码中,Fu类中有一个test方法,Zi类中将test方法覆盖重写了。然后可以看到。
在Zi类中test方法,可以通过super.test();调用父类的test方法。也可以通过super.a
调用父类的a属性。
代码运行结果如下:
这就是super关键字的 super.父类成员变量和super.父类成员方法的用法。
附加说明一下:
1.子类的构造函数如果要引用super的话,必须把super放在函数的首位
2.super 在子类引用父类的属性或者方法的时候使用;super 是相对于继承而言的;
super 代表的是当前类的父类,相似的,this 是代表当前类。
3.当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变
量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员
变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量。
好了,我的总结就这么多了,让我们下期再见。