protected修饰符修饰的变量、方法,限制包以外的类对其进行访问。
就是说,在一个类中不能调用其他类的protected变量和方法,要想调用,
必须是public。
    关于继承,子类会继承其父类的protected、public变量和方法
所以用super.xx就没问题,因为该方法是他继承父类的成员方法

解决方案 »

  1.   

    一.  修饰符
                      类变量(对象共享) 类名,对象名点取
                      类方法 1)static方法中不能直接使用非静态成员, 因
                           为非静态成员与实例相关,通过对象点取间接使用
                                 2)static方法中不能用this(与实例相关)   
                                 3)非static方法中可以使用static成员      
                      static块:和数据成员时并列的位置,用于类初始化
                           类装入时执行一次(第一次创建对象,第一次使用
                            static成员,不同的静态块,按在类中的顺序执行)
                         注:只能修饰成员,不能修饰方法变量.
                    static方法覆盖时,没有起到覆盖的作用
      

  2.   

    楼上的解释的很清楚,至于你说的在变量前加上static关键字,第一个程序就可以编译运行了,那是绝对不可能的.一个变量能否被访问只与访问修饰符public,protected,private和友好的(就是什么也不加)有关,与是否是static是无关的.好好看看Thing in java对你会有帮助的!
      

  3.   

    1, test.Tree tmp = new test.Tree(),然后用tmp引用来访问test.Tree的方法这已经不是对基类的访问了,可称为对test.Tree类对象的方法调用(虽然你extends test.Tree),和其他类用test.Tree tmp = new test.Tree()没有区别,用super.xxx才是对基类的访问方式。
    2, 至于你将变量和方法改为static后,能用test.Tree tmp = new test.Tree(),的tmp引用访问,这种情况实际上就绕开了“可称为对test.Tree类对象的方法调用“,tmp.age能通过与你实例化test.Tree无关,不用new xxx一样行,只要有这句:test.Tree tmp,而age是一个静态字段,不实例化同样存在。
    方法outPut()同理。
      

  4.   

    你提供的例子:
    public class Pine extends test.Tree 
    {
      public static void main(String[] args)
      {
        test.Tree tmp = new test.Tree();
        tmp.outPut();
        System.out.println(tmp.age);
      }
    }
    中,你是在Pine中调用Tree的outPut方法,protected限制派生类以外的调用,是指派生类(Pine)可以调用父类(Tree)的protected方法,而不是在派生类中可以用父类(Tree)调用父类本身(Tree)的方法,二你的程序是后者,所以不行。可以改为:
        test.Pine tmp = new test.Pine();//派生类
        tmp.outPut();//调用父类的保护方法
    希望队你有所帮助
      

  5.   

    pzl686(阿虎) :首先protected是限制包以外非子类的其他类的访问。这就是protected修饰符和不用任何修饰符(default)的区别。而正确的继承理解应该是:如果我这样调用肯定没有任何问题:Pine pine = new Pine();pine.outPut();尽管我没有声明outPut();但是它由于继承已经拥有此方法了。继承我了解。现在不解的是为什么我将protected变量和方法改为static后,如此的错误也就没了:
    D:\work\java\test\Pine.java:13: outPut() has protected access in test.Tree
        tmp.outPut();
           ^
    D:\work\java\test\Pine.java:14: age has protected access in test.Tree
        System.out.println(tmp.age);另外,wjmmml(笑着悲伤),static的含义我也基本了解,但你最后一句说的“static方法覆盖时,没有起到覆盖的作用”是什么意思?请看我如下的测试: class MrHappyObject 
    {
      MrHappyObject(){} 
      private String getMood() 
      {
        return "happy";
      }
      protected static String howDoYouFeel() 
      {
        return "I feel happy!";
      }
      
    }  
      
     class MrSadObject extends MrHappyObject 
    {
      String add = " sad";
      private StringBuffer getMood() //因为private的方法没有继承下来,所以这个的确不是覆盖。
      {
        return new StringBuffer("sad");
      }
    /* 
       如果我用此段方法替换下面的方法体,明显是违反了覆盖的原则;
       因此编译也就报错。说不能overridding 一个String返回值得方法为StringBuffer;
      public static StringBuffer howDoYouFeel(int a) 
      {
         return new StringBuffer("I feel sad!");
      }
    */
      public static String howDoYouFeel() 
      {
        return "I feel sad!";
      }} class PsychiatristObject 
    {
      public static void main(String[] args) 
      {
        System.out.println("How do you feel, Mr. Happy Object?");
        System.out.println(MrHappyObject.howDoYouFeel());
        System.out.println("");
        System.out.println("How do you feel, Mr. Sad Object?");
        System.out.println(MrSadObject.howDoYouFeel());
        }
      } 
      
    运行的结果为:
    How do you feel, Mr. Happy Object?
    I feel happy!How do you feel, Mr. Sad Object?
    I feel sad!
    Interactive Session Ended显然Mr. Sad Object的howDoYouFeel()达到了覆盖父类方法的效果。
    这难道还不说明static方法是可以被覆盖的么?!另外你说" "是static是什么意思啊?我只知道 是空格的转译码,它和static有关么?
      

  6.   

    bhr(追风) :",至于你说的在变量前加上static关键字,第一个程序就可以编译运行了,那是绝对不可能的."
    如果我没有测试过,我也认为这是不可能的。当然那我还会有如此迷惑么?
    请你测试运行以后再下结论!lbluekey(蓝鸟)的说法我比较赞同,我知道正确的调用应该使用super对象。不过不解的是,当变量和方法改为静态的后(也就是只要类加载就存在,不需实例化),它虽然存在,但访问应该也受protected的保护啊。例如我将他们改为private static;虽然都已是类变量和类方法(不是实例变量和实例方法了);但其他类绝对访问不了的,因此static和访问属性是应该没有关系的,但却有了影响,是不是SUN的JDK的问题啊。
      

  7.   

    static的方法可以重置,但不能重载。
    重置是两个方法除了方法体不同,没有别的不同。
      

  8.   

    关于static方法能否覆盖,有没有权威的文档能说明一下啊?你说的重置,我也想过。但我认为像父类中的private方法,在子类中就可以再次声明定义(甚至可以是同名同参不同返回类型,而且完全不能调用父类的这个方法),所以我感觉这才像是重置(不过这都是个人感觉,因为我也没有看过书上有写重置到底是个什么概念)不过其实也无所谓了,这种变态的题目我想考试是不会考的。