作者sbrhsieh (十年一梦)
看板java
标题Re: [问题] private继承问题
时间Thu Jul 17 00:54:50 2014
※ 引述《qrtt1 (有些事,有时候。。。)》之铭言:
: 标题: Re: [问题] private继承问题
: 时间: Wed Jul 16 09:49:27 2014
:
: ※ 引述《kiwatami (悠游自在)》之铭言:
: ............................................... 43
:
: → kiwatami:官方文件有说我就不能问吗= =? 怎麽感觉你很不想我发言 07/15 22:08
: → Chikei:因为你一直在"你的想法"、"你觉得",这边是Java版我们在讨 07/15 22:59
: → Chikei:论的是Java,那当然所有不清楚的名词最终都以JLS为标准 07/15 22:59
: → Chikei:现在JLS直接说明了private field就是不会被继承,或者说这 07/15 23:00
: → Chikei:就是Java the Language的"继承"定义,你再觉得不合理也请接 07/15 23:00
: → Chikei:受,因为我们是在讨论Java语言。 07/15 23:01
: → Chikei:当然要来大战Java定义的继承跟一般programmer谈到继承时候 07/15 23:08
: → Chikei:的心灵模型一不一样不是不可,但很明显跟原po的问题无关 07/15 23:09
: → TonyQ:其实我觉得都可以讨论啦 就是对语意了解不一致而已XD 07/16 06:21
: → TonyQ:也没有人说不能/不想发言,原 po 多心了~ XD 07/16 06:22
: → kiwatami:不好意思 从小到大我觉得不合理的都不会接受... 没有要吵 07/16 08:58
: → kiwatami:架的意思啦 只是觉得好像讲出自己的想法反而不行的感觉 07/16 08:58
:
: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.2
:
: Members of a class that are declared private are
: not inherited by subclasses of that class.
:
: 目前问题的关键在於 kiwatami 版友
:
: 没有把 field 与 method 的继承视为独立事件。
:
:
: Members of a class 可以是 field 或 method,
:
: 版上已经接受规格定义的人,是将这二种 member 的继承与否当成独立事件
:
:
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.130.128.164
: ※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1405475369.A.20D.html
: → swpoker:每种语言都有不同的特质~要先放下自己~才能得到世界 07/16 11:44
: → ssccg:我不觉得他的问题跟field和method是不是独立有关 07/16 12:42
: → ssccg:上一篇回的比较好,问题在inherit是可存取还是存在 07/16 12:43
: → swpoker:k版友的问题在於用自己的角度去理解JAVA~而忽略JAVA特性 07/16 14:29
: → swpoker:继承是可不用复制贴上就可以存取成员~达到模组化的目的 07/16 14:30
: → swpoker:但是java特别注重在存取成员的特性包括对象及范围 07/16 14:31
: → swpoker:类别A想套用类别X~那麽不用复制类别X的程式码~继承就好了 07/16 14:32
: → swpoker:但是也不代表类别X就要给人看光光~也些东西不可以给人看到 07/16 14:33
: → swpoker:所以根据对象及范围的不同就有了这四种存取限制 07/16 14:35
: → NewSpec:劝k不要用这种心态来学习语言, 除了遇到瓶颈不容易突破外 07/16 21:05
: → NewSpec:也很容易在熟练某种技术後过於坚持, 而忽略其他技术的优点 07/16 21:07
我的立场比较接近 TonyQ 版仆,我认为没有必要过度强调哪一个"说法"才是绝对
正确的,毕竟这与你对继承的定义为何有关。
这里是 Java 版,你可以说以 Java 官方的说法为准,在讨论一些 Java 方面的
主题时,用语使用官方定义的说法是比较好沟通,假如主题已经是与"定义"本身
有关,我觉得只拿"官方说法"出来服人是不够的。(可能对方根本无法了解或接受
官方说法的内涵)
看得出来 kiwatami 对"继承"的定义是奠基在成本而非功能/界面上。
我猜他想厘清的是:
public class A {
private static int n;
private int num;
}
public class B extends A {
}
在 runtime B class object 在空间上的成本是否不小於 A class object?
B instance 在空间上的成本是否不小於 A instance?
若是的话,该用什麽样的观点去看这件事:class B 没有继承 class A 定义的
private field 的话,为什麽 B instance( or class object) 会负担这个成本?
我是先接触 C++ 後接触 Java,在学习 C++ 的阶段我也曾对何谓"继承"感到
困惑过,有了一些想法後,在学 Java 时我对就没有再着重於「Java 中继承又
是怎麽一回事」。(实际上我不觉得我应该在学习 Java 时再尽力去试着接受或
理解 Java 宣称的继承是什麽)
给 kiwatami 与打从心底觉得没有"继承"的作用就不应该出现任何影子(任何可以
观察到没有被继承的部分存在都算)者,可以试着参考看看。
我的看法是:
把扩充(继承)与封装(access privilege/modifier)当作是两个正交的面向,Java
的 extends 属於前者,扩充者承袭了被扩充者的所有内涵,至於扩充者能不能
碰触这些东西,那是由後者(封装程度)来决定。
或者是把一个 object 的规格(介面)与实作(内涵)分开来看,CB extends CA 的语意
是 CB 继承了 CA 的规格与实作(IB extends IA, CB implements IA 则是 IB/CB
继承了 IA 的规格),CA 的 private fields 是实作的细节,其成为 CB 实作(内涵)
的一部分,而 CA 定义的 private fields 都不属於 CA 的规格(介面)的一部分,
故也不在 CB 的规格内。而当 CB instance 要去使用自身承袭 CA 而来的那一个
部分时,也必须同去使用另一个 CA instance 般透过其规格来使用。
*这种说法受 protected/package 的影响,特定条件下是说不通的,除非能接受
object 对外界所呈现的规格是浮动的看法(object 的规格非固定,会视观察者而
改变)。
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.238.35.96
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1405529694.A.FCF.html
※ 编辑: sbrhsieh (36.238.35.96), 07/17/2014 00:59:02
※ 编辑: sbrhsieh (36.238.35.96), 07/17/2014 03:19:11