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

2020-11-24 14:37:36 字数 6134 阅读 5968

1楼:煮饭饭

因为只有这样,基类才一定可以用派生类代替。如果派生类的访问权限变小了,这个原则就没法成立了。

这个应该算是java世界的准则,就像大自然里光速是极限,1+1只能等于2一样。

没有规矩不成方圆,用脚玩的叫足球,用手玩的叫篮球,既然这个东西叫java,就得遵守规矩。

里氏代换原则(liskov substitution principle, lsp):所有引用基类(父类)的地方必须能透明地使用其子类的对象。

里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。

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

2楼:匿名用户

因为 向上转型及java程序设计维护的原因例:假设一个父类a 拥有的方法 public void set***(){} 可以被其他任意对象调用

这个方法被子类b 覆写后 为 void set***(){} 即 默认的 访问权限 只能被本包极其子类 所访问

假设 其他包中的对象 c 调用 方法为:

get( a a)

而此时传入的对象为b类对象,假设为b此时b将转型为a但是b中的set***() 调用权限

已经被缩小了这将造成错误。所以子类对象不能比父类对象访问权限大以上只是一个例子还有其他出于易维护、易**结构设计的设计思想原因

3楼:匿名用户

首先在继承的时候子类不能比父类的访问权限小,这是原则,基于这里那么子类只可能要大于等于父类的拉

4楼:匿名用户

你说看子类中可以访问的方法比父类多吧 因为继承有了父类的还有了自己的呗。你看富二代啥都没,有了他老爹的就很无敌了。

5楼:匿名用户

子类继承了父类的非私有的属性和方法,还可以扩展自己的属性和方法,而这些就是子类特有的

6楼:匿名用户

父类能实现的子类一定能实现...

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

7楼:匿名用户

因为 向上转型及java程序设计维护的原因例:假设一个父类a 拥有的方法 public void set***(){} 可以被其他任意对象调用

这个方法被子类b 覆写后 为 void set***(){} 即 默认的 访问权限 只能被本包极其子类 所访问

假设 其他包中的对象 c 调用 方法为:

get( a a)

而此时传入的对象为b类对象,假设为b此时b将转型为a但是b中的set***() 调用权限

已经被缩小了这将造成错误。所以子类对象不能比父类对象访问权限大以上只是一个例子还有其他出于易维护、易**结构设计的设计思想原因

8楼:煮饭饭

因为只有这样,基类才一

定可以用派生类代替。如果派生类的访问权限变小了,这个原则就没法成立了。

这个应该算是java世界的准则,就像大自然里光速是极限,1+1只能等于2一样。

没有规矩不成方圆,用脚玩的叫足球,用手玩的叫篮球,既然这个东西叫java,就得遵守规矩。

里氏代换原则(liskov substitution principle, lsp):所有引用基类(父类)的地方必须能透明地使用其子类的对象。

里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。

为什么子类重写父类的方法的访问修饰符,不能低于父类的方法访问权限?

9楼:匿名用户

重写也叫覆写,修饰符、返回类型、参数就是要和父类一摸一样才叫覆写,意思是说各个地方都需要完美的盖住,在面向接口编程中,重写是子类有自己的逻辑要实现,同时又不破坏已写好程序逻辑的好方法

举个例子,在父类中是public的方法,如果子类中将其降低访问权限为private,那么子类中重写以后的方法对于外部对象就不可访问了,这个就破坏了继承的含义

10楼:匿名用户

java中四种访问权限 private如果子去重写父的方法,方法的权限默认是和父一样的,但也可以改,但只能加大权限,不能缩小权限,比如父是protected,重写时可以改成public,但如果是public的,重写只能是public

11楼:红色警姐

权限问题嘛,子类的权限要大于或者等于父类的

12楼:╃原罪丶灬

额 不能通过访问的权限来重载,重写的时候访问修饰符的限制大于被访问者,public >pro>def>pri

13楼:我哭了浅笑

可以这样理解的 这是个授权问题 先说 为什么不能小于,如果你写小了

相当于/*相当于 其实不是*/你私吞了父类的方法内容自己又私自定义了一个方法,这样会有方法重名的问题(与继承的思想不符合,如果你私有了,这个方法就不能再传下去) ,再说 为什么可以大于父类权限 ,因为父类方法既然可以继承 拿它就应该具备传递性,所 以就可以 大于父类的权限,以更好发挥继承提高**复用率的功能;

14楼:匿名用户

java中的多态机制是:子类的实例可以赋值给父类的引用,通过调用父类的方法就可以直接调用到子类实例中的方法。

本来父类的方法是public的,此时如果有其他类调用了父类的该方法,而子类实例中的方法是private的,private只允许在该类内部使用,会导致调用失败。

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

15楼:匿名用户

因为 向上转型的 及 java 程序 设计维护 的原因

例:假设一个 父类a 拥有的方法 public void set***(){} 可以被其他任意对象调用

这个方法被子类b 覆写后 为 void set***(){} 即 默认的 访问权限 只能被本包极其子类 所访问

假设 其他包中的对象 c 调用 方法为 get( a a)

