zoukankan      html  css  js  c++  java
  • java 隐藏和覆盖

    最近重新复习了一下java基础,覆盖和隐藏这个问题上纠结了很久,经过实际编写和查证,得出结论如下


    首先关于隐藏包括两种情况
    一 同一个类中,如果定义了实例变量a和方法中的变量a,那么在方法中的a会把实例变量a隐藏,也就是说在方法中调用只能看到方法中声明的a
    二 继承关系中,静态方法静态变量和成员变量 被子类重写的话,都是隐藏。
    关于覆盖,就是我们日常理解的多态,如果子类中定义了父类相同的非静态方法则是覆盖,即方法的重写

    那么这个规则究竟什么原因呢
    要提到RTTI(run-time type identification)运行期类型检查,也就是运行期多态只针对覆盖,也就是说,
    如果父类的引用指向子类的实例时,只有重写这种情况jvm才会去动态检查该引用的真实类型,然后调用子类的方法,
    至于静态方法静态变量和成员变量 则看引用是是哪个类的就调用哪个类的方法和变量。

    eg:

    public class RunTime {

        public static void main(String[] args) {
            Animal a = new Cat();
            System.out.println(a.A);
            System.out.println(a.b);
            a.voice();
            a.method();

        }

    }

    class Dog extends Animal {
        public int b = 3;
        public static int A = 3;
        public static void method(){
            System.out.println("狗");
        }
        public void voice() {
            System.out.println("狗叫");
        }
    }

    class Cat extends Animal {
        public int b = 4;
        public static int A = 4;
        public static void method(){
            System.out.println("猫");
        }
        public void voice() {
            System.out.println("猫叫");
        }
    }

    class Animal {
        public int b = 0;
        public static int A = 0;
        public static void method(){
            System.out.println("动物");
        }
        public void voice() {
            System.out.println("动物叫");
        }
    }

    输出结果是:
    0
    0
    猫叫
    动物

  • 相关阅读:
    ServletContext笔记
    Session笔记
    Cookie笔记
    递归实现取数组最大值
    栈结构实现队列结构
    返回栈中最小元素的两种实现O(1)
    数组实现不超过固定大小的队列(环形数组)
    双向链表实现栈和队列
    Windows Server 2008 R2 / Windows Server 2012 R2 安装 .NET Core 3.1
    Windows 7 / Windows Server 2008 R2 升级至 SP1
  • 原文地址:https://www.cnblogs.com/luluQQ/p/4323350.html
Copyright © 2011-2022 走看看