有一个类
package family;

public class Student {

protected void tt(){
System.out.println("I am a student...");
}
} 另一个类,
这样可以:
package temp;public class Doctor extends family.Student{

void ss(){
tt();
}
}
这样就不行:
package temp;public class Doctor extends family.Student{

void ss(){
new family.Student().tt();
}
}
区别在哪里?

解决方案 »

  1.   

    protected的意思是包内及继承类范围tt();表示子类使用父类的方法
    new family.Student().tt();表示新建包外的Student示例,这是就找不到tt()方法了。另外tt();是一个实例
    new family.Student().tt();就是两个实例了
      

  2.   

    1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用      2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。      3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。 
    作用域       当前类    同一package   子孙类     其他package 
    public        √         √             √           √ 
    protected     √         √             √           × 
    friendly      √         √             ×           × 
    private       √         ×             ×           × 你的这个程序就是--不同package 访问 protected方法(tt()方法)是X 就是不行的意思
      

  3.   

    另外 1楼说的
    应该是没问题的 可能是他看错了吧 
    new family.Student   这是个Student()的实例,然后调用它的tt()的方法(new family.Student()).tt();
      

  4.   

    sorry  我也打错了
    new family.Student  这是个Student()的实例,然后调用它的tt()的方法(new family.Student()).tt(); 
    应当是
    new family.Student()这是个Student的实例,......呵呵 春节愉快
      

  5.   

    1楼说的很对,这样说看你能够理解不
       由于你重新new了一下创建了一个新的对象,由于不在同一个包内,你不能够调用他的protected方法
       而你继承则能够调用protected方法
      

  6.   

    刚接触Java  有点不懂! !   以后常来这里学习学习 
      

  7.   

    以前同样被这问题困扰过,看来跟楼主经历相同呀!这么理解吧,为什么JAVA中会用到protected修饰符呢?
    因为当你创建个类时,希望在此包中任何类和它的子类中应用某个方法,而不希望其它包中任何一个类调用它时就需要用到protected关键字了。
      

  8.   

    1楼的理解很正常,尽管说是“两个实例”不太准确,其意思或许是:方法ss中产生了Student的一个实例,而调用ss方法还需要一个Doctor的实例。
    我想lz提出的问题,如果不是某个考试题目的话,就应该是楼主没有能够很好的理解继承。
      

  9.   

    受教了 too《 回复内容太短了!》
      

  10.   

    我觉得这个问题其实挺典型的,问题出在“protected子类可见”这种介绍比较笼统吧The fields x and y are declared protected and are accessible outside the package points only in subclasses of class Point, and only when they are fields of objects that are being implemented by the code that is accessing them. 在包外访问proteced成员只有在其声明类的子孙类中且只有当它们是访问它们的代码所实现的对象的成员时比如
    package temp;public class Doctor extends family.Student{
        
        void ss(){
            new family.Student().tt();
        }
    }这里虽然是在子类中,但非访问它们的代码所实现的对象,应该是Doctor,而非Student至于为什么是这样?我想初步的可能就是为了防止使用Student的客户直接访问吧,是直接访问,
    尽可能地防止误用而产生的错误,就需要用到这些