Java中的另一个特点就是继承,一般而言Java中是不能多继承的,但是对于接口而言,又可以说是多继承的。
在Java中,一个工程一般都有很多的类,而有的时候类与类之间代码是有重复的,这些重复的代码有时候我们可以向上抽去出来,形成一个新的类,这个新的类就是父类,而原来的类就是子类,子类可以通过extends继承父类,父类中有的东西,子类中也会有(除了父类中私有的变量和函数)。当然继承的时候,子父类中难免会出现同名的变量,这个时候在子类或者主函数中实例化后引用的变量肯定是子类里的变量,父类中的就好像是被子类中的同名变量覆盖了一样,这个时候如果我们想引用父类中的变量的时候我们可以用super关键字,它和this关键字基本上一样,只是this代表的是本类,super代表的是父类而已。子父类中的函数也和变量差不多,当子类中出现和父类中一模一样的函数时,子类对象调用该函数时,会运行子类函数的内容,这就是函数的一个特性:重写。重写功能一般就是用在子类中有和父类一样的函数,但是函数主体中的内容不同,这时候我们不需要定义新的函数编写这个功能,只需要是用覆盖特性就可以了。
类中还有一个特殊的函数,就是构造函数,构造函数就是和类名相同的函数。在子类进行初始化的时候,父类中的构造函数也会运行,那是因为子类的构造函数中第一行会有一条默认的语句:super(),这就会调用父类总的构造函数,如果函数super(参数...),它就会调用与之对应的构造函数。为什么子类初始化会访问父类的构造函数呢?因为子类在继承父类的时候,子类必须知道父类中有什么样地函数和变量,这样子类才能继承,而在查看父类中的函数和变量的时候,父类中的变量和函数就会进入内存,这时候就会对父类初始化。还有一点需要注意的是,当我们想让子类初始化时访问特定的父类构造函数时,我们手动书写super语句时必须写在子类构造函数的第一行。
学习继承的时候,我们肯定会接触到关键字final的,final可以修饰类、函数和变量,而且被final修饰的类不可以被继承。继承有一个弊端,就是打破了类的封装性,所以当我们的类或者函数不想被继承的时候,我们可以用final进行限制。final修饰变量的时候就是我们平时常使用的常量。
我们学习继承的时候,肯定会接触到abstract关键字,这是抽象的意思。当多个类中出现相同功能,但是功能主体不同,这时可以向上进行抽取,只抽取功能定义,而不抽取功能主体,这就是抽象方法,而抽象方法必须放在抽象类中,子类对这样的父类进行继承时,我们必须对其中的抽象方法进行复写,把功能主体实现。按我学习接口的理解,接口就是一种特殊的类,抽象类中不但可以定义抽象方法,还可以定义一般方法,但是接口中的方法全部都是抽象方法,用interface定义接口,而接口与接口之间可以进行多继承。接口中的成员都有固定的修饰符,常量:public static final 方法:public abstract名字(),类继承接口时,不是extends而是implement,这时被称为实现,类中实现借口时,我们必须把接口中的方法实现,如果不实现,那这个类还是抽象类。接口主要就是为了实现类的功能扩展。 |
|