组合与继承

作者: 墨线宝 | 来源:发表于2021-01-06 23:09 被阅读0次

原文链接http://zhhll.icu/2020/05/06/java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/java%E5%9F%BA%E7%A1%80%E4%B9%8B%E7%BB%84%E5%90%88%E4%B8%8E%E7%BB%A7%E6%89%BF/

为了避免重复代码太多,导致代码不好维护,大家需要学会如何复用代码,代码复用的两种方式,组合和继承

组合:在新类中创建现有类的对象
继承:创建现有类的新类

向上转型

class Instrument {
    public void play() {
        System.out.println("Instrument.play()");
    } 
}

public class Wind extends Instrument {
    public void play() {
        System.out.println("Wind.play()");
    }
}

public class Music {
    
    public static void tune(Instrument i){
        i.play();
    }
    public static void main(String[] args) {
        Wind flute = new Wind();
        Music.tune(flute); // 向上转型
    }
}

从一个更具体的类型转化为更一般的类型,所以向上转型用挂失安全的。子类可能会比父类包含更多的方法,必须至少具有和父类一样的方法。

final

final方法

final方法的作用是防止子类通过重写改变方法的行为
类中所有的private方法都是隐式的指定为final,因为不能访问private方法,所以不能重写它。给private方法加上final修饰并不会给方法带来额外的含义。重写一个private方法时编译并不会报错,一个方法是private的,他就不属于父类的一部分,只是创建了一个同名的方法而已

final类

final类的作用是该类不允许被继承

多态

方法绑定

对于上述向上转型的例子,编译器如何知道该调用哪个方法,方法的入参只是一个Instrument引用
java采用后期绑定,在运行时根据对象的类型进行绑定,在运行时判断对象的类型,从而调用方法,在编译时编译器不知道对象的类型,java对于static和final方法无法采用后期绑定(private方法也是隐式的final)

多态的陷阱

注:多态只是针对于普通方法,对于属性和静态方法不会存在多态
属性在编译时就会被解析

public class Parent {
    public int field = 0;

    public int getField(){
        return field;
    }
}

public class Child extends Parent {
    public int field = 1;

    @Override
    public int getField(){
        return field;
    }
}

public class TestField {
    public static void main(String[] args) {
        Parent parent = new Child();
        System.out.println("parent.field= "+parent.field);
        System.out.println("parent.getField= "+parent.getField());
        Child child = new Child();
        System.out.println("child.field= "+child.field);
        System.out.println("child.getField= "+child.getField());
    }
}

执行结果

parent.field= 0
parent.getField= 1
child.field= 1
child.getField= 1

Parent.field和Child。field被分配了不同的存储空间,Child其实是存在两个filed属性的:本身的以及父类的,但是在引用Child的field的时候,默认的field属性是来自于本身的,如果要获取父类的该属性,需要使用super.field来显示地指定获取父类属性
但是这种情况一般不会发生,首先属性一般来说都是私有private的,其次子类和父类一般也不会起相同的属性名字

对于静态方法的话,静态方法只与类关联,与对象无关

由于本身的博客百度没有收录,博客地址http://zhhll.icu

相关文章

  • PHP学习2

    六.继承与多态 1. 类的组合和继承(继承===“是、像”、“父与子”,组合===“需要”、“整体与局部”) 组合...

  • js一些技巧.md

    js中的constructor和prototype 组合继承与寄生继承 组合继承 可以继承实例属性和方法,也可以继...

  • 组合与继承

    原文链接http://zhhll.icu/2020/05/06/java%E5%9F%BA%E7%A1%80/%E...

  • 【python面试指北】3.类和面向对象

    面向对象编程 封装、继承、多态 组合与继承 优先使用组合(has a)而非继承(is a) 类变量和实例变量的区别...

  • 6. 结构型-适配器模式

    类与类之间的关系: 继承、组合; 优先使用组合:继承关系比较僵硬,一旦继承无法更改;组合关系比较灵活,在实际运行当...

  • js高级程序设计笔记14

    继承 1.确定原型与实例的关系 2.借用构造函数继承 3.组合继承 4.原型式继承 5.寄生式继承 6.组合寄生

  • flutter进阶

    上一篇 Flutter开篇 widget组合与自绘 组合--返回widget组合.png 组合--继承widget...

  • 继承与组合复用

    继承 继承体系初始化顺序 创建子类对象时,默认先调用父类的无参构造方法,当父类中存在多个构造方法,但没有无参构造方...

  • 第十四章 继承和组合

    简介:代码重用机制:组合(composition)与继承(inheritance) 14.1 组合语法 访问嵌入对...

  • 继承

    原型继承 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合继承 优点: 因为组合继承最大的问题是无论什么...

网友评论

    本文标题:组合与继承

    本文链接:https://www.haomeiwen.com/subject/ktkaoktx.html