智渔课堂官方免费教程十一:Java基础之访问权限

时间:2022-04-30 15:27:37

访问权限

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