博客
关于我
继承与多态
阅读量:529 次
发布时间:2019-03-08

本文共 3130 字,大约阅读时间需要 10 分钟。

物件导向编程中的继承与多态

继承的基本原理

在编程中,继承是面向对象编程的核心概念之一。它允许一个类继承另一个类的属性和方法,使得代码复用性更高。通过继承,我们可以将共同的功能抽象到父类中,而子类则可以扩展这些功能以满足特定需求。在Java中,使用箭头(->)表示继承关系。例如:

汽车 <---- 交通工具小汽

通过这种关系,小汽将继承交通工具所有的属性和方法。如果父类交通工具具有属性name和方法吃,小汽也将自动拥有这些属性和方法。子类可以通过调用parent的属性和方法进行操作,而无需重复实现。

子类与父类的关系

在Java中,子类通过使用关键字extends声明继承关系。一个子类只能继承一个父类(与C++、Python等其他语言的多继承不同)。子类会自动继承父类的public字段和方法,但私有字段和方法无法被访问。在子类中,超类实例可以通过使用super关键字来访问。

一个示例:// 父类public class Animal {public String name;public Animal(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}}

// 子类public class Cat extends Animal {public Cat(String name) {super(name);}public void eat(String food) {System.out.println("猫正在吃" + food);}}

通过这种方式,Cat继承了Animal的全部属性和方法,但可以通过覆盖(method override)定义自身特定的行为。

属性的隐藏与方法的覆盖

在Java中,子类可以选择隐藏父类的属性或覆盖父类的方法。如果子类声明了与父类相同名称的字段或方法,那么父类的对应属性或方法将被隐藏。子类的字段或方法会完全遮盖父类的同名成员。

属性的隐藏

若子类定义与父类同名的字段,父类的字段将被隐藏。例如:

public class Animal {public String name;}

public class Cat extends Animal {public String name;}

Cat obj = new Cat();System.out.println(obj.name); // 输出:Cat的name字段

在这个案例中,Cat中的name字段将隐藏Animal中的name字段。

方法的覆盖

方法覆盖允许子类用与父类相同名称的方法重定义不同的行为。覆盖必须满足以下条件:

  • 方法名完全相同
  • 方法参数列表完全匹配

public class Animal {public void eat(String food) {System.out.println("动物在吃ingredient");}}

public class Cat extends Animal {public void eat(String food) {System.out.println("猫在吃ingredient");}}

Cat的eat方法会在运行时取代Animal的Eat方法。

构造方法的继承与覆盖

构造方法的继承与普通方法不同。无参数的构造方法会自动调用父类的构造方法。带参数的构造方法不会继承父类的构造方法。

无参数构造方法的继承

public class Animal {Animal() {// 构造代码}}

public class Cat extends Animal {Cat() {// 在Cat的构造代码中,super()会被自动调用super();}}

带有参数的构造方法的继承

public class Animal {Animal(String name) {// 构造代码}}

public class Cat extends Animal {Cat(String name) {// 需要手动调用父类的构造方法super(name);}}

super关键字

在子类的构造方法中,super关键字用于调用父类的构造方法。它只能在构造方法中使用,并且必须是首要语句。

public class Cat extends Animal {Cat(String name) {super(name);// 其他构造代码}}

多态的基本概念

多态是面向对象编程的重要特性,它允许一个对象在接收到不同消息时,表现出不同的行为。同一类的不同对象可能会对相同的消息作出不同的响应。

多态和运行时绑定

Java通过动态绑定的机制实现多态。在编译时,方法引用是虚拟的。因此,在运行时,VM会根据实际使用的对象类型,动态选择正确的方法进行调用。

方法的重载

重载允许在同一类中定义多个方法拥有相同的名字,但参数列表必须有所不同。在Java中,以下情况会引发重载:

  • 参数个数不同
  • 相同位置的参数类型不同
  • public class Calculator {void add(int a, int b) {System.out.println("整数相加");}

    void add(double a, double b) {    System.out.println("小数相加");}

    }

    两个方法名称相同,但参数列表不同,因此属于重载。

    构造方法重载

    构造方法也可以重载。示例:public class Shape {Shape(int side) { ... }Shape(String type) { ... }}

    重载与覆盖的区别

    重载:

    • 方法名相同
    • 参数列表必须不同
    • 可在同一类中多个方法重载
    • 编译时确定调用方法

    覆盖:

    • 方法名和参数列表必须完全相同
    • 只能在子类中覆盖父类的方法
    • 在运行时确定调用方法`

    代码改进最后优化的代码是:

    class Animal {    public String name;    public Animal(String name) {        this.name = name;    }    public void eat(String food) {        System.out.println(this.name + "正在吃" + food);    }}class Cat extends Animal {    public Cat(String name) {        super(name);    }}class Bird extends Animal {    public Bird(String name) {        super(name);        public void fly() {            System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");        }    }}public class Test {    public static void main(String[] args) {        Cat cat = new Cat("小黑");        cat.eat("猫粮");        Bird bird = new Bird("圆圆");        bird.fly();    }}

    如若有任何疑问或者需要进一步优化,请随时告知!

    转载地址:http://vbrnz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现isupper函数功能(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
    查看>>
    Objective-C实现iterative merge sort迭代归并排序算法(附完整源码)
    查看>>
    Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
    查看>>
    Objective-C实现Julia集算法(附完整源码)
    查看>>
    Objective-C实现jump search跳转搜索算法(附完整源码)
    查看>>
    Objective-C实现jumpSearch跳转搜索算法(附完整源码)
    查看>>
    Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
    查看>>
    Objective-C实现k-means clustering均值聚类算法(附完整源码)
    查看>>
    Objective-C实现k-Means算法(附完整源码)
    查看>>
    Objective-C实现k-nearest算法(附完整源码)
    查看>>
    Objective-C实现KadaneAlgo计算给定数组的最大连续子数组和算法(附完整源码)
    查看>>
    Objective-C实现kadanes卡达内斯算法(附完整源码)
    查看>>
    Objective-C实现kahns algorithm卡恩算法(附完整源码)
    查看>>
    Objective-C实现karatsuba大数相乘算法(附完整源码)
    查看>>
    Objective-C实现karger算法(附完整源码)
    查看>>
    Objective-C实现KMP搜索算法(附完整源码)
    查看>>