Java基础(9) | 继承

# 面向对象的三大特性:

封装,继承,多态

没有继承就没有多态!
继承主要解决的问题就是:共性抽取
java中只能单继承,没有多继承,但是可以多级继承!

# 定义子类的格式:

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

# 在继承关系中,变量重名,如何通过子类对象访问

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

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

# 区分重名变量:

局部变量:直接写
父类成员变量:super.变量名
子类成员变量:this.变量名

# 方法覆盖注意事项

1.方法名称必须相同,参数列表也要相同
2.子类方法的返回值必须小于等于父类方法的返回值
3.子类方法的权限必须大于或者等于父类方法的权限

# 继承关系中,父子类构造方法的访问特点

1.子类必须先调用父类构造方法,没写编译器会自动添加一个默认隐含的super()方法,调用父类无参构造方法先执行父类的构造方法,在执行子类自己的构造方法
2.子类构造方法可以通过super关键字来调用父类重载构造
3.super的父类构造的调用必须是子类构造方法的第一个语句,而且有且只能有一个

# super关键字

1.在子类的构造方法中,访问父类的构造方法
2.在子类的成员方法中,访问父类的成员变量
3.在子类的成员方法中,访问父类的成员方法

# this关键字

1.在本类的构造方法中, 访问本类的另一个构造方法
2.在本类的成员方法中, 访问本类的成员变量 //局部变量与成员变量重名
3.在本类的成员方法中, 访问本类的另一个成员方法
this()调用也必须是构造方法中的第一个语句,且唯一

## 注意:

super() 和 this() 两种构造调用不能同时使用

# this & super demo

## 父类

package com.leerep.javabase.extendsDemo.thisDemo;

public class Fu {
    String var = "var in Fu";

    public Fu(){
    }

    public Fu(String fu){
        System.out.println("父类有参构造,参数为:{"+fu+"}");
    }

    public void getMethod(){
        System.out.println("getMethod in Fu");
    }
}

## 子类

package com.leerep.javabase.extendsDemo.thisDemo;

public class Zi extends Fu {
    String var = "var in Zi";       //成员变量

    public Zi() {
        this("[1. this调用本类有参构造]子类无参构造开始执行----> 调用子类有参构造");     //1. this调用本类构造方法
        System.out.println("[子类无参构造执行完]");
    }

    public Zi(String zi) {
        super(zi);              //1. super调用父类构造方法
        System.out.println("{1. super调用父类有参构造}子类有参构造----> 调用父类有参构造");
    }

    public void getMethod() {
        System.out.println("getMethod in Zi");
    }

    public void getSuperMethod() {
        System.out.print("调用getSuperMethod---->{2. super在子类中调用父类getMethod()方法}\t\t");
        super.getMethod();      //2. super在子类中调用父类成员方法
    }

    public void getThisMethod() {
        System.out.print("调用getThisMethod---->[2. this在子类中调用父类getMethod()方法}\t\t");
        this.getMethod();       //2. this调用本类成员方法
    }

    //当变量重名时
    public void whenVarHasSameName() {
        String var = "var in whenVarHasSameName Method";        //局部变量
        System.out.println("局部变量:" + var);
        System.out.println("3. this访问本类成员变量:" + this.var);         //3. this访问本类成员变量
        System.out.println("3. super访问父类成员变量:" + super.var);      //3. super访问父类成员变量
    }
}

## demo

package com.leerep.javabase.extendsDemo.thisDemo;

public class Demo {
    public static void main(String[] args) {
        System.out.println("创建一个父类:有参构造");
        System.out.println("-----------------------------");
        Fu fu = new Fu("Fu");
        fu.getMethod();
        System.out.println();

        System.out.println("创建一个子类:有参构造");
        System.out.println("-----------------------------");
        Zi zi = new Zi("Zi");
        zi.getMethod();
        zi.getThisMethod();
        zi.getSuperMethod();
        zi.whenVarHasSameName();
        System.out.println();

        System.out.println("创建一个子类:无参构造");
        System.out.println("-----------------------------");
        Zi z = new Zi();
    }
}

posted @ 2021-02-08 16:21  扶-9  阅读(43)  评论(0)    收藏  举报