您的位置:首页 > 编程语言 > Java开发

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的包访问极限已失去作用)

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: