
07-包和访问权限
07-包和访问权限
包(package)
包(package)是类的容器,用来保存和划分类名空间。
——Java编译器为每个类生产一个字节码文件,且文件名和类名一致,因此同名类可能发生冲突。为解决这个问题,Java提供包(package)来管理类名空间。
Java每个类文件的首行必须是package关键字 + 包名。
包的声明格式: package goktech; 或者 package cn.goktech;
Java用文件系统目录存储包。包名中的“.”表示目录分层。
在文件系统中,目录名和包名是严格匹配,包层次通过“.”在文件系统中也严格反映出来。
//指定包中的文件存储的路径是:cn\goktech\day07
package cn.goktech.day07;//这是一个多级包
public class Demo01 {
}
包名的约定:
- 包名全部小写
- 在Java中,包名也是标识符,必须遵守标识符命名原则(字母、数字、_ 、$)
- 建议比较好的包层次一般用公司域名来创建。www.goktech.cn
package cn.goktech.www //域名倒着写
含包名的类运行
dos界面
- Javac 包/java文件
- Java 包**.**类名
调用类
调用其他包下的类:
- 全类名调用,即 包名**.**类名
- 导入包 :
- import关键字 +包名**.**类名;
- import关键字 +包名**.***; (不推荐)
- 经常使用的类用import,不推荐调用类时使用全类名。
无名包的类
- 无名包和有名包下的类 是否可以相互调用?
- 有包的类 无法访问 默认包(无名包)的类。
- 无名包的类 可以访问 有包名的类
访问控制
当一个类可以被访问时,对类内的成员变量和成员方法,通过访问控制符来控制、限定其被访问的应用范围。
访问控制符 | 同类 | 同包不同类 | 不同包 | 访问时 |
---|---|---|---|---|
public 共有的 | ✔ | ✔ | ✔ | 绿色小圆点 |
protected | ✔ | ✔ | ✔只能是该类的子类 | 黄色小棱形 |
缺省(默认不写) | ✔ | ✔ | ❌ | 蓝色三角形 |
private 私有的 | ✔ | ❌ | ❌ | 红色正方形 |
public:同项目下的任何类。对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。
protected:同包的类都可以使用。有继承关系后,不同包的类要使用,必须是该类的子类。
缺省:同包中的类,才可以直接使用它的数据和方法。
private:只有本类中才能访问。不允许其他类访问,属于该类的私有。
public class TestAccessControl {
public TestAccessControl(int age) {
System.out.println("这是一个有参构造器");
System.out.println(age);
}
protected TestAccessControl(int age,String name) {
}
TestAccessControl(String name,int age) {
}
private TestAccessControl(String name) {
}
}
面向对象三大特征--封装
什么是封装
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过通过指定的方式。适当的封装可以让程式码更容易理解与维护,也加强了代码的安全性。
封装的原则
在封装概念之前,外部类要操作对象的属性是通过赋值操作和‘.’。引入封装的概念后,则是摒弃这种方式。
封装的原则:将类的数据隐藏起来(即隐藏类实例化后的对象的属性和实现细节)。
若需要访问某个属性,则提供公共方法对其访问。
具体步骤
- 使用private关键字来修饰成员变量,限制属性的可见性;
- 为每个属性创建一对取值getXxx()和赋值setXxx()的方法,用于对这些属性的存取;
- 在赋值方法中,加入对属性的存取控制语句
/**
* 封装:被认为是一种屏障,隔绝外部类可以随意的访问和操作本类的代码和数据.
* 封装的原则:隐藏对象的属性和实现的细节,外部类若要操作对象的数据,只能通过对象提供的公共方法来实现.
* 封装的步骤:1.关键字private修饰成员变量.
* 2.提供一对公共的方法用于 存/取 成员变量:getXxx() 和 setXxx();
* @author wyn
*
*/
public class TestPrivate {
public static void main(String[] args) {
Demo_Private tp = new Demo_Private();
//引入封装前,通过赋值方式对`对象的属性`进行写入;通过"."的方式 读取对象的属性
tp.age=10;
System.out.println(tp.age);
//引入封装后
//System.out.println(tp.age1);//The field Demo_Private.age1 is not visible
tp.setAge1(30);
System.out.println("age1="+tp.getAge1());
}
}
class Demo_Private{
//封装成员变量
int age; //引入封装前
private int age1; //引入封装后:1.权限修饰符private->修饰成员变量,private除了本类谁也无法操作.
private String name;
private static String city;
//2.提供一对公共的方法用于 存/取 成员变量:getXxx() 和 setXxx();
//快捷键alt+shift+s
public int getAge1() {
return age1;
}
//在赋值方法中,加入对属性的存取控制语句
public void setAge1(int age1) {
if(age1<0 || age1>120) {
System.out.println("输入的年龄有误,请重写输入...");
}else
this.age1 = age1;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getCity() {
return city;
}
public static void setCity(String city) {
Demo_Private.city = city;
}
}
封装的优点
- 隐藏类的实现细节;
- 让使用者只能通过程序员规定的方法来访问数据
- 类内部的结构可以自由修改,方便的加入存取控制语句,限制不合理操作。
标准JAVA组件—JavaBean
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//成员方法
//getXxx()
//setXxx()
}
做项目,项目很大需要模块分工,所以就会有一个命名问题,可能会命名同名的类。所以为了更好的管理和分工。