21- 继承的基本知识

继承的主要作用:抽取共性

对于一个已经使用了的类,最好不要修改,推荐定义一个新的类,来重复利用其中的共性内容,并且添加改动内容。

定义父类格式:(这里假设父类没有更上层的父类)
 

public class 父类名称

{
    ...
}

定义子类格式:

public class 子类名称 extends 父类名称{
...
}

一、在父子类继承关系当中,乳沟成员变量崇明,则创建子类对象时,有两种访问方式:

1、直接通过子类对象访问成员变量,等号左边是谁,优先用谁,没有则向上找。

2、间接通过成员方法访问成员变量,该方法属于谁,就优先用谁,没有则向上找。

//Father.java
public class Father {
    int faNum = 10;
    int num = 11;

    public void method()
    {
        System.out.println("父类method!");
    }
}

//Son.java
public class Son extends Father{
    int sonNum = 20;
    int num = 21;
}

//DemoExample.java
public class DemoExample {
    public static void main(String[] args) {
        Son one = new Son();

        System.out.println(one.sonNum);//子类独有,用子类
        System.out.println(one.faNum);//子类没有,向上找父类
        System.out.println(one.num);//父类、子类都有,由于等号左边是子类,所有使用子类

        Father two = new Father();
        System.out.println(two.num);//等号左边是父类的,所以使用父类
    }
}

二、在子类的方法中,如果存在局部变量、子类成员变量、父类成员变量同名时,如何使用?

局部变量:     直接写局部变量名

本类的成员变量: this.成员变量名

父类的成员变量:super.成员变量名

三、在父子类继承关系当中,创建子类对象,访问成员方法的规则:

创建的对象时谁,就优先使用谁的方法,如果子类没有该方法就向上找父类看有没有。

四、在父子类继承关系中,关于方法重写注意事项

1、子类可以重写(override)父类的方法,但是需要名称一样,参数列表一样。

2、在子类的重写方法前面最好加@override,这样可以防止重写方法写错告警。

3、子类的返回值必须【小于等于】父类的返回值范围

小扩展:java.lang.object类时所有类的公共最高父类,java.Lang.String就是它的子类

4、子类方法的权限必须【大于等于】父类方法的权限修饰词

小扩展:修饰词public > protected > (default) > private

备注:(default)不是关键字,而是什么都不写。

注意重写和重载的区别

1、重写是名称和参数列表必须一致。

2、重载是名称一致,参数列表不能一致。

3、对于一个父类方法,如果子类重写了该方法,而又想使用父类该方法的功能,可以通过在子类方法中加入super.父类方法名称。

//父类包含方法
public void showMSG(){
       System.out.println("父类 showMSG");
}

//自乐你包含该方法
@Override
public void showMSG() {
        super.showMSG();
        System.out.println("子类showMSG");
 }

//如果执行子类的showMSG,则会打印如下:
父类 showMSG
子类showMSG

五、父子继承中关于构造方法的相关信息

1、子类构造方法中,有一个默认隐含调用super(),所以一定是先执行父类构造方法,再执行子类构造方法。

2、如果父类构造方法有重载,子类可以通过super(xxx)来选择使用哪个重载构造方法。

3、对父类构造函数的调用,必须放在子类构造函数的第一条执行语句,且只能调用一次

4、子类如果写了对父类构造方法的调用super(xx),则不会赠送默认的,如果没有写则会默认赠送无参构造方法。但是如果父类重载了构造方法,但是没有写无参的构造方法,则子类必须写super(xx)(如果子类有重载构造方法,则每个构造方法都必须写),原因你懂得!

六、super关键字的用法

1、在子类的成员方法中,访问父类的成员变量。

2、在子类的成员方法中,访问父类的成员方法。

3、在子类的构造方法中,访问父类的构造方法。

注意:

如果子类重载了构造方法,如果在某个构造方法中使用了this(...),则在该构造方法中不能再使用super,当然就更会默认赠送。

且this也必须放在第一个执行语句,且也只能是唯一一个。

五、父子继承中关于构造方法的相关信息

//===========================================================
public class Father {
    private  int a;
    private  int b;

    //无参构造方法
    public Father() {
        System.out.println("父类无参构造方法");
    }

    //有参构造方法1
    public Father(int a) {
        this.a = a;
        System.out.println("父类有参构造方法1");
    }

    //有参构造方法2
    public Father(int a, int b) {
        this.a = a;
        this.b = b;
        System.out.println("父类有参构造方法2");
    }
}


//===========================================================
public class Son extends Father{
    private int x;
    private int y;

    public Son() {
        System.out.println("子类无参构造方法");
    }

    public Son(int x) {
        this.x = x;
        System.out.println("子类有参构造方法1");
    }

    public Son(int x, int y) {
        this.x = x;
        this.y = y;
        System.out.println("有参构造方法2");
    }
}

//=================================================================
public class Demo {
    public static void main(String[] args) {
        Son one = new Son();
    }

}

//=======================输出====================
父类无参构造方法
子类无参构造方法
//========================================================
public class Father {
    private  int a;
    private  int b;

    //无参构造方法
    public Father() {
        System.out.println("父类无参构造方法");
    }

    //有参构造方法1
    public Father(int a) {
        this.a = a;
        System.out.println("父类有参构造方法1");
    }

    //有参构造方法2
    public Father(int a, int b) {
        this.a = a;
        this.b = b;
        System.out.println("父类有参构造方法2");
    }
}

//========================================================
public class Son extends Father{
    private int x;
    private int y;

    public Son() {
        //super(10);
        this(10);
        System.out.println("子类无参构造方法");
    }

    public Son(int x) {
        this(10,1);
        this.x = x;
        System.out.println("子类有参构造方法1");
    }

    public Son(int x, int y) {
        super(10,10);
        this.x = x;
        this.y = y;
        System.out.println("有参构造方法2");
    }
}
//==================================================================
public class Demo {
    public static void main(String[] args) {
        Son one = new Son();
    }

}
//============================ 输出结果 ======================
父类有参构造方法2
有参构造方法2
子类有参构造方法1
子类无参构造方法
发布了77 篇原创文章 · 获赞 4 · 访问量 4914

猜你喜欢

转载自blog.csdn.net/l0510402015/article/details/104094061