本人今天在课堂上吃瘪了,有个修饰符protected问题老师说得不是太清楚,之后大家一起讨论也没个结果,因为是远程视频,所以没办法向老师问个明白,希望各位能帮我彻底弄明白,小弟感激之尽
如果赶时间,直接看第3个程序,很简单的一个问题,只是我没弄明白package creazy;public class TestP {//基类

protected static int i = 8;
protected int j = 3;}
package creazy;public class TestP_one {//同一个包中调用,没有问题,很清楚,可以不看了

public static void main(String[] args)
{
TestP one = new TestP();
System.out.println(TestP.i);
System.out.println(one.j);
}}//不同包中的子类调用,在protected的访问权限内,应该没问题的,结果出问题了,傻了,
//讨论了半天,总结出碰到static就用A计划,没碰到就用B计划,崩溃,只好发到网上请教
package jdbc;import creazy.TestP;public class TestP_two extends TestP{

public static void main(String[] args)
{
TestP two = new TestP();
System.out.println(TestP.i);//1,这个可以用基类调用哪个protected成员,
//可以看到去掉extends后就不能调用。
System.out.println(two.j);//2,报错了,不能直接用基类调用protected成员,这个我知道,
      //可是为什么上面的可以用基类调用static成员,
     //而这个却不行
TestP_two three = new TestP_two();
System.out.println(three.j);//子类可以调用protected成员
}}
总结:protected修饰的成员可以用子类来调用
问题:1,为什么protected static修饰的成员可以直接用基类调用。请教各位大大说清楚,可以一直把这个归结到一个Java基本规则为止,谢谢
      2,为什么protected修饰的成员只能通过子类来调用。请教各位大大说清楚,说出来的道理能够不和问题1发生冲突,谢谢

解决方案 »

  1.   

    protected static 修饰后就成了类属性或者方法  其子类,和不同包中的类都可以访问。
    protected int j = 3;  对象属性   子类可以访问,不同包就不行。
    应该是这样
      

  2.   

    System.out.println(TestP.i);//1,这个可以用基类调用哪个protected成员,
                                //可以看到去掉extends后就不能调用。
    i是基类中的静态成员变量,属于类变量,可以直接调用!!!
      

  3.   

    protect修饰后又用static修饰,确实有点那个不好说,不知道到底哪个起作用了,还是两个作用于互补了,观望高手解析~~~~~
      

  4.   

    网上找了个答案
    如果有不同package的类想调用它们,那么这个类必须是定义它们的类的子类,要注意的是在子类中必需通过子类对象调用它们,不能通过定义它们自身来使用,因为它们对另一个package来说是隐藏的。
      

  5.   

    2楼说得很清楚,static修饰后就是类变量,可以直接调用了,问题1不用讨论了,2楼加10分
    问题2,只能通过子类来调用,为什么?
      

  6.   

     2,为什么protected修饰的成员只能通过子类来调用。请教各位大大说清楚,说出来的道理能够不和问题1发生冲突我想你理解错了吧,其实用protect修饰成员变量或者是成员函数目的是限制这个属性(或者是方法)的访问权限,不仅仅是要通过子类来调用的!例如在本类中你就可以随便调用protect修饰的变量或方法!
      

  7.   

    package creazy;public class TestP {//基类
        
        protected static int i = 8;
        protected int j = 3;
        public static void main(String[] args)
    {
     TestP MyTestP=new TestP();
     System.out.println(MyTestP.j);//本类对象可以随意访问这个变量,修饰符protect仅仅是限制别的类对象对它的访问,例如你的第三个类对象}}
      

  8.   

    我们知道,类(class)只有两种修饰符,就是public的和默认的(没有任何修饰符),这这一前提下,要是这个类是public修饰的话,类中的属性要是默认的话(类没有用public修饰),这是类中的属性要是用protect修饰,那么这个属性的访问权限仅限于同一个包中的类对象!若是类是public的话,那么这个属性的访问权限就是包中的类和所有的子类!!!书上很清楚,我也说不大清楚,慢慢理解吧!!
      

  9.   

    楼上大体上说得清楚了,加10分
    还有个小细节没搞清楚:在别的package中导入这个类,就能够new出这个类的对象,那么这个对象访问自家的属性为什么就行不通了呢,课堂上那位老师只说了子类能够调用,可是没说基类的对象为什么就不能调用自家的东西了
      

  10.   

    protected修饰的方法或变量将会被任何位置的子类继承,但是永远只能被最早定义他的父类所在的包的类所见(除了该类以及其子类能看到本身的该protected方法或变量之外。)