【每天十分钟JAVA快速入门】(十)继承
继承
继承的目的
继承是Java非常重要的特性之一,使用继承的目的就是为了复用,减少不必要的代码,使得代码结构紧凑,层次分明。但是继承也会带来耦合性的增加,不适当的继承或者滥用继承反而会给代码的维护带来很多麻烦,因此在使用继承的时候一定要深入分析,切不可滥用。
继承的实现
实现继承很简单,首先需要有一个被继承的类,我们称之为父类,例如:
public class Parent {}
然后我们创建一个类 使用extends关键字就可以继承父类了,例如:
public class Child extends Parent {}
这就是一个最简单的继承实现,然而这个例子仅仅说明了如何使用继承,实际上毫无意义,因为我们继承了这个Parent得不到任何有价值的复用,下面我们来给父类加一些可供复用的元素:
public class Parent{private String name;private String title;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}
我们给父类增加了2个私有的成员变量和一些公用的方法,这时候Child即使什么也不改变,它就拥有了复用Parent类中的几个公用方法的能力,注意Java中不能继承private修饰的元素,例如上面的name和title变量,Child虽然继承了Parent,但是仍然不可以直接操作他们,只能通过继承的公用方法来读写这2个变量。
构造器继承
一般来说构造器都是public的,但是构造器实际上是不能被继承的。上面的例子Parent和Child都没有显式的编写构造器,Child可以使用new Child()来实例化,这说明Child继承了Parent的无参构造器吗?答案是否定的,如果我们给Parent增加一个构造器如下:
public class Parent{private String name;private String title;public Parent(String name,String title) {this.name = name;this.title = title;}...}
这时候你会发现Child类编译不了,因此构造器是不能被继承的。子类的构造器实际上是先调用了父类的构造器后再继续运行的,Child默认的无参构造器找不到Parent的无参构造器,无法调用,因此编译不过。这时候我们需要在Child的构造器的第一行显式调用Parent的构造器:
public class Child extends Parent {public Child(String name, String title) {super(name, title);...}}
super关键字指的就是父类
覆盖
作为子类肯定是有自己特有的属性和方法的,但如果既想复用父类的方法又想有不同的操作怎么处理呢?Java支持覆盖来实现这种需求,例如我们希望Child的getName方法不直接返回name,而是在name前加一个little,那么就可以使用覆盖来实现,覆盖就是将父类的方法在子类重新定义并实现即可:
public class Child extends Parent {...public String getName(){return "little " + this.name;}}
覆盖不能降低方法的访问级别,例如父类的public方法,子类不能覆盖为private或protected。
抽象类
抽象类是一种特殊的类,它不可以被实例化,不能实例化的类有什么意义呢?意义只有一个,那就是用来被继承。抽象类使用abstract关键字修饰,可以有抽象方法(同样由abstract修饰,没有方法体,具体实现由子类来完成),也可以有具体方法,例如:
public abstract class Student {public abstract String getName();public String getTitle(String prefix, String name){return prefix + " " + name;}}
final类和方法
使用final修饰的类与抽象类正好相反,它不能被继承。例如String就是一个final类,无法创建String的子类。
使用final修饰的方法不可以被覆盖。
访问修饰符
学习了继承,这里再顺带了解一下访问修饰符,之前我们已经多多少少接触到一些了:
private仅对本类可见
protected对子类和本包可见
public对所有类可见
没有明确写明访问修饰符默认为对本包可见
最后再提一点Java中Object是所有类的超类,Java允许多层继承(A继承B,B继承C...)单不允许多继承(一个类同时继承多个类,A继承B和C)。
正文到此结束