我有两个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";),它就可以通过编译了,这是为什么呢?
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";),它就可以通过编译了,这是为什么呢?
class Sub extends Base{
public void use(){
System.out.println(str);
}
}class Sub extends Base{
public void use(Base b){
System.out.println(b.str);
}
}
不要搞混了
我已经说过这是一个JAVA SE基础但又不是平凡的问题了。
同根也须继承。JAVA 官方不推荐使用protected ,因为只要继承一个类就可以拥有一个类的内部属性访问权,这对于熟知二进制文件结构或是.class的的黑客来说,只要将自己的文件(.class)上传到指定地点就可以对系统内部肆意破换或是获取信息。
其他类可以访问某一类的protected属性,这一点有点出乎我的意料
public class MyTest {
public static void main(String[] args){
Base base=new Base();
System.out.println(base.str);
}
}class Base{
protected String str="cc";
public void make(){}
}
public void use(Base b){
System.out.println(b.str); //编译出错
}--------------》》》》》 public void use(){
System.out.println(str);
}
因为你参数中的【Base b】就相当于【Base b = new Base()】
根本就没有涉及到继承,解释只有一个,protected不能挎包访问。对于protected这个属性很多人有误解,其实是这样的:
package a;public class Base { public String str1 = "1"; protected String str2 = "2"; private String str3 = "3";
}package b;import a.Base;public class Sub extends Base { public void test() { Base b = new Base(); System.out.println(b.str1);// 可以挎包访问public的属性[通过对象点的形式]
System.out.println(b.str2);// 不可以挎包访问protected的属性[通过对象点的形式]
System.out.println(b.str3);// 不可以挎包访问private的属性[通过对象点的形式] System.out.println(str1);// 可以挎包访问public的属性[通过继承的形式]
System.out.println(str2);// 可以挎包访问protected的属性[通过继承的形式]
System.out.println(str3);// 不可以挎包访问private的属性[通过继承的形式]
}
}
System.out.println(str2);// 可以挎包访问protected的属性[通过继承的形式]这两句是重点,别搞混了、、、
http://www.diybl.com/course/3_program/java/javaxl/2008104/147426.html
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);
}
}
使一个类成员成为protected意味着它可以被扩展这个类的类所访问,但是这句话并不一定准确。更准确地讲,一个受保护的成员除了可以被类自身以及与其在同一个包中的代码访问之外,它还可以在一个类中通过对象引用来访问,这些对象引用的类型要与受保护成员所在类的类型是相同的或是其子类型的。这段你能看的懂吗?
很少用protected的路过,除里面试的时候。
==》我猜这是你自己翻译的吧?你好好看看是不是翻译的有问题。尤其是最后一句,根本就不对对于protected的访问权限问题,可以分为两大类:1)同包 2)不同包1)同包:本类可以直接使用
其它类可以创建对象来引用(对象点的方式)2)不同包:只有其子类才可以引用,而且是以继承的特性来引用(相当于自身的属性)
而不是通过创建父类对象的方式来引用(不能用父类对象点的方式)就这些