作者minGW128 (minGW128)
看板java
标题[问题] 请问private继承的问题
时间Sat Oct 11 18:53:58 2014
各位好,我今天想要厘清我自己对於private data/method继承的观念
所以试着打了一些小范例:
class A {
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
我对private的继承观念是:class B内还是会继承class A的data与showData()
private只是限制data与showData()只能在class A内scope内使用
所以以下范例,我可以理解为什麽会错
class A {
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
class Main {
public static void main(String[] args) {
B b = new B();
b.showData();
// wrong, showData() can only be accessed within the scope
// of class A
}
}
错误的地方是由於b.showData()的使用地方,是在class A的scope之外
但是以下范例,我就不能理解为什麽编译不过了
class A {
public static void main(String[] args) {
B b = new B();
b.showData(); // wrong! I don't know why
}
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
这个范例中,b.showData()是在class A的scope中
请问为什麽不行呢?是不是我对继承或是private有甚麽理解错误的地方?
谢谢大家!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.136.226.85
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1413024841.A.379.html
1F:推 roder: 在执行A的时候 Class B还没有被建构出来 当然不会过 10/11 18:57
2F:推 cyclone350: static method 的范围跟一般 class method 不一样 10/11 19:44
3F:→ minGW128: 谢谢楼上两位 我也只能这样说服我自己 否则观念很难连贯 10/11 19:54
4F:→ cyclone350: 就像你在 static method 没办法使用 this 一样 10/11 20:10
5F:→ ssccg: 这跟static和先後没关系,class宣告先後没有差 10/11 22:05
6F:→ ssccg: private不会被继承,用B的reference是不能呼叫的 10/11 22:06
7F:→ ssccg: 改成 ((A)b).showData(); 就可以 10/11 22:06
8F:→ ssccg: 不是看scope,是看reference是什麽type 10/11 22:09
9F:→ ssccg: 在class A中只是隐含都用type A的this reference去呼叫 10/11 22:10
10F:推 cyclone350: 我知道ssccg的意思... 但是原po是问为什麽在A的method 10/11 22:23
11F:→ cyclone350: 里面无法用A的方法。恩... 的确跟static没关系,搞错 10/11 22:24
12F:→ cyclone350: 抱歉 XD 10/11 22:24
万分感谢ssccg!
我测试了一下
class A {
public static void main(String[] args) {
B b = new B();
((A)b).showData();
}
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
这样的确可以正确编译!
但是如果是
class A {
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
class Main {
public static void main(String[] args) {
B b = new B();
((A)b).showData(); // wrong here
// The method showData() from the type A is not visible
}
}
也就是把((A)b).showData();写在class A的scope之外
仍然还是不行的,无法通过编译
所以class scope对於class private member可否access也是考量因素之一?
※ 编辑: minGW128 (220.136.226.85), 10/11/2014 23:18:57
13F:→ ssccg: 没错还是要在class里面才能用 10/12 00:11
14F:→ ssccg: 应该说非static的member,除了scope还要看reference type 10/12 00:14