面向对象(继承)

面向对象(继承)

继承

继承是面向对象的四大特征之一,之所以要支持类的继承,主要是为了实现软件的复用。子类可以继承并复用父类的属性和方法,从而可以节约软件的开发成本

Java中的继承是通过extends关键字实现的。被继承的类称为父类,实现继承的类被称为子类。在Java中每个子类只能有一个直接父类,所以Java不支持多继承。可以通过下面的例子来理解Java中的继承

public class Animal{
    public int weight;
    public int age;
    public int gender;
    public void eat()
    {
        System.out.println("eat...");
    }
    public void sleep(){
        System.out.println("sleep...");
    }
    class Fish extends Animal{
        public void swim(){
            System.out.println("swim...");
        }
        class Bird extends Animal{
            public void fly(){
                System.out.println("flt...");
            }
        }
    }
}

在上面的例子中,类Animal作为父类定义了动物的最基本属性:weight(重量)、age(年龄)、gender(性别),以及动物的最基本行为:eat(吃饭)、sleep(睡觉)。这些属性和行为是所有动物共有的,所以把他们定义到父类之中。

接下来定义的子类Fish和Bird都继承自Animal,所以在Fish类和Bird类中都可以直接使用父类的属性和方法而不需要重复定义,这样便实现了代码的复用。但是对于Fish类和Bird类也有其自有的特殊行为,例如,Fish类中定义了游泳的方法swim(),Bird类中定义了飞翔的方法fly(),这些方法都要定义在子类之中,如果定义在Animal类中是不合适的

在Java类继承中,还有几个问题需要注意

访问控制符

Java提供了三种访问控制符:private、protected、public分别代表三种访问控制级别。如果不加任何访问控制符,则表示默认的访问控制级别defaullt。所以Java的访问控制级别有四种。

前面已经说到,类中的属性和方法都可以用上面的访问控制符来修饰。这些访问控制符不但限定了成员变量和方法在本类中的访问权限,同时在类的继承中也发挥着作用。

总结起来,各个访问控制符在不同范围内的控制级别如下表所示:

privatedefaultprotectedpublic
同一个类中OKOKOKOK
同一个包中OKOKOK
子类中OKOK
全局范围OK

private访问控制权限:如果一个类的成员变量或方法使用private访问控制符修饰,则该成员变量或方法只能在该类的内部被访问,其他类都不能访问。所以priavate访问控制权限是最严苛的访问控制权限,一般情况下,类中的成员变量(属性)多用private来修饰,这样可以达到隐藏类属性的目的,更好地实现类的封装。

default访问控制权限:default访问控制权限又称为包级访问控制权限。顾名思义,default访问控制级别的成员变量或方法不但可以在类的内部被访问,还可以被同包中的其他类访问。如果类中的成员变量或者方法,或者一个顶级类不使用任何访问控制符修饰,则它就是默认访问控制权限,或称作包级访问控制权限。

protected访问控制权限:protected访问控制权限又称为子类访问控制权限。从表11-1中不难看出,使用protected修饰的成员或者方法,不但可以在同一个类的内部被访问,也可以被同包中其他类访问,同时还可以被不同包中的子类访问。因此protected访问控制权要比default访问控制权限更加宽松

public访问控制权限:public 访问控制权限是最宽松的访问 控制级别。它不但可以修饰类中的成员和方法,也可以修饰类。如果一个类中的成员或方法使用public修饰,则这些成员或者方法就可以被所有类访问,不管访问类和被访问类是否出于同一包中,或者是否具有父子关系。

综上所述,对于继承关系来说,如果子类和父类处于同一个包内,则子类可继承父类中的public、protected和defualt访问权限的成员和方法;如果子类和父类不在同意包中,或者是否具有父子关系

综上所述,对于继承关系来说,如果子类和父类处于同一个包中,则子类可继承父类中的public、protected和default访问权限的成员和方法,如果子类和父类不在同一个包内,则子类只能继承父类中的public、protected访问权限的成员和方法。

成员和方法的覆盖

虽然子类继承父类多是为了复用父类的属性和方法,但有时父类的某个方法的实现不符合子类的要求,这时就需要子类覆盖父类的方法。

Java中的子类包含与父类同名方法的现象叫做方法的重写,也称为方法的覆盖,即子类中的方法覆盖了其父类中的同名方法。覆盖了父类中同名方法的子类的对象在调用这个同名的方法时,一定是调用的子类中的那个方法,而不是父类中的方法。方法的覆盖是面向对象中多态的实现基础

同样,成员变量也存在这种覆盖关系。当子类中的成员变量与父类中定义的成员变量同名时,子类的成员变量也会覆盖父类的成员变量。覆盖了父类中同名成员变量的子类对象在调用这个成员变量时,一定调用的是子类的那个成员变量,而不是 父类的同名成员变量。

通过super引用访问父类的属性和方法

在某些情况下,子类覆盖父类的某个方法也并非”那么彻底“。请看下面的这个例子:

public class Test{
    static public void main(String[] args){
        Chinese p1=new Chinese();
        American p2=new American();
        Indian p3=new Indian();
        p1.eat();
        p2.eat();
        p3.eat();
    }
}
class People{
    public void eat(){
        System.out.println("Eat food");
    }
}
class Chinese extends People{
    public void eat(){
        super.eat();
        System.out.println("using chopsticks");
    }
}
class American extends Pelple{
    public void eat(){
        super.eat();
        System.out.println("using hand");
    }
}

在上面的例子中,父类People定义一个方法eat()表示吃饭,这个动作是人类共有的,并不存在个体的差异,所以将其定义在父类中。子类Chinese、American、Indian分别扩展自People类,表示中国人、美国人、印度人。对于这三个国家的人,吃饭是它们共有的行为,所以不存在差异,但是三国人吃饭的工具却各有不同,中国人吃饭要用筷子,美国人吃饭用刀叉,印度人则直接用手抓饭吃,所以在Chinese、American、Indian这三个类中对eat()这个方法要分别定义,但同时又复用其公共父类People的eat方法,即三个子类中的eat即包含父类中的eat动作,又各自有自己的定制。这种情况下,就需要在子类的方法中调用父类被覆盖的实例方法。

在Java中,super是一个关键字,表示该类的直接父类对象的引用。在上述代码中,各个子类中的super都表示其父类People的对象的引用。由此可见,super只能在类的对象中被引用,所以它不能出现在static修饰的方法中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值