【Java之继承 08】

一、继承:

1、语法:class  类型 extends 父类名{ }

2、java中继承只能单继承

3、B类继承A类:

  A类称作父类,基类,超类,superclass

  B类称作子类,派生类,subclass

4、子类继承父类会将父类中所有的数据全部继承,包括私有的也会继承,构造方法除外

5、私有的数据继承之后,虽然在子类中没有办法直接访问,可以间接访问。

6、继承最基本的作用是:代码重用。最重要的作用是:方法覆盖和多态。

package com.JavaStudy.study0427;

public class Animal {
    private String name;

    Animal(){}

    public void setName(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void move( ){

        System.out.println(getName()+" is moving!");
    }

}
package com.JavaStudy.study0427;

public class Fly extends Animal {

    Animal animal = new Animal();

    public void fly(){

        animal.setName("小燕子");
        System.out.println(animal.getName()+" is flying !");
    }
}
package com.JavaStudy.study0427;

public class Test {
    public static void main(String[] args){
        Fly fly = new Fly();

        //fly对象调用自己类的方法
        fly.fly();

        //Fly继承了Animal类,所以可以用fly的对象给Animal类的name赋值,同样也可以调用Animal类的moving()
        //子类不能直接访问父类的私有数据,但是可以通过set这样的间接方式访问
        fly.setName("小兔子"); //
        fly.move();
    }
}

二、super关键字

1、super不是引用类型,不保存内存地址,不指向任何对象

2、父类中有这个数据,结果子类中也有这个数据,非要在子类中访问父类中的那个数据,必须使用”super.“,除该情况外,其他程序都不需要加“super.”

3、super本质只是一个普通的关键字而已,是代表当前子类对象中的“父类型特征”

4、“super.”语法不能用在静态方法中,“super.”可以使用在成员方法中。super仅代表父类型

package com.JavaStudy.study0427;

public class SuperDemo01 {

    public static void main(String[] args){
        Manager m = new Manager();
        m.test();
        System.out.println(m);
    }
}


class Employee{
    String name = "TOM";

    public void work(){
        System.out.println("Employee类中的work方法!");
    }


}

class Manager extends Employee{
    String name ="jeck";

    public void test(){
        work();//自己类中的work方法
        this.work();//this是一个引用指向自己,所以是子类的work
        super.work();//super不是一个引用,用的是父类的work方法

        System.out.println(name);
        System.out.println(this.name);//this是一个引用指向自己,所以是子类的name属性
        System.out.println(super.name);//super不是引用,用的是父类中的属性

        System.out.println(this);//打印this所保存的内存地址,来验证this是自己指向自己

    }

    public void work(){
        System.out.println("Manager子类中的work方法!");
    }
}

====执行结果====
Manager子类中的work方法!
Manager子类中的work方法!
Employee类中的work方法!
jeck
jeck
TOM
com.JavaStudy.study0427.Manager@2503dbd3
com.JavaStudy.study0427.Manager@2503dbd3

三、super()

this适用于本类,super适用于多个类

this(实参):

通过一个构造方法去调用另外一个构造方法

目的是代码重用

只能出现在构造方法的第一行

super(实参):

通过子类的构造方法调用父类的构造方法

目的:通过子类的构造方法调用父类的构造方法,目的是给当前子类对象中的父类型特征赋值

只能出现在构造方法的第一行

this(实参);和super(实参);不能共存

注意:虽然super(实参);执行了,但是并不会创建父类对象

子类中的构造方法要执行,那么必须先执行父类中的构造方法。(先有父后有子)

如果一个构造方法第一行没有显示写“super(实参);”或者“this(实参)”,系统会默认加一个super()

Java中只要创建一个Java对象,则Java.lang.Object;中的无参数构造方法一定会执行。

package com.JavaStudy.study0427;

 // 子类给父类赋值,用到super()


//Account默认情况下继承了Object类,一般不写
class Account extends Object{
    private String actno;
    private String balance;

    public void setActno(String actno){
        this.actno = actno;
    }

    public String getActno() {
        return actno;
    }

    public void setBalance(String balance){
        this.balance = balance;
    }
    public String getBalance(){
        return balance;
    }

    Account(){
        super();//调用了父类Object
        actno = "工行";
        balance = "货币";
    }

    Account(String actno,String balance){
        this.actno = actno;
        this.balance = balance;
    }
}

class DebitAccount extends Account{
    private String debit;

    public void setDebit(String debit){
        this.debit = debit;
    }

    public String getDebit() {
        return debit;
    }

    DebitAccount(){
        super();//调用了父类的缺省构造器
        debit = "信用";
    }

    DebitAccount(String actno,String balance,String debit){
        super(actno,balance);//调用了父类有两个参数的构造方法,目的是给父类赋值
        this.debit = debit;
    }

}

public class SuperDemo02 {
    public static void main(String[] args){
        DebitAccount d1 = new DebitAccount();
        System.out.println(d1.getActno());
        System.out.println(d1.getBalance());
        System.out.println(d1.getDebit());

        System.out.println("--------------------");
        DebitAccount d2 = new DebitAccount("招行","基金","征信");
        System.out.println(d2.getActno());
        System.out.println(d2.getBalance());
        System.out.println(d2.getDebit());
    }
}

===执行结果===
工行
货币
信用
--------------------
招行
基金
征信
原文地址:https://www.cnblogs.com/frankruby/p/12106246.html