• java-封装、继承、多态


    java的三大特性:封装、继承、多态

    1、封装

    2、继承

    java提供了斜变返回类型,表示在导出类中的被覆盖的方法可以返回基类方法的返回类型的某种导出类型。

    3、多态

    多态只针对方法,通过动态绑定实现多态。static方法会禁止动态绑定,private或final修饰的方法不可被继承,故也就没有动态绑定的说法了

    • 以下分析构造器内部的多态行为

    一般方法内调用多态方法,在程序运行时候就可以确定属于基类还是哪个导出类;构造器内部调用多态方法,就要调用那个方法的被覆盖后的定义,如果未覆盖则调用其父类的方法。

    package com.duotai;
    
    public class Main {
    
        public static void main(String[] args) {
            new RoundGlyph2(21);
        }
    }
    class Glyph{
    
        public Glyph(){
            System.out.println("Glyph.draw() before");
            draw();
            System.out.println("Glyph.draw() after");
        }
    
        public void draw(){
            System.out.println("Glyph.draw()");
        }
    }
    class RoundGlyph extends Glyph{
    
        public int radius=9;
    
        public RoundGlyph(){
    
        }
    
        public RoundGlyph(int radius){
            System.out.println("RoundGlyph构造器,radius="+radius);
        }
    
        public void draw(){
            System.out.println("RoundGlyph.draw(),radius="+radius);
        }
    }
    class RoundGlyph2 extends RoundGlyph{
    
        public RoundGlyph2(int radius) {
            System.out.println("RoundGlyph2构造器,radius="+radius);
        }
    
    //    public void draw(){
    //        System.out.println("RoundGlyph2.draw(),radius="+radius);
    //    }
    }

    输出结果:

    Glyph.draw() before
    RoundGlyph.draw(),radius=0
    Glyph.draw() after
    RoundGlyph2构造器,radius=21

    将注释代码打开,输出结果:

    Glyph.draw() before
    RoundGlyph2.draw(),radius=0
    Glyph.draw() after
    RoundGlyph2构造器,radius=21

    关注输出第二行输出结果,由于对象的初始化顺序导致了“RoundGlyphdraw(),radius=0”,而不是RoundGlyphdraw(),radius=1。

    因此,在构造器内部调用多态方法的效果相当难以预料(可能会造成难以发现的错误),因为被覆盖的方法在包含被覆盖的方法的对象被完全构造之前就会被调用。

    编写构造器有一条有效的准则:通常避免在构造器内部调用除final或private修饰的方法,否则可能会出现上述问题。

  • 相关阅读:
    北漂爱情[柒涩波]
    JavaScript基础知识五
    JavaScript基础知识四
    JavaScript基础知识三
    JavaScript基础知识二
    js内存泄漏
    CSS三列布局之左右宽度固定,中间元素自适应问题
    VScode 前端常用插件推荐
    将博客搬至CSDN
    python网络编程学习笔记(二)
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9458074.html
Copyright © 2020-2023  润新知