在讲面向对象三大特征之一的继承之前,先来讲一个小例子。
我先问一个问题就是:我们经常说水果,那么我说你帮我买个水果,你会知道我想要的是什么吗?答案肯定是不知道了,水果的种类有很多,你怎么知道我是要苹果呢,还是梨呢?那么如果我是跟你说,我想要一个苹果,那么我想你肯定知道我想要的就是水果里面的一种——苹果。
其实上面这个例子和我们面向对象中的继承就是一个道理,水果就相当与继承中的父类,而苹果就相当于子类。
class Fruit{....}
class Apple extends Fruit{.....}
我们知道,java继承中的关键字就是extends ,它直译的意思是"拓展",其实用拓展来形容继承可以说是非常恰当,我们kan'看上面的例子就可以知道,实际上苹果是对水果的一种拓展,为水果增加了种类,同样的苹果也得到了拓展,当我们说苹果的时候很正常地知道它是属于水果。这时候再说继承就很简单了,继承是我们软件设计中进行代码复用的一个重要特性,那么接下来我们再通过一个例子来了解继承的一些特性。
/*
*我们接下来就来说一下交通工具来加深一下继承
*那么,我们交通工具肯定也是分很多种了,但是它们肯定也是有很多共同的特征了,比如名称,能做什么...
*等等
*/
class Vehicle{
String name;//名称
public Vehicle(String name){
this.name = name;
}
public void Introduce(){
System.out.println("我是"+name);
}
}
/*
*汽车类
*/
class Car extends Vehicle{
//通过继承Vehicle类获得Vehicle类的方法
public Car(String name){
super(name);
//通过super关键字将参数name传递给父类构造器
}
}
/*
*飞机类
*/
class Plane extends Vehicle{
//通过继承Vehicle类获得Vehicle类的方法
public Plane(String name){
super(name);
}
}
public class Demo{
public static void main(String[] args){
Car car = new Car("car");
car.Introduce();//我们可以知道输出的是"我是car"
Plane plane = new Plane("plane");
plane.Introduce();//我们可以知道输出的是"我是plane"
}
}
我们可以通过上面例子可以知道,其实父类更应该是把一类具有某些共同特征的对象的功能或特征给集合到一起,子类通过继承去调用父类的资源,那么到这个时候我们就可以知道一点了,子类具有调用父类资源的能力,那么我们可以来总结一下子类究竟能够调用父类的什么东西呢?
子类继承父类到底能够调用父类的哪些功能/特征?
1)父类除了使用private修饰符修饰的变量子类都可直接调用;
2)父类非私有方法;
3)父类构造器(非私有);
其次,子类还可以重写父类的方法。那么接下来我就来给演示一下覆写父类的方法。
class Fruit{
public void explain(){
System.out.println("我是水果");
}
}
/*
*那么如果我们对父类方法不满意的话,我们也可以进行覆写
*/
class Apple extends Fruit{
@Override
public void explain(){
System.out.println("我是苹果");
}
}
public class Demo{
public static void main(String[] args){
Apple apple = new Apple();
apple.explain();//我们只要把程序跑起来就知道,控制台输出的是我是苹果而不是我是水果
}
}
通过上面的例子我们可以很清晰的知道子类不仅可以调用父类的变量,还能够覆写父类的方法。将方法重写为适合本对象的方法。这就符合面向对象的代码复用原则,也让我们的代码更加灵活