zoukankan      html  css  js  c++  java
  • 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修饰的方法,否则可能会出现上述问题。

  • 相关阅读:
    无线鼠标和无线键盘能不能唤醒睡眠中的电脑的解决方案
    教你如何设置同时上内外网(单网卡或双网卡)
    Oracle_字符集问题(数据库与客户端字符集关联关系)
    关于破解移动宽带光猫 型号: GS3101 超级管理员密码
    Oracle 低版本客户端连接 18c 报ORA-28040 和 ORA-01017 错误的解决方法
    sql语句分组统计出年月日下数据记录数目
    Servlet文件上传
    ActiveMq+zookeeper+levelDB集群整合配置
    mongodb 级联操作查询时,关联条件
    maven插件地址博客园
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9458074.html
Copyright © 2011-2022 走看看