2004年11月23日

1.  我们知道,类成员的访问控制修饰符有public , protected , private,它们形成了四种控制级别:


public : 能访问该类的任何地方可以访问public成员


protected : 该类所属包内的类或该类的派生类可以访问protected成员


无修饰符 : 该类所属包内的类可以访问无修饰符成员


private 该类本身能访问private成员


2.  针对protected成员,有一个容易误解的地方,请看下面的代码


base.java (test/base.java)


package test;


 


public class base {


protected int i=0;


}


 


TestProtected.java


import test.base;


 


public class TestProtected extends base {


public static void main(String [] args) {


TestProtected tp = new TestProtected();


       


System.out.println(tp.i); //Correct , 派生类中继承了基类的protected成员,派生类中能访问派生类对象所继承的protected成员


       


       


        base bbb = new base();


System.out.println(bbb.i); //Error , 不能访问基类对象的protected成员


       


       


}


}


3.  通过以上代码,可以得出结论:在生成派生类时,派生类可以继承基类的protected成员,这个继承的protected成员在派生类内部是可以访问的,但是在派生类内部无法直接访问基类对象的protected成员。


4.  更进一步,一种派生类内部只能访问该种派生类的对象继承的基类protected成员,不能访问基类的其他派生类对象继承的基类protected成员。请看代码:


base.java (test/base.java)


package test;


 


public class base {


protected int i=0;


}


 


TestProtected.java


import test.base;


 


public class TestProtected  extends base {


public static void main(String [] args) {


TestProtected tp1 = new TestProtected();


        derive tp2 = new derive();


       


System.out.println(tp1.i); // correct


System.out.println(tp2.i); //Compile error


       


}


}


 


class derive extends base {

}

1.  当派生类中的方法与基类的方法相同时(指方法名和参数表相同),叫做派生类override基类的方法。


2.  当派生类中的成员变量名与基类的成员变量名同名时,叫做派生类shadow基类的成员。


3.  Overrideshadow在使用派生类的对象的表现是不同的。请看下面的代码:


public class TestInherent {


public static void main(String[] args) {


        derive test = new derive();


 


test.display();  //Display 1


System.out.println(test.i); //Display 1


test.displayStatic(); //Display This is in derive class .


       


((base)test).display(); //Display 1


System.out.println(((base)test).i) //Display 0;


((base)test).displayStatic(); //Display This is in base class.


}


}


 


class base {


int i=0;



void display() {


System.out.println(i);


}



static void displayStatic() {


System.out.println(“This is in base class.”);


}


}


 


class derive extends base {


int i=1;



void display() {


System.out.println(i);


}



static void displayStatic() {


System.out.println(“This is in derive class.”);


}


}


 


以上代码说明方法的override的含义是派生类的对象中不含有基类的被override的方法,所以在派生类外部无法调用到基类的被override的方法。而shadow的含义是派生类的对象也含有基类的被shadow的成员变量,所以在派生类外部可以通过该派生类的对象调用到基类的被shadow的成员变量。


4.  另外,static方法的表现形式与shadow的成员变量相同。当然,推荐的调用static方法的形式是类名.static方法名。

5. 本文所说的能否调用建立在有访问权限的基础上。