ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java中子类再重写父类方法时,为什么子类的权限修饰符必须大于或者等于父类权限修饰符?

2021-05-11 09:02:43  阅读:236  来源: 互联网

标签:父类 实例 修饰符 class 访问 protected fun 权限 public


/**
*假设A,B,C三个类都不在相同的包下,并且假设以下编辑器不会报错
*/
public class A{
    public void fun() {
        
    }
}
public class C extends A{
    @Override
    protected void fun() {//假设这里编译可以通过

    }
     
}
public class B{
    public static void main(String[] args){
	A c = new C();
	c.fun();
	//因为c为A类型,所以可以调用fun(),但是在运行时,c肯定是调用自身的fun(),又因为c中fun()为protcted修饰,B和C又不在同一个包下,所以C中fun()只能由其子类调用,所以会出现问题
    }  
}

其实在向上转型的过程中,如果重写的权限修饰符小于父类的权限修饰符,会出现问题,还有private修饰的方法不能被覆盖,其实private修饰的方法已经隐士的声明了final。

引出一个问题,protected权限修饰符
1.子类和基类在同一个包下,被声明为 protected 的变量、方法和构造器,除了能够被自己的实例访问外,也可以被其子类的实例访问。
2.子类和基类不在同一个包下,protected修饰的,不能自己的实例访问,但是可以被子类的实例访问。

//1.不再同一个包下
public class A{
    protected String name = "zyt";
}
public class B extends A{
    public static void main(String[] args){
	System.out.println(new B().name);//zyt
	//在不同包下,自己的实例却访问不了,出现编译不通过
	System.out.println(new A().name);
    }
}
//2.在同一个包下
public class A{
    protected String name = "zyt";
}
class B extends A{
    public static void main(String[] args){
	 System.out.println(new B().name);//zyt
	 System.out.println(new A().name);//zyt
    }
}

总结

  1. private:只有在当前类的内部才能被访问
  2. 缺省:可以在同一个包下的任何类访问.
  3. protected:除了可以在同一个包下任何类中访问外,在不同包下的类可以通过继承该类,通过子类实例来访问。注意:也只有子类实例可以访问,自己本身的实例也不可访问。
  4. public:可以在任何类中访问。

标签:父类,实例,修饰符,class,访问,protected,fun,权限,public
来源: https://www.cnblogs.com/sowhappy/p/14753774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有