Java 几个权限关键字

  本文由广州疯狂软件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万代码量,达到技术经理的代码掌握量。

原文地址:https://www.cnblogs.com/gojava/p/3688343.html