|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。1.protected会见把持符能被用于办法和成员变量。
2.声明为protected的办法和成员变量能被统一个包里的一切类所会见,就像默许润色符package一样。
3.能被该类的子类所会见,子类能够和父类不在一个包中。
如许,当你想让一个类中的某个办法或成员变量在包中都可见,并且其子类也能会见(子类有大概和父类不在统一个包中)但又不想让一切类都能够会见该类时,就能够用protected润色符。
可会见性:
public>protected>package>private
注重:
4.Butasubclassinanotherpackagecanaccesstheprotectedmembersinthesuper-classviaonlythereferencesofsubclassoritssubclasses.Asubclassinthesamepackagedoesn’thavethisrestriction.Thisensuresthatclassesfromotherpackagesareaccessingonlythemembersthatarepartoftheirinheritancehierarchy.
上面的例子能够申明上述几点:(出格注重第4点)
我们将创立一个父类Bird.java,放在birdpack包中,父类中有一个protectedint的成员变量nFeathers;
再分离创立4个Bird类的子类Duck1.java,Duck2.java,Duck3.java,Swan.java,放在duckpack包中,经由过程在每一个子类中挪用nFeathers的分歧办法申明上述几点
<P>
上面的程序其实不用于运转,由于会见把持在编译时代就要断定,我们只需编译下述文件,看是不是能经由过程。在编译下述文件前,先想一想能不克不及编译经由过程?
//Bird.java------------------------------
packagebirdpack;
publicclassBird{
protectedintnFeathers;
}
//Duck1.java-----------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck1extendsBird{
publicvoidsetn(intduck1n){
//在子类中间接会见父类中的protected变量
nFeathers=duck1n;
}
}
//Duck2.java------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck2extendsBird{
publicvoidconstruct(intnewduck2){
Duck2d2=newDuck2();
//在子类中经由过程子类的对象会见父类中的protected变量
d2.nFeathers=newduck2;
}
}
//Duck3.java------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck3extendsBird{
publicvoidconstruct(intnewduck3){
Birdb=newBird();
//子类顶用父类对象反而不克不及会见父类中的protected变量
b.nFeathers=newduck3;
}
}
//Swan.java--------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassSwanextendsBird{
publicvoidconstruct(intswan){
Duck1d1=newDuck1();
//子类顶用别的一个子类的对象也不克不及会见父类中的protected变量
d1.nFeathers=swan;
}
}
编译上述几个文件,后2个不克不及经由过程。编译器提醒:
"nFeathershasprotectedaccessinbirdpack.Bird"。
//Bird.java------------------------------
packagebirdpack;
publicclassBird{
protectedintnFeathers;
}
//Duck1.java-----------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck1extendsBird{
publicvoidsetn(intduck1n){
//在子类中间接会见父类中的protected变量
nFeathers=duck1n;
}
}
//Duck2.java------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck2extendsBird{
publicvoidconstruct(intnewduck2){
Duck2d2=newDuck2();
//在子类中经由过程子类的对象会见父类中的protected变量
d2.nFeathers=newduck2;
}
}
//Duck3.java------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassDuck3extendsBird{
publicvoidconstruct(intnewduck3){
Birdb=newBird();
//子类顶用父类对象反而不克不及会见父类中的protected变量
b.nFeathers=newduck3;
}
}
//Swan.java--------------------------------
packageduckpack;
importbirdpack.Bird;
publicclassSwanextendsBird{
publicvoidconstruct(intswan){
Duck1d1=newDuck1();
//子类顶用别的一个子类的对象也不克不及会见父类中的protected变量
d1.nFeathers=swan;
}
}
编译上述几个文件,后2个不克不及经由过程。编译器提醒:
"nFeathershasprotectedaccessinbirdpack.Bird"。
第4点申明,就算在子类中,也只能经由过程子类(或子类的子类)的援用来会见父类中的protected办法和成员变量。
在Duck3和Swan两个子类中,间接经由过程父类和另外一个子类来会见父类中的protected办法和成员变量就不可。
附:编译技能
当编译含有包声明的源文件时,利用-d选项会带来良多便利,它能包管编译后的class文件寄存在准确的目次路径下。
我们能够把上述5个文件都放在protectedtest目次下,然后用-d选项往编译:
javac-d.Bird.java
javac-d.Duck1.java
.....
个中.暗示以以后目次创立包布局的目次条理。编译乐成后,会在protectedtest下天生2个目次:birdpack和duckpack,内里是天生的class文件。
前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。 |
|