- 为什么要有继承
在我们编写程序的时候,写一个新的类时,有时候可能要用到一些之前使用过的方法或者属性,如果我们重新编写的话会很麻烦。但假如能够把某些需要重复使用的方法属性写入某个类,并被另一个类使用的话,就可以省下不少时间。于是为了提高代码的重用性,就有了继承。
- 什么是继承
①继承是面向对象编程的三大特征之一,是一种基于已有类来创建新类的机制。由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类)。
②•Java中每个类只允许有一个父类。语法如下:class <子类> extends <父类>
例如:
图中的Student类即是对Father类继承而得到,因此,Student为子类,Father为父类。
值得注意的是:使用继承语法的继承,我们称之为显式继承;与此对应,还有一种继承方式叫隐式继承——————任何一个没有显式继承某个类的类,都默认继承自Object类。所以我们可以说,Object类是所有类的直接父类或者间接父类。
- 继承作用的体现
我们说,继承的作用是提高代码的重用性,因为根据访问权限修饰符的不同,子类可以继承父类中某些成员变量和方法,提高了代码的重用性,子类也可以添加新的成员变量和方法 :
我们创建一个父类并写入属性以及方法
public class Father {
String name="YJT";
//属性:姓名YJT
public void eat() {
System.out.println("吃东西");
}
//方法:吃东西
}
接着我们创建子类继承这个父类
public class Student extends Father{
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.name);
student.eat();
}
}
在这个子类中并没有写入任何方法以及属性,但我们执行结果为
这就说明子类继承了父类的方法和属性,显然在没有重新编写的情况下,父类的这段代码被子类重用,大大提高了代码的重用性,节省了时间和内存。
- 注意事项
①如果类被final修饰,则该类不能被继承:
同时Java中已有的类(诸如Void、String、Class、Scanner、System、8种基本数据类型对应包装类等类)已经被final修饰,所以这些类不能被继承。
②父类中被private修饰的方法和属性不能被继承。
在之前所用的代码中,我们将name属性和eat方法改用private修饰,会出现这种结果
程序报错:父类中的name和eat不可见。也就是说,name属性和eat方法由于改为private修饰,无法被子类继承。
③ 如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法
在这段代码中,父类有一个无参构造方法,子类的构造方法并没有指出调用的是该方法,也没有调用子类本身其他构造方法,此时则默认使用了super()隐式调用该无参方法,于是在执行程序时也输出了“父类中无参构造方法".
而在这段代码中,子类的第一个构造方法使用了this调用了其本类的无参构造函数,因此将不会默认用super()调用父类的无参函数,所以父类的无参构造方法只输出了一次。
④当子类成员变量和父类成员变量同名时,对子类对象来讲,父类的成员变量不能被子类继承(即子类的成员变量覆盖了父类的成员变量),此时称子类的成员变量隐藏了父类的成员变量。
•如果要在子类非static修饰的代码块或方法中使用被隐藏的父类成员变量可以通过super关键字实现。
例如在这段代码中,子类和父类有一个同名变量“name”,在子类的sayname方法中,第一行直接输出name,而父类变量被隐藏,因此输出了子类的成员变量;而第二行中输出的name变量前加上了super关键字,调用了父类的同名成员变量,因此输出的是“王Father”。