本文由广州疯狂软件java培训分享:
注:protected 既包括protected 域,又包括protected 方法,以下统称为protected!
看到protected,我们想到的可能是:protected 既提供包访问权限,同时对继承自该类的所有子类(或子类的下级子类)提供访问权限 !这句话是没有错的,不管子类与父类是否位于同一包中,子类的对象都可以访问protected成员,因为这些成员已经带到子类中来了!
本文之所以要对protected单独作出讨论,是因为protected并不是上面所提到的那么简单,还有许多情况是我们没碰到过的,这其中包含着陷阱,一不小心,就会触发异常!
我们可以把对protected成员的访问分成两种情况,一种是创建子类对象,并且用该子类对象来访问protected成员,这个在本文第一段已提到 !
这里,我们来讨论另一种特殊的情况:当子类与父类位于不同包中,在子类中创建父类对象,并用此父类对象来访问protected成员时,就会抛出一个异常!正如以下程序中看到的:
package A;//父类所在的包
public class Father {
protected int i = 5;//父类中的protected 域
protected void test() {//父类中的protected方法
System.out.println(this.i);
}
}
package B;//子类与父类位于不同的包中
import A.Father;//导入父类
public class Son extends Father {
public static void main(String[] args) {
Father f = new Father();//创建父类对象
System.out.println(f.i);//此处会抛出错误
f.test();//此处也会抛出同样的错误
}
}
我们看到上面的程序会抛出两个错误,原因就在于:当子类与父类位于不同包中时,父类中的protected成员,对于父类本身是不可访问的,只有子类对象才可以访问!上面的程序我们可以把会出错的那两句改成:
Son t = new Son();
System.out.println(t.i);
t.test();
这样就不会出错!
在上面的例子上,再做一点修改,把Father 中的test()改为protectedstaticvoid test()
然后在Son类中创建Father f = new Father();
此时,f 仍然不能访问f.i,但是f却可以访问test(),即用f.test()时,不会出错,原因是:
因为test() 是static Method, static method 调用 不需要通过对象的实例,跟写成 Son.test() 是一样的效果 !
总结
当父类与子类位于同一包中时,不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问极限!
当父类与子类位于不同包中时,protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问!不过,可以访问static 成员(因为protected的包访问极限已失去作用)
public,private,protected 是“访问权限”基本修饰符,可修饰变量,方法,类,具有不同范围的限制
简单理解:
public 无限制
private 同一个类中可访问
protected “其它包中非子类”不可访问 (也就是说其他包中必须是子类才可访问,要存在继承关系,protected关键字就是为了继承而创造的)
interface是接口,接口的概念和使用很广泛,是需要理解的基本的理解就是
interface是抽象类,是一种简洁的,纯的抽象类,最大的用途就是实现多继承
以下就是实现多继承的简单例子
interface kou1
{
public void say1();
}
interface kou2
{
public void say2();
}
interface kou3 extends kou1,kou2 //●用的是extends
{
public void say1();
public void say2();
public void say3();
}
class Kid implements kou3
{
public void say1()
{
System.out.println("心情不咋滴");
}
public void say2()
{
System.out.println("不是很开心");
}
public void say3()
{
System.out.println("笑有点勉强");
}
}
public class Maintest
{
public static void main(String[] args)
{
Kid kd=new kid();
kd.say1();
kd.say2();
kd.say3();
}
}
疯狂软件Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。高薪从IT名企请来项目经理为学员亲自授课,对学员进行实战教学,在疯狂软件教育,通过大量全真经典企业级项目进行集中培训,学员通过数月培训都可获得1-2年的工作经验,进而在同类的求职者中脱颖而出。疯狂软件Java培训让你体会java编程的快乐,项目开发的兴奋,成就感,通过短短几个月的时间,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,迅速成为技能型的现代化高端人才,迅速获得高薪就业!
疯狂软件Java培训、iOS培训打造名企技术经理,成为中国软件产业的中流砥柱:全真企业需求,项目小组管理,大量实操项目的疯狂训练,企业全真案例教学,学成至少相当于两年工作经验“全真项目”教学,高强度的狂热训练,带领学生走近编程,感受编程,热爱编程,学完后产生凤凰涅槃般的重生。 “全真企业环境”模拟:以项目组形式管理,每个程序员(学员)对项目组长负责,组长向项目经理(老师)负责。以版本控制工具为引导,充分激发每个程序员对编程的激情 四个半月掌握近8~10万代码量,达到技术经理的代码掌握量。