继承

一、理论

继承的说明:

子承父业:------继承关系 //父亲有啥,儿子有啥

Java当中继承:父亲有多少,n个儿子就有多少。更类似于师徒关系。

在创建对象时一般不创建父类对象,因为,没有意义。

二、继承的格式

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

继承是为了解决“共性抽取”

代码示例

//父类
public class FuLei {
    String name = "王健林";
    int age = 60;
}
//子类
public class ZiLei extends FuLei {
    String namezi = "王思聪";
    int agezi = 20;
}
//测试类
public class Test {
    public static void main(String[] args) {
        ZiLei zi = new ZiLei();
        System.out.println(zi.name);
        System.out.println(zi.age);
        System.out.println(zi.namezi);
        System.out.println(zi.agezi);
    }


}

//子类可以调用父类person中的内容

三、继承当中的成员变量

相同的成员变量:

在输出时,先找自己,自己没有再找父类(就近原则)

如果都有,想要直接找子类中的 用this.变量名称

想要直接找父类中的 用super.变量名称

代码示例:

//父类
public class FuLei {
    String name = "王健林";
    int age = 60;
}
//子类
public class ZiLei extends FuLei {
    String name = "王思聪";
    int age = 20;
    public void text(){
        System.out.println(super.name);
        System.out.println(super.age);
        System.out.println(this.name);
        System.out.println(this.age);
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        ZiLei zi = new ZiLei();
        zi.text();
    }


}

四、继承当中的成员方法

父类和子类存在不同的方法:

根据调用的先后,依次使用

父类和子类存在相同的方法:

就近原则,子类有优先使用子类的方法

代码示例:

//父类
public class FuLei {
    String name = "王健林";
    int age = 60;
    public void method(){
        System.out.println("父类方法");
    }
    public void method01(){
        System.out.println("父类中不同的方法");
    }
//子类
public class ZiLei extends FuLei {
    String name = "王思聪";
    int age = 20;
    public void method(){
        System.out.println("子类方法");
    }
    public void text(){
        System.out.println(super.name);
        System.out.println(super.age);
        System.out.println(this.name);
        System.out.println(this.age);
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        ZiLei zi = new ZiLei();
        zi.method01();
        zi.text();
        zi.method();
    }


}

五、方法重写

方法重载和方法重写的对比:

方法重载(同一个类,同名方法,参数不同。区别是同一个类)

方法重写(父子关系,相同方法。区别是两个类)

重写的应用场景:

在继承关系中,如果父类的方法无法满足现有子类的需求时,可以使用方法重写。

在方法重写时,子类可以通过super.方法名 调用父类的方法来补充所需内容

在子类方法中使用 @Override验证方法重写是否成功,报错则代表失败

代码示例:

public class Phone {
    public void eat(){
        System.out.println("显示号码");
    }
}
public class NewPhone extends Phone{
    @Override
    public void eat(){
        super.eat();
        System.out.println("显示头像");
        System.out.println("显示名称");
        System.out.println("显示归属地");
    }
}
public class Test {
    public static void main(String[] args) {
        Phone old = new Phone();
        old.eat();
        System.out.println("----------");

        NewPhone xin = new NewPhone();
        xin.eat();
    }
}

方法重写注意事项(访问权限修饰符):

使用public修饰在任何地方都可以使用

使用private修饰只能在同一个类中使用

使用默认修饰,只能在同一个包中使用

使用protected修饰 ,在不同包时只能在子类中使用

常用 public主要修饰类、成员方法、构造方法

pricate主要修饰成员变量

方法重写注意事项:

父类私有方法不能进行方法重写

一大一小 (父类的重写方法的权限修饰符>=父类方法的权限修饰符 子类重写方法的返回值类型 <= 父类方法的返回值类型)

六、继承当中的构造方法

就是一个赋值的过程

在有参方法创建子类对象的时候,优先执行父类构造方法,目的是为了给父类 的成员变量赋值,因为子类可能会使用到父类的成员变量。

在无参方法创建子类对象的时候,默认会生成一个super() ,使其优先执行父类构造方法。

所有的类默认的父类是object

构造方法的内部调用

this() 这种写法只能写在构造方法的第一行,表示调用自己的无参数构造方法

this(参数) 这种写法只能写在构造方法的第一行有效语句,表示调用自己的有参数构造方法

super() 这种写法只能写在构造方法的第一行有效语句,表示调用父类的无参数构造方法

super(参数) 这种写法只能写在构造方法的第一行有效语句,表示调用父类的有参数构造方法

注意:父类构造方法在创建子类对象的时候,是一定会调用的,并且是先父类后子类

this关键字: 当前类的对象引用,在内存图中,指的是自己的空间

super关键字:当前类的父类引用,在内存图中,指的是父类的空间

调用成员变量

this.变量名称

super.变量名称

七、继承的特点

单一继承,多层继承

好处:

提高代码的复用性

缺点:

耦合性强。(依赖关系紧密,子类的操作必须依赖父类)