访问权限
包(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声明的类
另外:当一个源文件中声明多个类时,编译之后会产生多个对应类名的字节码文件