本帖最后由 derline 于 2009-11-10 21:43:06 编辑

解决方案 »

  1.   

    会提示,new cat().cry()有问题
      

  2.   

    在不同包中子类不能访问父类中的protected变量或方法
      

  3.   

    protected的访问级别比包级的高,所以不同包的子类是可以访问父类的。
      

  4.   

     new cat().cry()
    代码可以这么用吗?? 不用定义一个新的函数名字 直接 申请空间??
      

  5.   

    既然不同包的子类可以访问父类的protected成员,那么new cat().cry()为什么不行?
    确实把父类的cry()改为public的,那样new cat().cry()就没事了;
    或者cry()继续为protected的,new tiger().cry()也正常;再或者,protected static void cry(), 这样new cat().cry()也正常。我乱了。。高手来分析总结一下吧。
      

  6.   

    5楼,包优先于protected
    如果不同包的的继承,protected是不能被子类访问的。
      

  7.   

    建议按java的编程规范来写代码,类名首字母要大写 Cat Tiger ,这样看起来会舒服点
      

  8.   

    这种问题自己动手做试验,不是很复杂的,再不问可以问G老师。
    包优先于protected !如果不同包的继承,protected是不能被子类访问的。当然这也分情问,如果你用的是父类对象,那肯定是不可以的。如果用子类对象,那是可以的,我想这就是多态的表现吧。如果你加static的话,那根本不必要去创建对象,直接可以调用了。我的理解至少是这样的。
      

  9.   


    首先更正一下,1、在java中一般不说什么什么函数的,都叫方法;2、定义的也不是叫函数名,而是叫对象名或叫变量名,因为这些都是存在stack中的,而你说的函数也就是方法是在code segment中的,方法不调用,就是一段没有用和代码,只有方法调用了才起到作用,学好java的最好方法就是分析好内存,可以自己给自己补点计算机专业的一本天书———编译原理,对学java有用。
    其次,回答您的问题,不用定义这是可以的,如果你定义了一个变量名(对象名)就是在stack中申请了一个内存空间用来指向heap中的new出来的Cat对象,如果不定义,就是直接在heap中new一个Cat类的对象,而没有引用指向它,两种最后都是这个new出来的对象
    end
      

  10.   

    作用域  当前类 同一包内 子孙类 其他包 
    public    √    √       √    √ 
    protected √    √       √    × 
    default   √    √      ×     × 
    private   √    ×      ×      × 
    首先你的cry()方法是protected修饰的,所以在另外一个包中是无法访问到这个方法的。具体的访问权限见上表,不要想的太复杂,就这么简单。
      

  11.   

    简单的说 protected 修饰符 是可以被同一个包中的子类访问。 楼主的程序 子类和父类在不同的包下,所以是不可以访问 父类的protected方法的。
      

  12.   

    new tiger().cry();是可以运行的。
    子类可以继承不在同一个包里面的父类的protected方法和变量,但是继承了以后,只能用子类的引用来访问,而不能使用父类的引用来访问,因为不同包里面的protected是不可见的,而继承了以后就是自己的了
      

  13.   

    在main方法里面调用,跟子类父类没什么关系啊
      

  14.   

    new cat().cry();
    这个写法是可以的。
      

  15.   

    这里跟继承没有关系,你只是new了一只CAT而已,cry说protected的当然访问不到啦。不要因为再子类里面的main方法里new了一个父类就是继承,那里有!!!!
      

  16.   

     new cat().cry() 这句代码其实跟继承是没有关系的 cry() 有protected修饰 要想访问 这个类要跟cat位于同一个包中才可以
      

  17.   

    不同包中的子类可以看见父类的Proteced方法,指的是不同包中的子类可以继承父类的proteced方法,并不是说你可以用父类的引用去调用父类的proteced方法。
      

  18.   

    只能用子类的引用来访问吗?
    看下边代码:package com.p2;
    import com.p1.*;
    public class Tiger  extends Cat { void f()
    {
    super.cry();  //错误吗?

    }
    static void g()
    {
    new Cat().cry(); //错误吗?
    new Tiger().cry(); //错误吗?
    }

    }
    上边的super.cry();  就不是:只能用子类的引用来访问。这有错误吗?