在java 中子类对象为啥不能比父类对象有更严格的访问权限?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java 中子类对象为啥不能比父类对象有更严格的访问权限?相关的知识,希望对你有一定的参考价值。

子类对象“为什么可以”作为父类对象来使用?
简单的回答:因为可以这样,所以可以这样。也就是说因为内存结构支持这样,所以才有了这种语法。
对象实际上就是方法区中的代码+堆中的变量空间,按照类装载规则,当装载子类时一并加载父类,这就意味着只要子类多的代码在内存,则父类的代码也会在内存。创建对象时,按照规则,将会在堆空间中开辟一个空间,这个空间就代表对象。包含的元素有哪些呢?一是类所包含的成员变量(非静态),二是类的超类所包含的成员变量,三是一个指向方法区中类代码的指针。
基于这种结构,不难理解通过父类引用子类的实质。不管通过什么引用,指向的还是那个内存区域,因为对象中包含父类的所有成员变量,所以可以按父类来“套”,通过父类指针访问的变量空间也是父类的变量(如果覆盖)。那么通过父类指针访问的方法呢,显然要通过对象中指向方法区的指针找方法,指向的是哪里?是子类。子类不包含方法怎么办,在找父类。
也就是说,如果发生覆盖,通过父类引用的空间是父类的,而方法是子类的。
简单回答了一下,没有仔细检查语句是否通顺。
参考技术A 你这样做,那JAVA还有什么用?连面向对象最重要的核心之一多态都没了 参考技术B 因为 向上转型的 及 java 程序 设计维护 的原因

例:
假设一个 父类A 拥有的方法 public void setXXX() 可以被其他任意对象调用
这个方法被子类B 覆写后 为 void setXXX() 即 默认的 访问权限 只能被本包极其子类 所访问

假设 其他包中的对象 C 调用 方法为 get( A a)
a.setXXX();

而此时 传入的 对象为 B类 对象 假设 为b 此时 b将转型为a 但是 b中的setXXX() 调用权限
已经 被 缩小了 这将 造成错误

以上只是一个例子 还有其他出于 易维护 易代码结构设计的 设计思想 原因....本回答被提问者和网友采纳
参考技术C 因为父类只能有一个,
子类可以有多个。
参考技术D 假如父亲为public权限 儿子用private权限 这样就绝子绝孙了 懂么?

以上是关于在java 中子类对象为啥不能比父类对象有更严格的访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

为啥java的子类中必须调用父类的构造方法

Java中子类的访问权限为何比父类大?

父类对象是不是可以强制转换成子类的对象?为啥?

子类为啥要调用父类的构造函数

JAVA学习知识点汇总

Java:父类对象为啥能转换成子类对象