龙空技术网

带你认识继承(extends)-简明教程

JAVA后端技术 185

前言:

此刻你们对“js简明教程”大约比较关注,姐妹们都需要了解一些“js简明教程”的相关内容。那么小编同时在网摘上收集了一些有关“js简明教程””的相关资讯,希望小伙伴们能喜欢,兄弟们快快来了解一下吧!

首先我们要知道继承是java面向对象重要的基石,原因是它允许创建分等级层次的类。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等,在工作java程序开发中,继承显得尤为重要。

上示图例中,虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有所差别,所以子类会具有父类的一般特性也会具有自身的特性。

为什么需要继承

假如今天部门老大来找你,让你开发一个动物类,其中动物分别为羊以及老虎,要求如下:

羊:属性(名称,颜色,年龄),方法(奔跑,睡觉,描述)老虎:属性(名称,颜色,年龄),方法(奔跑,睡觉,描述)

先看一段普通的代码示例:

从上述代码示例来看,代码存在重复了,而且后期维护也很麻烦,比如我想给每个动物增加一个体重属性,那么每个类都需要加一遍,维护性不高也容易出错。其实要从根本上解决这两段代码的问题,就需要用到继承,我们可以将两段代码中相同的部分抽取出来组成一个父类。

继承关键字(keyword)

在 Java 中,类与类之间的继承可以通过 extends 关键字来申明,一般继承格式如下:

class 父类 {}class 子类 extends 父类 {}
使用继承优化后代码示例:公共父类Animal:
public class Animal {    private int age;    private String name;    private String colour;    public Animal(String name, String colour, int age) {        this.name = name;        this.colour = colour;        this.age = age;    }    public void run(){        System.out.println(name + "在奔跑");    }    public void sleep(){        System.out.println(name + "在睡觉");    }    public void introduction() {        System.out.println("吼吼吼!我是可爱的" + name + "");    }}

这样的话Animal类就可以作为一个父类,羊和老虎在继承这个类后,就具有父类Animal当中的属性和方法,子类代码更加简洁,提高了代码的复用性。

子类示例:羊类:

public class Sheep extends Animal {    public Sheep(String name, String colour, int age) {        super(name, colour, age);    }}
老虎类:
public class Tiger extends Animal {    public Tiger(String name, String colour, int age) {        super(name, colour, age);    }}

这样就完成继承了,是不是很简单?上面的代码示例中,Animal我们称之为父类,或者超类、基类;Sheep、Tiger我们称之为子类。

继承的概念和优缺点1.继承的概念

继承(inheritance):继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

也就是说,多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

2.继承的优点

继承的优点

简而言之,继承的好处有以下三点:

1.继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系;

2.继承提供了软件复用功能,提高了代码复用性;

3.继承让类与类之间产生了关系,是多态的前提。

3.继承的缺点

既然我们已经知道了继承的好处,是不是什么场景下都可以用继承呢?世界万物都会有两面性,继承也不例外,当我们使用继承的时候,类与类直接就会产生关系,模块之间联系越紧密,则独立性就越差,从而增加了系统的耦合性。

继承的缺点

那我们该什么时候使用继承呢?其实继承体现了我们现实生活中is a的关系,即谁是谁的一种,例如:老虎是动物的一种;苹果是水果的一种等等。

this和super的用法以及区别1.this

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针(Java中没有指针,但是可以这样理解)。

this 的用法大体可以分为以下3种:

普通的直接引用

这个很好理解,this 相当于是指向当前对象本身。

形式参数和成员名字重复,用this来区分

代码示例:

class Car {    private String colour = "红色";    public Car() {        System.out.println("初始化车子颜色:" + colour);    }    public String getColour(String colour) {        this.colour = colour;        return this.colour;    }}class Test{    public static void main(String[] args) {        Car car = new Car();        System.out.println("车子颜色是:"+car.getColour("白色"));    }}

输出结果:

初始化车子颜色:红色 车子颜色是:白色

this

可以看到,getColour 成员方法里的colour是形式参数,this.colour 是 Car 类的成员变量。

引用构造函数

this(参数):调用本类中另一种形式的构造函数(应为构造函数中的第一条语句)。

2.super

super 可以理解为是指向自己基(父)类对象的一个指针(Java中没有指针,但是可以这样理解)。

super 也有三种用法:

1.普通的直接引用

与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名

代码实例:

