`
i学霸
  • 浏览: 12740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

I学霸官方免费教程十一:Java基础之访问权限

 
阅读更多

访问权限

包(package)

是Java提供的一种区别类的名字空间的机制,是类的组织方式,它提供了访问权限和命名的管理机制;对应到硬盘上就是文件夹。
Java中提供的包主要有以下3种用途:
1) 方便类的管理;将功能相近的类放在同一个包中,可以方便查找与使用。
2) 避免类的命名冲突;同一包下的类不可同名,不同包中的类可以同名。
3) 控制类中成员的访问权限。

声明包:package 包名;

实例:
//声明包
package p1.p2.pn;
public class PackageDemo {}
注意:包的声明语句,必须写在.java文件的第一行;
上例中,如果使用的是记事本创建的PackageDemo.java文件,这个文件可以在任何位置被编译。
编译使用javac –d . Package.java
–d . 表示编译后在当前目录下自动根据声明的包创建目录
编译后会在当前目录下生成p1/p2/pn/Package.class这样的文件目录(当然也可以用javac Package.java编译后,手动创建p1/p2/pn这样的文件夹目录,将编译后的Package.class文件放到pn文件夹下)。
运行使用java p1.p2.pn.Package程序
一旦类文件中声明了包,那么编译后的文件必须放在声明的包下才能被运行,切使用命令运行时必须使用类的全名(即:包名.类名)

导入包:

方式一、import 包名.类名; (导入指定包下的指定类)
方式二、import 包名.*; (导入指定包下的所有类,不包含指定包的子包下的类)

注意:包的导入语句要写在类声明语句之前,包声明语句之后。
使用同一包下的类或java.lang包下的类时,可以省略包的导入;因为系统默认会在当前包和java.lang包下查找用到的类;

例如:类A在包a下,类B在包b下;如果在类A中使用了类B,那么就必须在类A中导入类B(import b.B;或import b.*);这样类A用到类B的时候才知道去哪里找这个类B;
//声明包
package  a;
//导入(引入)包
import  b.B;
//声明类
public  class  A{
	B  b = new  B();
}

//声明包
package  b;
//声明类
public  class  B{ }

访问修饰符

访问修饰符是用于控制被修饰者的使用权限的关键字,被修饰者可以是类、属性、方法等
java中提供了4种访问权限,3个关键字;被修饰者的使用权限如下表
关键字 同一类中 同一包下不同类中 不同包下存在继承关系的类中 任何位置
private(私有的) 可以 不可以 不可以 不可以
无(默认) 可以 可以 不可以 不可以
protected(保护的) 可以 可以 可以 不可以
public(公共的) 可以 可以 可以 可以

实例:
//声明包
package access_modifier.family;
/**
 * 用于演示访问修饰符
 * 声明Me时使用了public,这样在其他包下才可以访问
 * 在类文件中直接声明的类只有两种情况,一种默认不写,一种使用public
 * 不能使用private和protected
 * @author 学霸联盟 - 赵灿
 */
public class Me {
	/*
	 * phone使用private修饰,表示只能在当前类(Me)中使用
	 * computer未写访问修饰符, 默认表示当前类和同一包下的其他类中都可以使用
	 * money使用protected修饰,表示其他包下有继承关系的都可以使用
	 * book使用public修饰,表示任何地方都可以使用
	 */
	private String phone = "手机";
	String computer = "电脑";
	protected String money = "钱";
	public String book = "图书";
}

//声明包
package access_modifier.family;
/**
 * 用于演示默认访问修饰符的访问权限
 * @author 学霸联盟 - 赵灿
 */
public class Wife {
	public static void main(String[] agrs){
		//创建Me类的对象
		Me lover = new Me();
		/*
		 * Brothers和Me在同一包下
		 * 可以省略导入语句(import access_modifier.family.Me)
		 * 可以使用除private修饰以外的成员
		 */
		System.out.println("Me类中的computer属性值:" + lover.computer);
		System.out.println("Me类中的money属性值:" + lover.money);
		System.out.println("Me类中的book属性值:" + lover.book);
	}
}

//声明包
package access_modifier.friends;
//导入包:不同包下的类相互之间调用必须导入包
import access_modifier.family.Me;

/**
 * 用于演示public的访问权限
 * @author 学霸联盟 - 赵灿
 */
public class Friend {
	public static void main(String[] agrs){
		//创建Me类的对象
		Me friend = new Me();
		/*
		 * Friend和Me在同一包下,并且没有继承关系
		 * 所以该类中只能使用Me类中public修饰的成员
		 * 而且类Me声明时必须使用public,如果没有使用这里将无法使用类Me
		 */
		System.out.println("Me类中的book属性值:" + friend.book);
	}
}

//声明包
package access_modifier.son_family;
//导入包
import access_modifier.family.Me;

/**
 * 用于演示protected的访问权限
 * 需要先学习完继承
 * @author 学霸联盟 - 赵灿
 */
public class Son extends Me{
	//可以使用关键字super访问父类中的protected修饰的成员
	String fatherMoney = super.money;
	public static void main(String[] args) {
		//创建父类的对象
		Me father = new Me();
		//用父类对象只能访问public修饰的成员
		System.out.println("Me类中的book属性值:" + father.book);
		//创建本类对象
		Son son = new Son();
		//也可以通过本类对象使用父类中protected修饰的成员
		System.out.println("间接使用Me类中的money属性:" + son.money);
	}
}

public class 和 class的区别

1、创建个数:一个源文件(.java文件)中,可以声明多个类,但只能有一个使用public class声明的类,并且类名必须和文件名相同
2、使用范围:其他包下的类中可以使用public class声明的类;但不能使用class声明的类
另外:当一个源文件中声明多个类时,编译之后会产生多个对应类名的字节码文件

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics