Java基础:访问限制修饰符

来源:互联网 发布:个人理财软件 编辑:程序博客网 时间:2024/05/21 23:57

Java基础:访问限制修饰符

访问限制修饰符有private,public,protected,他们都是Java的关键字,用来修饰成员变量和方法。

注意,在编写类的时候,类中的实例方法总是可以操作该类中的实例变量和类变量。类方法总是可以操作该类中的类变量,与访问限制符没有关系。

公有变量和公有方法

使用public修饰。权限最高,可以在不同包中不同类中被访问。

受保护的变量和受保护的方法

使用protected修饰。可以被继承。除了子类以外,在别的包的类中无法引用protected修饰的变量和方法。

友好变量和友好方法

不用public、protected、private修饰符等修饰的成员变量和方法。权限从上至下排在第三。只能在该包中使用,包括不能被别的包的子类继承。

私有变量和私有方法

用关键字private修饰。只能被当前类使用,不能被其他类拿出来使用。是定义某个权限最低的变量和方法的关键字。也无法被继承。

两种类

分别为public修饰的和友好类(即不加任何修饰符),除此之外,使用protected和private修饰的都是错误的,不存在的。

友好类的访问权限限制于当前包。

protected和默认修饰符的区别

到目前为止,两者似乎没有什么区别。但是两者的确是有区别的,在子类继承的时候。分为两种情况:

当子类和父类在同一个包下:

子类可以继承父类中不是private的变量和方法。

当子类和父类在不同包下:

子类只能继承protected和public的成员变量。

protected的进一步说明:

假设s包下有两个类,分别是temp5和test_temp5。t包下有一个类是temp2。现在temp5继承了temp2。我们来看在temp5和test_temp5中关于父类的操作权限。

temp2.java

package t;public class temp2{    private int a;    private int getA(){        return a;    }    protected int b;    protected int getB(){        return b;    }    int c;    int getC(){        return c;    }    public int d = 0;    int getD(){        return d;    }}

temp5.java

package s;import t.temp2;public class temp5 extends temp2{    //在构造方法中查看可以使用的哪些继承来的变量    public temp5(){        this.a = 1;  //a是private的,显然报错        this.b = 1;  //b是protected的        this.c = 1;  //c是默认的,也会报错        this.d = 1;  //d是public的    }}

test_temp5.java

package s;public class test_temp5 {    public test_temp5(){        temp5 tem5 = new temp5();        tem5.a = 1;     //报错,tem5对象的该变量继承自另外一个包,因此无法访问。        tem5.b = 1;     //报错        tem5.c = 1;     //报错        tem5.d = 1;    } }

分析上述代码:

  • 对于子类temp5从temp2继承的protected成员变量和方法,需要追溯到protected成员变量和方法所在的“祖先类”,只要test_temp5类和temp5的祖先类在一个包中,那么用temp5创建的对象就可以被test_temp5访问它继承的protected变量和方法。
  • 在不同包中,子类永远可以访问继承的protected和public变量和方法。

一个示例

(默认包)

Main.java

import s.temp5;import t.temp2;import t.temp3;public class Main{    public static void main(){        Abc abc = new Abc();        Abcd abcd = new Abcd();        temp tem = new temp();     //同一个包下继承了Abc的类        temp2 tem2 = new temp2();   //在不同包下,无法继承Main类的Abc类,因为Abc是友好类,无法被别的包下的类继承。        temp3 tem3 = new temp3(); //与temp2在同一个包下,继承了temp2        abc.a = 1;    //使用abc对象的a变量,为private,报错         abc.b = 1;   //使用abc对象的b变量,为protected        abc.c = 3;   //default        abcd.b = 2; //protected             abcd.c = 3; //default        tem.b = 1; //protected        tem.c = 2; //default        tem2.b = 1;  //protected,报错,无法访问其protected变量        tem2.c = 1;  //报错,无法访问其友好变量        tem2.d = 1; //public的可以访问        tem3.d = 1; //temp3继承了temp2,同上    }}class Abc{    private int a;    private int getA(){        return a;    }    protected int b;    protected int getB(){        return b;    }    int c;    int getC(){        return c;    }}class Abcd extends Abc{}

temp.java

public class temp extends Abc{}

t包

temp2.java

package t;public class temp2{    private int a;    private int getA(){        return a;    }    protected int b;    protected int getB(){        return b;    }    int c;    int getC(){        return c;    }    public int d = 0;    int getD(){        return d;    }}

temp3.java

package t;public class temp3 extends temp2{}
0 0
原创粉丝点击