而此时 传入的 对象为 b类 对象 假设 为b 此时 b将转型为a 但是 b中的set***() 调用权限

已经 被 缩小了 这将 造成错误

以上只是一个例子 还有其他出于 易维护 易**结构设计的 设计思想 原因....

16楼:匿名用户

子类对象“为什么可以”作为父类对象来使用?

简单的回答:因为可以这样,所以可以这样。也就是说因为内存结构支持这样,所以才有了这种语法。

对象实际上就是方法区中的**+堆中的变量空间,按照类装载规则,当装载子类时一并加载父类,这就意味着只要子类多的**在内存,则父类的**也会在内存。创建对象时,按照规则,将会在堆空间中开辟一个空间,这个空间就代表对象。包含的元素有哪些呢?

一是类所包含的成员变量(非静态),二是类的超类所包含的成员变量,三是一个指向方法区中类**的指针。

基于这种结构,不难理解通过父类引用子类的实质。不管通过什么引用,指向的还是那个内存区域,因为对象中包含父类的所有成员变量,所以可以按父类来“套”,通过父类指针访问的变量空间也是父类的变量(如果覆盖)。那么通过父类指针访问的方法呢,显然要通过对象中指向方法区的指针找方法,指向的是**?

是子类。子类不包含方法怎么办,在找父类。

也就是说,如果发生覆盖,通过父类引用的空间是父类的,而方法是子类的。

简单回答了一下,没有仔细检查语句是否通顺。

17楼:匿名用户

你这样做,那java还有什么用?连面向对象最重要的核心之一多态都没了

18楼:匿名用户

假如父亲为public权限 儿子用private权限 这样就绝子绝孙了 懂么?

19楼:匿名用户

因为父类只能有一个,

子类可以有多个。

java子类override的方法的访问权限为什么不能比父类窄?从实用角度讲,这是什么道理? 10

20楼:gta小鸡

根据继承和多态规则,如果一个父类a具有public方法fun,那么它的任意子类对象上都应该可以调用方法fun。而如果子类重写方法的访问权限可以低于父类方法,那么可以将子类中的fun方法改写为private,就会出现子类对象无法调用fun方法的现象,这就违背了继承和多态基本原则。例如动物可以呼吸,那么任何属于动物的具体物种例如人都可以调用呼吸方法。

如果将人类的呼吸方法改为private,那么人虽然身为动物却无法呼吸,这就违背了继承原则。

21楼:匿名用户

你想想,父类用public 子类用 private

那外面 还能用父类去调用子类的方法么?

显然不能。一般调用都是 直接new个父类去调用的。如果子类重写了,就调用重写的。没有就用父类的。

在java 中子类对象为什么不能比父类对象有更严格的访问权...

22楼:匿名用户

大顺大财大吉利 新春新喜新世纪 横批:万事如意

java 子类重写继承的方法时,可以降低方法的访问权限吗?

23楼:§奀♂仔

不可以的,首先,子类继承父类的访问

修饰符要比父类的更大,也就是更加开放,假如我父类是protected修饰的,其子类只能是protected或者public,绝对不能是friendly(默认的访问范围)或者private,当然使用private就不是继承了。其次,还要注意的是,继承当中子类抛出的异常必须是父类抛出的异常的子异常,或者子类抛出的异常要比父类抛出的异常要少。

24楼:百毒bu知道

不可以 可以扩大 就是说子类不能"减少"(使用private使用不可调用之类)上级的行为

25楼:蓝风水晶灵

貌似子类的方法访问权限不能高于父类。

java子类中如何访问和修改父类成员

26楼:枫神的天空

根据父类成员的访问权限修饰词分为两种情况:

①父类成员域由private修饰,那么在子类中不能直接访问父类成员域,但是可以通过父类中的公共方法访问以及修改父类成员域。如:

class fatherclass

public void seta(int a)

}则在子类中可以通过geta获得父类的成员域的值,通过seta修改父类成员域的值

②父类成员由public或protected或default(不写访问权限修饰词),在子类中可以直接访问父类成员域,可以修改继承的父类成员域,但是不能直接修改父类本身的成员域(可以通过上面所说的public void seta(int a)对父类本身的成员域进行修改),以下是示例**:

运行结果:

父类本身的a与子类从父类继承的a占据两个不同的独立的存储空间,在继承之后,他们的值互不相干(继承的时候进行值传递),这样可以避免因为子类中的操作而导致对父类的a的值进行预期结果之外的修改

27楼:魏蕤

这就要看你用的这个参数在父类的访问权限修饰符是private,public,protected还是default(即什么都没写),下面分别说明:

1.当该参数的访问修饰符为private时.子类的函数不能接着访问该参数,如果要访问该参数,你可以通过在父类中声明该参数的getter和setter方法,这样就可以供外界访问该参数了。

如:getter方法:public string getname()

setter方法:public void setname(string name)

2.当该参数的访问修饰符为public,protected或default时。由于子类可以从父类中继承所有声明为public,protected或default的方法或属性,所以子类的函数就可以直接使用该参数了。