java 几个权限关键字
2014-04-24 22:46
106 查看
注: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()改为protected static void 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的包访问极限已失去作用)
看到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()改为protected static void 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是抽象类,是一种简洁的,纯的抽象类,最大的用途就是实现多继承
作用域 | 当前类 | 同一package | 子孙类 | 其他package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
以下就是实现多继承的简单例子 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 几个权限关键字
- Java 访问权限控制:你真的了解 protected 关键字吗?
- 几个java关键字
- 黑马程序员---java中几个常用的关键字
- 关于java异常处理的几个关键字 try catch/throw/throws
- Java-面向对象编程-几个关键字
- 详谈Java多线程的几个常用关键字
- java访问权限关键字
- java 权限关键字
- Java权限关键字阐述
- 几个比较难理解的JAVA关键字总结
- Java中private , public , protected 几个关键字
- java 几个关键字,final,static
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- Java 访问权限控制:你真的了解 protected 关键字吗?
- java中的几个关键字
- java中不常用但是很重要的几个关键字解析
- java中几个关键字 this static final
- java学习之路 之 高级类特性-四种权限修饰符、关键字super、子类对象的实例化过程
- 关于java的几个常用关键字及抽象类和接口