面向对象-继承类的特点
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.继承中成员变量的特点
super和this的用法相同:
(1)this代表本类的引用;
(2)super代表父类的引用;
this可以用来区分局部变量和成员变量重名的情况.
super可以用来区分子父类中的成员.
子类要调用父类构造函数时,可以使用super语句.
package cn.org.yinzhengjie.extemdPackage; /** * 定义父类 * @author 尹正杰 * */ public class Father { int money = 5000000; public void showMoney() { System.out.println("Father has " + money + " 人名币"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 定义子类 * @author 尹正杰 * */ public class Son extends Father { int money = 1000000; /* * 当子父类中出现同名的成员变量时,为了区分着两个变量,在子类中用this调用的时子类的变量,在子类中用super调用的时父类的变量。 * * this代码 是本类对象的引用,super代表的是父类的存储空间。 * * 综上所述,this可用用来区分局部变量和成员变量重名的情况,super可以用来区分子父类中成员变量重名的情况。 * * 温馨提示: * 虽然上面提到了变量重名的解决方案,但实际生产开发环境中,应该尽量不要出现变量名重名的情况哟~ */ public void showMoney() { int money = 3000000; System.out.println("Son has " +(this.money + super.money) + " 人名币"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 测试继承类 * @author 尹正杰 * */ public class ExtendDemo { public static void main(String[] args) { Son son = new Son(); son.showMoney(); } }
二.继承中成员函数的特点
子类中出现与父类一模一样的方法时,会出现覆盖操作(override),也称为重写或者复写。 父类中的私有方法不可以被覆盖。 在子类覆盖方法中,继续使用被覆盖的方法可以通过"super.函数名"获取。 覆盖注意事项: 覆盖时,子类方法权限一定要大于等于父类方法权限; 静态只能覆盖静态; 覆盖的应用: 当子类需要父类的功能,而功能主体子类有自建特有内容时,可以复写父类中的方法,这样既沿袭了父类的功能,又定义了子类特有的内容。
package cn.org.yinzhengjie.extemdPackage; /** * 定义父类 * @author 尹正杰 * */ public class Father { int money = 5000000; void showMoney() { System.out.println("Father has " + money + " 人名币"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 定义子类 * @author 尹正杰 * */ public class Son extends Father { int money = 1000000; /* * 子父类中成员函数的特点: * 当子父类出现一模一样的函数时,子类对象在调用该函数时,运行的是子类中的函数,父类中的函数会被子类的 * 函数所覆盖(重写,复写,override),这和我们之前学习过另外一个函数的特性重载(overload)有所不同。 * */ void showMoney() { /* * 因为子父类中均出现了同名的方法,为了区分,可以使用super关键字完成 */ super.showMoney(); int money = 3000000; System.out.println("Son has " + money + " 人名币"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 测试继承类 * @author 尹正杰 */ public class ExtendDemo { public static void main(String[] args) { Son son = new Son(); son.showMoney(); } }
三.继承中构造函数的特点
子类中所有的构造函数默认都会访问父类中空参数的构造函数;
因为在子类中每个构造函数的第一行都有默认的语句super();
子类会继承父类中的数据,所以要先明确父类是如何对这些数据初始化的;
当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。
package cn.org.yinzhengjie.extemdPackage; /** * 定义父类 * @author 尹正杰 * */ public class Father { Father() { System.out.println("Father 空参构造函数..."); } Father(int money) { System.out.println("Father 有参构造函数..." + money + "万"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 定义子类 * @author 尹正杰 * */ public class Son extends Father { Son() { //super(); //子类隐式存在这一行调用,如果我们不写这一行,JVM默认会给咱们加上~ System.out.println("Son 构造函数"); } Son(int money) { super(money); //子类显式指定父类的构造函数 System.out.println("Son 构造函数"); } }
package cn.org.yinzhengjie.extemdPackage; /** * 测试继承类 * @author 尹正杰 */ public class ExtendDemo { public static void main(String[] args) { Son son = new Son(); Son son2 = new Son(50); } }