面向对象-继承类的特点

               面向对象-继承类的特点

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

一.继承中成员变量的特点

  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 + " 人名币");
    }
    
}
Father.java
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) + " 人名币");
    }
    
}
Son.java
package cn.org.yinzhengjie.extemdPackage;

/**
 *     测试继承类
 * @author 尹正杰
 *
 */
public class ExtendDemo {

    public static void main(String[] args) {
        Son son = new Son();
        
        son.showMoney();
        
    }
}
ExtendDemo.java

 

二.继承中成员函数的特点

  子类中出现与父类一模一样的方法时,会出现覆盖操作(override),也称为重写或者复写。

  父类中的私有方法不可以被覆盖。

  在子类覆盖方法中,继续使用被覆盖的方法可以通过"super.函数名"获取。

  覆盖注意事项:
    覆盖时,子类方法权限一定要大于等于父类方法权限;
    静态只能覆盖静态;

  覆盖的应用:
    当子类需要父类的功能,而功能主体子类有自建特有内容时,可以复写父类中的方法,这样既沿袭了父类的功能,又定义了子类特有的内容。
package cn.org.yinzhengjie.extemdPackage;

/**
 *     定义父类
 * @author 尹正杰
 *
 */
public class Father {
    int money = 5000000;
    
    void showMoney() {
        System.out.println("Father has " + money + " 人名币");
    }
    
}
Father.java
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 + " 人名币");
    }
    
}
Son.java
package cn.org.yinzhengjie.extemdPackage;
/**
 *     测试继承类
 * @author 尹正杰
 */
public class ExtendDemo {
    
    public static void main(String[] args) {
        Son son = new Son();
        son.showMoney();
    }
}
ExtendDemo.java

 

 

三.继承中构造函数的特点

  子类中所有的构造函数默认都会访问父类中空参数的构造函数;

  因为在子类中每个构造函数的第一行都有默认的语句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 + "万");
    }
}
Father.java
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 构造函数");
    }
}
Son.java
package cn.org.yinzhengjie.extemdPackage;

/**
 *     测试继承类
 * @author 尹正杰
 */
public class ExtendDemo {
    
    public static void main(String[] args) {
        Son son = new Son();
        Son son2 = new Son(50);
    }
    
}
ExtendDemo.java

 

posted @ 2020-01-25 23:27  JasonYin2020  阅读(217)  评论(0编辑  收藏  举报