package testOO;
public class Demo41 {

protected String name ;

public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}
package testO1;import testOO.Demo41;
public class Demo42 extends Demo41{


public static void main(String[] args) {
Demo41 demo = new Demo41();
String name2 = demo.name;
}
}

解决方案 »

  1.   

    name的属性是protected  是因为这个不?
      

  2.   

    protected定义的变量只能在同一个包内访问,
    而你的Demo42在testO1包里,Demo41咋test00包里,不同包,所以不能访问,
    需要改为
    public String name ;
      

  3.   

    作用域           当前类       同一package    子孙类       其他package
    public             √              √                   √                 √
    protected        √              √                  √                  ×
    friendly           √              √                   ×                 ×
    private            √              ×                   ×                 ×你说的不对吧
      

  4.   


    那个protected 不是不能在其他包里访问的嘛  有什么不对的?
      

  5.   

    不对啊,protected是可以被继承的
      

  6.   

    我知道了,第二个demo因为依然是Demo41的实例,而Demo42的name是protected的无法让非本包非继承关系的类访问~~~ 没错吧~~~
      

  7.   

    name,你这个属性是private的吧,改为public
      

  8.   

    protected按照资料上的说法是:继承访问权限,或者是包访问权限,关于继承访问权限这个我虽然明白,但是讲不明白,直接上代码吧,你看看它的含义应该可以明白:
    package A;
    public class ProtectedDemo01 {
    protected String str = "helloworld";
    }
    --------------------------------------------
    package B;//不同的package
    public class ProtectedDemo02 extends ProtectedDemo01{
    public static void main(String args[]){
    ProtectedDemo01 pro01 = new ProtectDemo01();//这样写是错误的,访问不到
    System.out.println(pro01.str);

    ProtectedDemo02 pro02 = new ProtectDemo02();//这样才可以访问的到
    System.out.println(pro02.name);
    }
    }
      

  9.   

    Demo41 demo = new Demo41();
    String name2 = demo.name;
    这不叫被子类所用
      

  10.   

    如果想访问name,那就提供一个get方法吧
    public String getName(){
      return this.name;
    }
      

  11.   


    这位说的比较详细Demo2继承了Demo1,所以Demo2里面访问的其实是Demo2自己继承来的protected name而不是Demo1的name。 protected权限只说可以被其他包的类继承,没有说可以被其他包的类访问
      

  12.   

    在Class Demo42里面
    Demo41 demo = new Demo41();
    String name2 = demo.name;这么说吧这里的demo是Demo41的实例(你就把它看成是Demo41算了),而这里的访问name其实默认是Demo42的name,这个name是它继承来的,是Demo42自己的不是Demo41的,Demo41无权访问。
      

  13.   


    补充一下:在相同的package之中
    此类的对象是可以在任何地方都访问类中的protected属性的。
    这个就是它的包访问权限
      

  14.   


    protected 的最准确的形容是:包访问权限+继承访问权限
      

  15.   

    当父类与子类位于同一包中时
    不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问权限!
    当父类与子类位于不同包中时:protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问。
      

  16.   

    ////////////////////////////////////
    package a;
    public class Demo41 {
    protected String name="hello World";

    public static void main(String[] args) {
    Demo41 demo = new Demo41();
    String name2 = demo.name;
    }
    }
    ////////////////////////////////////
    package b;
    import a.Demo41;
    public class Demo42 extends Demo41 {
    private String name = "hello";
    public void TXT() {
    String name2 = super.name;//能访问
    System.out.println(name2);
    System.out.println(name);
    Demo41 demo = new Demo41();
    // name2 = demo.name;报错,不能访问
    //说明两者是有区别的。
    }
    public static void main(String[] args) {
    new Demo42().TXT();
    }
    }
    ////////////////////////////////////
    运行结果。
    hello World
    hello
    ////////////////////////////////////
      

  17.   

    你这个根本没有用到那个继承的嘛,只是在其他包的类里面调用了new Demo41()而已如果
    你把第二个类写成import testOO.Demo41;
    public class Demo42 extends Demo41{
    public static void main(String[] args) {
    Demo42 demo = new Demo42();
    String name2 = demo.name;
    }
    }就行了,这样才是继承后调用protected字段。