问大家一个JAVA SE基础但又不是平凡的问题

chenchengamao 2009-07-31 03:24:40
我有两个JAVA源文件,一个是Base,它的代码如下:
package a;
public class Base{
protected String str="cc";
public void make(){}
}


还有一个是Sub,它的代码如下:
package b;
import a.*;
public class Sub extends Base{
public void make(){
str="abc";
}
public void use(Sub s){
System.out.println(s.str);
}
public void use(Base b){
System.out.println(b.str); //编译出错
}
}



请问下各位,为什么Sub类中的System.out.println(b.str);会出现编译出错?我只知道这个和protected的使用有关,而且如果我将Base类中的str字段改成静态的(即protected static String str="cc";),它就可以通过编译了,这是为什么呢?
...全文
342 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingZippo 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kakukyowu 的回复:]
首先LZ这个编译错误跟继承的确没有关系
因为你参数中的【Base b】就相当于【Base b = new Base()】
根本就没有涉及到继承,解释只有一个,protected不能挎包访问。

对于protected这个属性很多人有误解,其实是这样的:

Java code
package a;

public class Base {

public String ……
[/Quote]


看到这个学习了
KAKUKYOWU 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 chenchengamao 的回复:]
使一个类成员成为protected意味着它可以被扩展这个类的类所访问,但是这句话并不一定准确。更准确地讲,一个受保护的成员除了可以被类自身以及与其在同一个包中的代码访问之外,它还可以在一个类中通过对象引用来访问,这些对象引用的类型要与受保护成员所在类的类型是相同的或是其子类型的。

这段你能看的懂吗?
[/Quote]

==》我猜这是你自己翻译的吧?你好好看看是不是翻译的有问题。尤其是最后一句,根本就不对。。。

对于protected的访问权限问题,可以分为两大类:1)同包 2)不同包

1)同包:本类可以直接使用
其它类可以创建对象来引用(对象点的方式)

2)不同包:只有其子类才可以引用,而且是以继承的特性来引用(相当于自身的属性)
而不是通过创建父类对象的方式来引用(不能用父类对象点的方式)

就这些。。。
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 genrong 的回复:]
我刚刚翻了一下《Java程序设计语言》,发现答案就在同一段话里面,“这些对象引用的类型要与受保护成员所在类的类型是相同的或是其子类型的。”也就说public void use(Reference b);Reference只能是Sub类或者Sub的子类,但是Base不是Sub类型,只能说Sub是Base类型
[/Quote]


哈哈,是啊,我可能是这里搞晕了吧,因为翻译的不是很好,我读的比较吃力。
xiaozejun 2009-07-31
  • 打赏
  • 举报
回复
protected子类可以访问父类的东西 但是必须在同一个包里面
xxq0235 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 believefym 的回复:]
protected,不同的package访问不到,你的问题不涉及到继承的问题

还有,别搞标题党了。。。
[/Quote]


正解
startsg 2009-07-31
  • 打赏
  • 举报
回复
路过 帖子全看了!
楼主看样子是已经全部搞明白了!
总体还是绕着访问控制走!楼主就不要绕了,说说不平凡之处吧!
zl3450341 2009-07-31
  • 打赏
  • 举报
回复
。。。我想看看楼主到底想问什么
GenRong 2009-07-31
  • 打赏
  • 举报
回复
我刚刚翻了一下《Java程序设计语言》,发现答案就在同一段话里面,“这些对象引用的类型要与受保护成员所在类的类型是相同的或是其子类型的。”也就说public void use(Reference b);Reference只能是Sub类或者Sub的子类,但是Base不是Sub类型,只能说Sub是Base类型
彷徨的蜗牛 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 believefym 的回复:]
protected,不同的package访问不到,你的问题不涉及到继承的问题

[/Quote]
同意
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 fondofjava 的回复:]
楼主是 炫耀 还是 咱的?????????
很少用protected的路过,除里面试的时候。
[/Quote]

此话怎讲?我是把书上看不懂的东西拿出来问的!
taksunm 2009-07-31
  • 打赏
  • 举报
回复
basic
fondOfJava 2009-07-31
  • 打赏
  • 举报
回复
楼主是 炫耀 还是 咱的?????????
很少用protected的路过,除里面试的时候。
ImAHunter 2009-07-31
  • 打赏
  • 举报
回复
可以说不平凡的地方了。
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
我引用错了,我是在和“KAKUKYOWU”说
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
这是我在JAVA之父写的书上找到的。这也是JLS规范中的内容。
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 javachenyang 的回复:]
如果你要跨包访问protected成员变量的话,可以这样做:
Java codepackage b;import a.*;publicclass Subextends Base{publicvoid make(){
str="abc";
}publicvoid use(Sub s){
System.out.println(s.str);
}publicvoid use(Base b){
System.out.println(super.str);
}
}
[/Quote]



使一个类成员成为protected意味着它可以被扩展这个类的类所访问,但是这句话并不一定准确。更准确地讲,一个受保护的成员除了可以被类自身以及与其在同一个包中的代码访问之外,它还可以在一个类中通过对象引用来访问,这些对象引用的类型要与受保护成员所在类的类型是相同的或是其子类型的。

这段你能看的懂吗?
王铎开 2009-07-31
  • 打赏
  • 举报
回复
你把BASE 里的str改成public不就得了
KAKUKYOWU 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 chenchengamao 的回复:]
呵呵,终于有一位朋友回答的像样点的了,但是你回答的还不到百分之30,你那个我想是你自己总结的结论吧,你还没说到原理。
[/Quote]

你还想知道什么原理?
JavaChenYang 2009-07-31
  • 打赏
  • 举报
回复
如果你要跨包访问protected成员变量的话,可以这样做:

package b;
import a.*;
public class Sub extends Base{
public void make(){
str="abc";
}
public void use(Sub s){
System.out.println(s.str);
}
public void use(Base b){
System.out.println(super.str);
}
}
chenchengamao 2009-07-31
  • 打赏
  • 举报
回复
19楼的朋友还是谢谢你。

我就是原理不懂,所以小弟在这请各位朋友们帮帮忙。回答的好另外再加分。
加载更多回复(22)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