java学习--继承

来源:互联网 发布:js 事件对象 target 编辑:程序博客网 时间:2024/06/05 16:18

本文将介绍java里的继承
首先强调两点:
1、访问控制符可以用来修饰实例变量,以控制实例变量的可访问范围
2、局部变量不能使用访问控制符修饰
定义一个汽车的类,类里包含名字、速度、颜色三个属性。汽车有加速和减速两个方法。

public class Car{    public int speed;    public String name;    public String color;    public void speedUp(int p_speed){        if p_speed > 0;        speed += p_speed;    }    public void speedDown(int p_speed){        if p_speed > 0;        int tempSpeed = speed - p_speed;        if (tempSpeed > 0) {            speed = tempSpeed;          }    }}

上段代码完成了系统需要的功能,但是当系统升级需要支持公交车,公交车除了普通属性外还需要增加两个新的属性:最大乘客数目(35)和当前旅客总数,还有两个新的方法:增加旅客和减少旅客。
那么我们就在原来的类上改变。那么需要增加新的变量和方法。当系统需要持续升级加入跑车、自行车的时候该怎么办呢?如果每个汽车写成一个类也很麻烦。
我们需要的最优解决方案就是:把所有车中公共的相同的部分抽取出来放在一个类中作为基本,而不同的部分按照汽车的类型放在不同类中。最重要的是要让不同汽车类型的类能够把那个作为基本的类视为自己的代码。这个时候就需要继承了。
代码如下:

publi class CarBase{    public int speed;    public String name;    public String color;    public int maxSpeed = 90;//最大限制速度    public void speedUp(int p_speed){        if p_speed > 0;        speed += p_speed;    }    public void speedDown(int p_speed){        if p_speed > 0;        int tempSpeed = speed - p_speed;        if (tempSpeed > 0) {            speed = tempSpeed;          }}

这个CarBase就代表了所有汽车类中的公共部分,那么如何使用继承来“共享”这段代码呢。

public class Bus extends CarBase{//表示bus类继承自CarBase    public int max_Passenger = 35;    public int current_Passenger = 0;    //只包含bus特有的方法    //专门为公共汽车增加的方法,完成旅客上下车功能    public boolean getOnBus(int p_amount){        if(isBus){            int temp = current_Passenger + p_amount;            if (temp > max_Passenger) {                return false;            }else{                current_Passenger = temp;                return true;            }        }        return fales;//如果不是Bus直接返回false    }    //下车功能    public boolean getDownBus(int p_amount){        if(isBus){            int temp = current_Passenger - p_amount;            if (temp <0){                return false;            }else{                current_Passenger = temp;                return true;            }        }        return fales;//如果不是Bus直接返回false    }}

我们发现了Bus在类后面多了extend CarBase。extend就是java中的继承关键字。注:继承绝对不是简单的直接拿来父类的属性和方法。自类能够使用父类中的那些属性和方法是与访问控制符有关的。
继承的语法格式:子类类名+extends+父类类名。
使用Bus类

public class UseExetends{    public static void main (String[] args){        Bus bus = new Bus();        System.out.println("九位乘客上了公交车");        Bus.getOnBus(9);        System.out.println("公交车出发了!");        bus.speedUp(50);    }}

上例说明当我们利用一个引用访问方法和属性时候,无论这个方法是父类还是自己的,其语法形式是相同的。
java中的继承关系是单继承,extend后面只能跟一个类的名字。java中使用接口来实现多继承。java中的继承可以无限延续下去。
以上是在类的层面上理解了继承,接下来看一下在对象层面继承带给我们的惊喜。
实际上“java创建一个子类的对象的同时,也创建了父类的一个对象”。子类对象在创建的时候回创建一个其父类的对象,二这个对象时隐含在子类中的。当我们通过子类的引用使用父类的属性时,其实可以理解为访问这个内嵌的父类对象的属性。
子类唯一没有直接继承下来的就是父类的构造方法。可以这么理解,构造方法要求方法名跟类名相同,而子类和父类名不相同,所以子类无法继承父类的构造方法。那么子类要如何调用父类的方法呢?我们需要另外一个关键字super
super关键字可以在子类构造方法中使用,用来调用父类的某个构造方法。语法:super(参数值列表)

public class SportCar extends CarBase{    public int Amount = 90;    public SportCar(){        System.out.println("SportCar类的构造方法被调用了");    }}public class SportCar extends CarBase{    public int Amount = 90;    public SportCar(){        super();        System.out.println("SportCar类的构造方法被调用了");    }}

以上两段代码是相同的,当一个类的构造方法没有显示使用super关键字去调用父类的方法时,编辑器就会默认在子类对的构造方法的第一行添加super()
注:
1、使用super关键字调用父类的构造方法,只能够在子类的构造方法中使用。
2、必须在子类的构造方法中的第一行使用语法。
3、语法中的参数值列表需要和父类的某个构造方法相同,否则会有语法错误。
4、编辑器会在子类无显式调用父类某构造方法时调用父类无参数的构造方法。而java编辑器不会给已经有构造方法的类添加空的构造方法。为了避免错误,最好在类里写一个无参数的构造方法。

0 0
原创粉丝点击