JAVA中方法和变量在继承中的覆盖和隐藏

关键字: java继承 方法覆盖 方法隐藏

       我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种 情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下

 

首先我们来看几个概念

       隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法

        覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问parent被覆盖的变量或者方法

 

首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则

       1.父类的实例变量和静态变量能被子类的同名变量隐藏

       2.父类的静态方法被子类的同名静态方法隐藏

       3.父类的实例方法被子类的同名实例变量覆盖

 

还有几点需要注意的是

       1.不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法

       2.不能用子类的实例方法覆盖 父类中同样标示的静态方法

       3.这点儿请注意,就是变量只会被隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏 父类的静态变量

 

Java代码  收藏代码
  1. //父类  
  2. class Parent  
  3. {  
  4.     public static String kind="javastudy.extendsstudy.parent";  
  5.     public static int age=50;  
  6.     public String name="Parent";  
  7.   
  8.     //静态方法,返回包名  
  9.     public static String getKind()  
  10.     {  
  11.         System.out.println("parent的getKind()方法被调用了");  
  12.         return kind;  
  13.     }  
  14.     //静态方法,返回年龄  
  15.     public static int getAge()  
  16.     {  
  17.         System.out.println("Parent的getAge()方法被调用了");  
  18.         return age;  
  19.     }  
  20.   
  21.     //实例方法,返回姓名  
  22.     public String getName()  
  23.     {  
  24.         System.out.println("Parent的getName()方法被调用了");  
  25.         return this.name;  
  26.     }  
  27. }  
  28. //子类  
  29. class Child extends Parent  
  30. {  
  31.     public static String kind="javastudy.extendsstudy.child";  
  32.     public int age=25;  
  33.     public String name="child";  
  34.   
  35.     //隐藏父类静态方法  
  36.     public static String getKind()  
  37.     {  
  38.         System.out.println("child的getkind()方法被调用了");  
  39.         return kind;  
  40.     }  
  41.       
  42.     //获取父类包名  
  43.     public static String getParentKind()  
  44.     {  
  45.         return Parent.kind;  
  46.     }  
  47.       
  48.     //覆盖父类实例方法  
  49.     public String getName()  
  50.     {  
  51.         System.out.println("child的getName()被调用了");  
  52.         return this.name;  
  53.     }  
  54.       
  55.     //获取父类名称  
  56.     public String getParentName()  
  57.     {  
  58.         return super.name;  
  59.     }  
  60.     /* 
  61.      *错误,实例方法不能覆盖父类的静态方法 
  62.     public int getAge() 
  63.     { 
  64.         return this.age; 
  65.     } 
  66.     */  
  67. }  
  68.   
  69.   
  70. class Test   
  71. {  
  72.     public static void main(String[] args)   
  73.     {  
  74.         Child child=new Child();  
  75.         System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);  
  76.         //输出:子类名称:child,年龄:25,包:javastudy.extendsstudy.child  
  77.   
  78.         //把child转换成parent对象  
  79.         Parent parent=child;  
  80.   
  81.         System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);  
  82.         //输出:转换后的名称:Parent,年龄:50,包:javastudy.extendsstudy.parent  
  83.   
  84.         System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());  
  85.         //输出:子类访问父类被隐藏的实例变量name:Parent  
  86.           
  87.         System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());  
  88.         //输出:子类访问父类被隐藏的静态变量kind:javastudy.extendsstudy.parent  
  89.   
  90.         child.getName();  
  91.         //输出:child的getName()被调用了  
  92.   
  93.         //**************注意看这个方法,返回的还是子类的getName  
  94.         parent.getName();  
  95.         //输出:child的getName()被调用了  
  96.   
  97.         child.getKind();  
  98.         //输出:child的getkind()方法被调用了  
  99.   
  100.         parent.getKind();  
  101.         //输出:parent的getKind()方法被调用了  
  102.     }  
  103. }  
  

 好了,看了结果后总结下吧

       1.同名的实例方法被覆盖 ,同名的静态方法被隐藏 ,child类的getName实例方法覆盖 了parent的getName实例方法,chind的getKind方法隐藏 了parent类的getKind方法

       2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法

       3.如果需要访问父类被隐藏 的实例变量,加上super就好了,比如访问父类的name,写上super.name就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值