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

猫叫

动物

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值