class Car {    String name;    public void getName() {        name = "宝马";    }}class NewCar extends Car{    String name;    @Override    public void getName() {        name = "奔驰";        super.getName();        System.out.println(name);        System.out.println(super.name);    }      public static void main(String[] args) {        NewCar newCar = new NewCar();        newCar.getName();    }}

输出结果:

奔驰 宝马

从上面的代码可以看到,这里既调用了父类的方法,也调用了父类的变量。

引用构造函数

super(参数):调用本类中另一种形式的构造函数(应为构造函数中的第一条语句)。

3.this和super区别

它们之间的区别主要有以下三点:

一、指代不同

1、this:指的是当前对象的引用。

2、super:是当前对象里面父对象的引用。

二、调用函数不同

1、this:调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)。

2、super:调用父类中的某一个构造函数(应该为构造函数中的第一条语句) 。

三、引用对象不同

1、this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员变量同名,这时需用this来指明成员变量名)。

2、super:引用当前对象的父类中的成员变量(当成员变量和父类具有相同成员变量时,用于访问父类中的成员变量或方法)。

继承关系中的构造方法

前面已经学习了继承的概念,也知道了继承是子类继承父类的特征和行为。那么子类和父类的构造方法是否也是继承的关系呢?看下面的代码示例:

class Father { //我是父类    private String name;    public Father() {        System.out.println("我是父类无参构造方法");    }    public Father(String name) {        System.out.println("我是父类有参构造方法[name]:" + name);        this.name = name;    }}class Son extends Father{ //我是子类    private String name;    public Son(){// 这里自动调用父类的无参数构造器        System.out.println("我是子类无参构造方法");    }    public Son(String name){        super("子类调用父类");//显式调用父类有参构造方法,并传入参数        System.out.println("我是子类有参构造方法[name]:" + name);        this.name = name;    }}public class Test{    public static void main(String[] args) {        Son s1 = new Son();        Son s2 = new Son("子类构造参数");    }}

运行结果:

我是父类无参构造方法 我是子类无参构造方法 我是父类有参构造方法[name]:子类调用父类 我是子类有参构造方法[name]:子类构造参数

从上面的代码示例中可以发现,子类是不继承父类的构造方法的,它只是调用(隐式或显式)。如果父类的构造器带有参数并且子类要调用父类有参构造方法的话,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造方法,并配以适当的参数列表调用,否则还是自动调用父类无参构造方法。

注意:如果父类构造方法没有参数,则在子类的构造方法中不需要显式的用 super 关键字调用父类构造方法,系统会自动调用父类的无参构造方法哦。

方法的重写与重载

子类继承父类,它具备了父类的特征和行为,子类从父类那里继承方法,但子类更具体化,可以定义新的特征,当子类可以修改从父类继承的一些方法,进行扩展,增大功能,程序上常常把这样的一种操作方法称为方法的重写(0veriding),所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。

1.方法的重写重写的优点

重写体现了Java的优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。

重写的规则

在方法的重写,需要还遵循以下的规则:

父类方法的参数列表必须与被子类重写的方法的参数列表、返回类型完全相同。被子类重写的方法不能拥有比父类方法更加严格的访问权限。父类私有方法,子类无法重写。继承过程中如果父类中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常。

对于第四点,这里要再补充一下,子类抛出的异常不能多于父类中抛出的异常哦,即重写方法一定不能抛出新的检查异常,并且不能比父类方法声明更加宽泛的检查型异常(可以等于)。例如,父类的一个方法申明了一个IOException异常,在重写这个方法时就不能抛出Exception异常(Exception>IOException)。

2.方法的重载

那么什么又是方法的重载呢?方法的重写和重载虽然只相差了一个字,但是它们并不是一个概念,那么方法的重载又是怎么定义的?和方法的重写又有什么区别呢。

方法的重载(Overloading):方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。

3.方法重载和方法重写的区别

重写是方法有完全相同的返回值类型、方法名、参数个数以及参数类型,而重载是要求方法名相同,但参数个数、参数类型或者参数的顺序可以不同。

下面用一段代码示例展示一下它们的区别:

方法重载和方法重写代码示例

一定要区分好重写和重写的区别,千万别记混了。下面是整理的图片关于它们的区别,一定要牢记于心哦!

方法重写和重写的区别

经过上面的学习,相信大家对于继承有了一定的了解。关注小编,每天学习一点点!!!不积跬步无以至千里,不积小流无以成江海!!!

标签: #js简明教程