Java零基础学习Day08——继承

前言

为什么要有继承?

提高代码的重用性,减少一些重复代码的书写

一.继承

1.什么是继承

Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系

子类能继承父类的非私有成员(成员变量,成员方法)

子类的对象是由子类和父类共同完成的,既包含了父类数据,也包含了子类数据

public class People {
    //父类
    private String name;
    private char sex;

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
//子类
public class Teacher extends People{
    private String skill;

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}
//咨询师类 子类
public class Consultant extends People{
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    private int number;
}
public class Text {
    public static void main(String[] args) {
        //目标:认识继承优点
        //1.创建对象,封装老师数据
        //子类对象其实是由子类和父类多张设计图共同创建出来的对象
        //故子类对象是完整的
        //之后的存取和调用都用set和get方法
        Teacher t = new Teacher();
        t.setName("小王");
        t.setSex('男');
        t.setSkill("java");

    }
}

二.权限修饰符

1.含义

就是用来限制类中的成员(成员变量,成员方法,构造器)能够被访问的范围

private:只能本类

缺省(不带任何修饰符):本类,同一个包中的类

protected:本类,同一个包中的类,子孙类

public:任意位置

注:一般来说,中间两个很少用到,要求看到之后知道如何访问即可;一般来说只用private和public,而private一般限制成员变量(如:姓名,性别),public一般限制成员方法 

三.继承的特点

  • 单继承:Java是单继承模式,即一个类只能继承一个直接父类
  • 多层继承:Java不支持多继承,但支持多层继承
  • 祖宗类:Java中所有的类都是Object类中的子类
  • 就近原则:先子类局部范围找,然后子类成员范围找,都没有才会访问父类,如果父类范围内还没有找到则报错

如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类

可以通过super关键字,指定访问父类的成员

super.父亲成员变量/父亲成员方法

public class Text2 {
    public static void main(String[] args) {
        //目标2:继承后子类的访问特点,就近原则
        Zi zi = new Zi();
        zi.show();
    }
}

class Fu{
    String name = "fu的name";
}

class Zi extends Fu{
    String name = "zi的name";
    public void show(){
        System.out.println(name);//show 的name
        System.out.println(this.name);//zi的name
        System.out.println(super.name);//fu的name
    }
}

四.方法重写

1.含义

当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法。

意思就是外面的部分要一样,里面的可以自己改写。

public class Text {
    public static void main(String[] args) {
        //目标:认识方法重写,在搞清楚场景
    }
}

class cat extends Animal{
    //方法重写
    @Override //方法重写的校验注解(标志):要求方法名称和形参列表必须与被重写的方法一致,否则会报错,更安全且可读性好,更优雅
    public void cry(){
        System.out.println("猫会喵喵叫");
    }
}

class Animal{
    public void cry(){
        System.out.println("动物会叫");
    }
}

2.注意事项

子类重写父类方法时,访问权限必须大于or等于父类该方法的权限(public>protected>缺省)

重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小

私有方法、静态方法不能被重写,否则报错

3.应用场景

子类重写Object类的toString()方法,以便返回对象的内容,不然会输出对象的地址信息,就不是我们想要看到的数据。

 

 五.子类构造器

1.特点

子类的全部构造器,都会先调用父类的构造器,再执行自己

super可以调用父类的有参构造器

子类构造器是如何实现调用父类构造器的:

默认情况下,子类全部构造器的第一行代码都是super()(这个写不写都有的),它会调用父类的无参构造器

如果父类没有无参构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父类的有参数构造器

2.应用场景

可以把子类继承自父类这部分的数据完成初始化赋值

补充知识:this(...)调用兄弟构造器

任意类的构造器中,是可以通过this(...)去调用该类的其他构造器的

注意:super(...)this(...)必须写在构造器的第一行,而且两者不能同时出现,只能有一个,不然就会调用两次父类

六.多态

1.含义

多态是在继承/实现情况下的一种现象,表现为:对象多态,行为多态

people p1 = new student();
p1.run();

people p2 = new teacher();
p2.run();

方法:编译看左边,运行看右边

成员变量:编译和运行都看左边

因为多态只强调对象和行为的多态,没有强调成员变量的多态

既然强调了行为的多态,那么方法一定要去找右边重写的方法才能实现

2.多态的前提

  • 继承/实现关系
  • 存在父类引用子类对象
  • 存在方法重写

3.多态的注意事项

多态是对象、行为的多态,Java中的属性(成员变量)不谈多态

4.多态的好处

在多态形式下,右边对象是解耦合的,更便于扩展和维护

解耦合的大白话解释:就是给程序里的各个功能 “划清界限”,让它们不用 “互相盯着对方怎么干活”,只需要知道 “我要给你什么”“你要给我什么” 就行。这样改一个功能时,其他功能不受影响,代码也更抗造、好维护。

定义方法时,使用父类类型的形参,可以接受一切子类对象,扩展性更强,更便利

5.多态的坏处

多态下不能使用子类的独有功能

6.多态下的类型转换

作用:解决多态下不能使用子类的独有功能

自动类型转换:父类  变量名 = new 子类();

强制类型抓换:子类  变量名 = (子类)父类变量

people p = new teacher();
teacher t = (teacher)p;

强制类型转换的注意事项

存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错

运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来

所以强转前,建议使用instanceof关键字,判断当前对象的真实类型,再进行强转

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值