码迷,mamicode.com
首页 > 编程语言 > 详细

java 隐藏和覆盖

时间:2015-03-09 14:24:44      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

最近重新复习了一下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
猫叫
动物

java 隐藏和覆盖

标签:

原文地址:http://www.cnblogs.com/luluQQ/p/4323350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!