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

java的权限修饰符

2015-12-31 16:42 411 查看


java类的访问权限


1.解析

Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。

private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

下面用表格的形式来展示四种访问权限之间的异同点,这样会更加形象。表格如下所示:
同一个类
同一个包
不同包的子类
不同包的非子类
Private

Default


Protected



Public





2.Protected

假设在包accesscontrol下面有AccessControlDemo和 Base 两个类,其中protected double price;是Base类的成员变量,因为两个类在同一个包中,所以在AccessControlDemo类中可以直接访问System.out.println(base.price);具体实例如下:

accesscontrol.AccessControlDemo



package accesscontrol;

public class AccessControlDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
Base base=new Base("123-1",120.1);
System.out.println(base.price);

}
}


accesscontrol.Base



package accesscontrol;

public class Base {

private String isbn;
protected double price;

//默认构造函数
public Base() {

}

//构造函数,如果只定义带参数的构造函数而不定义默认构造函数,那么Base的子类必须定义显式构造函数
//Implicit super constructor Base() is undefined for default constructor. Must define an explicit

public Base(String isbn, double price) {
this.isbn = isbn;
this.price = price;
}

public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}

}


但是假如我们将AccessControlDemo这个类移到test这个包中,我们会发现eclipse中提示错误,编译无法通过,因为在test包中对protected类型的成员变量不可见。
假如我们在test包中创建一个Base类的子类Bulk,也就是说Bulk是Base类不同包的子类。那么在Bulk类中能够直接访问protected double price;这个基层自Base类的成员变量,实例如下:

test.AccessControlDemo



package test;

public class AccessControlDemo {
public static void main(String[] args) {
Bulk bulk=new Bulk("123-1",120.1);
bulk.print();
}
}


test.Bulk



package test;

import accesscontrol.Base;

public class Bulk extends Base {

public Bulk() {
super();
}

public Bulk(String isbn, double price) {
super(isbn, price);
}

public void print()
{
System.out.println(this.price);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: