作者kiwatami (悠游自在)
看板java
标题Re: [问题] private继承问题
时间Sun Jul 20 12:24:17 2014
其实我的疑问很简单
public Class Parent{
private Foo foo;
private Bar bar;
public Foo getFoo(){
return foo;
}
public Bar getBar(){
return bar;
}
}
public Class Child extends Parent{
public void doSomething(){
Foo foo = this.getFoo();
}
private void doAnother(){
Bar bar = this.getBar();
}
}
public Class Arrangement{
public void init(){
Child child = new Child();
child.doSomething();
}
}
在doSomething中的getFoo();
是从哪里取得Foo这个物件的?
而Foo这个物件在这种情况下是存在於哪一个类别?
实作上的确会存在一个父类别的物件
而Foo及其getter也的确存在於父类别内而不是在子类别内
以下都是从定义上来阐述非实作上的真正行为
拿到继承这方面讲
定义上写着Child继承了Parent的getFoo()
但却没有继承Parent的Foo
所以定义上的流程应该是:
call getFoo() from Child -> return foo from Parent
or
call getFoo() from Parent -> return foo from Parent
如果是前者 不是非常奇怪吗?
没有继承foo 要从哪里跟Parent拿foo?
如果是後者 又何必用到"继承"这两个字?
只是开放存取权限而已 全部都是从Parent存取
如果只是为了extends去强加解释
那我认为一开始就直接用"扩充/扩展"会更容易理解
毕竟这也是我们用extends的目的
不知道各位能不能用自己的说法而不是官方文件
为小弟妹欧吉巴桑解惑一番?
以下是题外话
今天有一个人提出他对定义的看法
就表示不会只有他一个人这样想
像其他回文的板友一样
越多人提出自己的看法 有各种相同/不同的论点
整个讨论串的完整性就越高
但如果论点都只是你不该这样想、请你接受或是官方文件就这样说
那跟我们台湾人所受的教育有何不同?
都只是强迫的填鸭式教育罢了
从小老师的教学都是我们不能有自己的想法
不能用自己的想法去解题
就算答案对了 老师也不会解释过程有甚麽错误
而是回答 "因为课本不是这样教"
我觉得这才是真正应该改变的想法
※ 引述《sbrhsieh (十年一梦)》之铭言:
: ※ 引述《qrtt1 (有些事,有时候。。。)》之铭言:
: : 标题: Re: [问题] private继承问题
: : 时间: Wed Jul 16 09:49:27 2014
: : ............................................... 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 的继承与否当成独立事件
: : --
: : → 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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.70.199
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1405830260.A.523.html
1F:推 luoqr:new Child时会顺便建构Father, 存取foo变数是跟father拿 07/20 12:42
2F:→ luoqr:Father给的只有getFoo()并非变数本身 07/20 12:43
3F:→ luoqr:不过实际上JVM会怎麽分配记忆体 那就要看怎麽实作JVM了? 07/20 12:43
4F:推 luoqr:你可用其它方式解读"定义" 并无人限制你 只是沟通上方便而已 07/20 12:48
5F:→ luoqr:你可以做一个真的会把变数继承给子类别的VM 也可以不要这样 07/20 12:54
6F:→ luoqr:只要满足继承的条件就好 07/20 12:54
7F:推 pzyc79:扩充感觉比较符合实际 继承好像独立出来的感觉 07/20 20:44
是的 实作上就像你说的那样
问题就在於要怎麽用继承来解释这样的关系
8F:推 luoqr:实际上英文也是用extends而非inherit XD 07/20 22:59
9F:→ antiquerefer:看来你不适合走这行 在软体里定义与介面是十分重要的 07/20 23:52
10F:→ antiquerefer:虽然你可以使用实作观点去理解定义 07/20 23:53
11F:→ antiquerefer:但不代表了解定义本身是不好的 07/20 23:54
12F:→ antiquerefer:也不觉得那些回您定义的人是填鸭式教育 07/20 23:55
这边指的是要我不论如何也请接受这个定义这件事
没有得到任何说明 只要我接受 非常填鸭吧XD?
而我也不是不接受其他人的说法
只是有一部分都没有直接回答问题
而是像您一样顾左右而言他的说
"我不适合走这行" 或是其他对我未来的期许有点担忧之类的...
无关紧要的东西
感谢大家的关心XD
只是我觉得这里您似乎多虑了...
13F:→ antiquerefer:反而觉得您是obstinate audience 07/20 23:56
14F:→ antiquerefer:了解定义 -> 为什麽这样定义(优缺) -> 定义的特性 07/21 00:05
15F:→ sbrhsieh:请问到目前为止,哪些回文/推文有在讨论为什麽如此定义? 07/21 00:37
16F:→ antiquerefer:因为连第一步都做不到了 何来第二步 07/21 04:25
17F:→ antiquerefer:没有共识 就想要讨论具体? 先朝野协商吧 07/21 04:26
18F:推 Killercat:很早很早很早以前是称为Father, 不过不知道是不是性别 07/21 06:13
19F:→ Killercat:议题的关系,很早以前就改称Parent了 :P 07/21 06:14
20F:推 Kennyq:推l大 => 实际上英文也是用extends而非inherit 07/21 12:24
21F:→ AmosYang:以前许多设计架构里也是用 master/slave 等字,现在也是 07/21 13:47
22F:→ AmosYang:改用 parent/child 了 :D 07/21 13:47
23F:→ Killercat:IDE太早夭 不然应该也会被靠杯 XD 07/21 14:48
24F:→ sbrhsieh:就是没有共识才要讨论啊~摆什麽架子 07/21 15:51
25F:→ gmoz:感觉像是文字游戏 07/21 15:53
的确是文字游戏 从一开始这就是文字游戏
26F:→ TonyQ:我认为是後者~从定义面来讲变数继承与否就是能存取与否而已 07/21 16:31
27F:→ danny8376:为何这样定义? 你知道spec先要出来语言才会实做出来吗 07/21 19:59
※ 编辑: kiwatami (59.115.70.199), 07/21/2014 20:38:45
28F:推 Eryngium:推!!有些人根本想都没想过你的问题就狂否定 07/22 08:48