美文网首页
第八章:多态

第八章:多态

作者: Hsicen | 来源:发表于2020-06-20 16:57 被阅读0次

向上转型

  • 向上转型:把对某个对象的引用视为对其基类型的引用的做法被称作为向上转型

  • 后期绑定:在运行时根据对象的类型进行绑定,也叫作动态绑定或者运行时绑定;在Java中除了staticfinal方法(private也属于final方法)之外,其它所有的方法都是后期绑定;Java中所有的方法都可以通过后期绑定实现多态

  • 只有非private方法才可以被覆盖(重写),但是还是要密切注意覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切的说,在导出类中,对于基类中的private方法,最好采用不同的名字

缺陷:域与静态方法

  • 任何域的访问操作都将由编译器解析,因此不是多态的

    class Super{
        public int field = 0;
        
        public int getField(){
            return field;
        }
    }
    
    class Sub extends Super{
        public int field = 1;
        
        public int getField(){
            return field;
        }
        
        public int getSuperField(){
            return super.field;
        }
    }
    
    public class FieldAccess{
        public static void main(String[] args){
            Super sup = new Sub();
            System.out.println(sup.field); //0
            System.out.println(sup.getField()); //1
            
            Sub sub = new Sub();
            System.out.println(sub.field); //1
            System.out.println(sub.getField()); //1
            System.out.println(sub.getSuperField()); //0
        }
    }
    
  • 如果某个方法时静态的,它的行为就不具有多态性;静态方法是与类绑定,而并非与单个的对象相关联的

    class StaticSuper{
        public static String staticGet(){
            return "Base staticGet";
        }
        
        public String dynamicGet(){
            return "Base dynamicGet";
        }
    }
    
    class StaticSub extends StaticSuper{
        public static String staticGet(){
            return "Derived staticGet";
        }
        
        public String dynamicGet(){
            return "Derived dynamicGet";
        }
    }
    
    public class StaticMethod{
        public static void main(String[] args){
            StaticSuper sup = new StaticSub();
            System.out.println(sup.staticGet()); //Base staticGet
            System.out.println(sup.dynamicGet()); //Derived dynamicGet
        }
    }
    

构造器和多态

  • 通常构造器不同于其它种类方法,涉及到多态仍是如此;尽管构造器并不具有多态性(实际上是static方法,只不过static声明是隐式的),但还是非常有必要理解构造器怎样通过多态在复杂的层次结构中运作

  • 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用

  • 复杂对象调用构造器的顺序:调用基类的构造器按照声明顺序调用成员的初始化方法调用导出类构造器的主体

  • 在构造器内唯一能够安全调用的那些方法是基类中的final方法或private方法,这些方法不能被覆盖,不会出现在父类中调用子类重写的方法,而此时子类还没有初始化的问题

    class Glyph{
        void draw(){
            System.out.println("Glyph.draw()");
        }
        
        Glyph(){
            System.out.println("Glyph() before draw()");
            draw();
            System.out.println("Glyph() after draw()");
        }
    }
    
    class RoundGlyph extends Glyph{
        private int radius = 1;
        
        RoundGlyph(int r){
            radius = r;
            System.out.println("RoundGlyph.RoundGlyph(), radius = "+radius);
        }
        
        void draw(){
            System.out.println("RoundGlyph.draw(), radius = "+radius)
        }
    }
    
    public class PolyConstructors{
        public static void main(String[] args){
            new RoundGlyph(5);
            //Glyph() before draw()
            //RoundGlyph.draw(), radius = 0
            //Glyph() after draw()
            //RoundGlyph.RoundGlyph(), radius = 5
        }
    }
    

相关文章

  • Thinking in Java 第八章多态读书笔记

    1.第八章一开头就说了多态的作用:消除类型之间的耦合关系。 2.多态的前提是继承与重写,因为继承之后允许将子类视为...

  • 第八章:多态

    多态分离做什么和怎么做,将接口和实现分离开来。也称为动态绑定、后期绑定或运行时绑定。

  • 第八章多态

    Overview 最近在学习Thinking in Java这部java经典,书非常不错,作者有非常深厚的编程功底...

  • 第八章多态

    多态是继数据抽象和继承之后的第三种基本特征.多态也叫(动态绑定,运行时绑定或者后期绑定) 8.1方法调用绑定 方法...

  • 第八章:多态

    向上转型 向上转型:把对某个对象的引用视为对其基类型的引用的做法被称作为向上转型 后期绑定:在运行时根据对象的类型...

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • 详解Java多态

    详解Java多态 多态定义 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态...

  • Think in Java 第八章(多态)

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 多态通过分离做什么和做怎么做,从另一个将...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

网友评论

      本文标题:第八章:多态

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