07-包和访问权限

包(package)

包(package)是类的容器,用来保存和划分类名空间。

——Java编译器为每个类生产一个字节码文件,且文件名和类名一致,因此同名类可能发生冲突。为解决这个问题,Java提供包(package)来管理类名空间。

Java每个类文件的首行必须是package关键字 + 包名

包的声明格式: package goktech; 或者 package cn.goktech;

Java用文件系统目录存储包。包名中的“.”表示目录分层。

在文件系统中,目录名和包名是严格匹配,包层次通过“.”在文件系统中也严格反映出来。

//指定包中的文件存储的路径是:cn\goktech\day07
package cn.goktech.day07;//这是一个多级包
public class Demo01 {

}

包名的约定:

  1. 包名全部小写
  2. 在Java中,包名也是标识符,必须遵守标识符命名原则(字母、数字、_ 、$)
  3. 建议比较好的包层次一般用公司域名来创建。www.goktech.cn
package cn.goktech.www //域名倒着写

含包名的类运行

dos界面

  • Javac 包/java文件
  • Java 包**.**类名

调用类

调用其他包下的类:

  1. 全类名调用,即 包名**.**类名
  2. 导入包 :
    • 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) {
	}

}

面向对象三大特征--封装

什么是封装

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过通过指定的方式。适当的封装可以让程式码更容易理解与维护,也加强了代码的安全性。

封装的原则

在封装概念之前,外部类要操作对象的属性是通过赋值操作和‘.’。引入封装的概念后,则是摒弃这种方式。

封装的原则:将类的数据隐藏起来(即隐藏类实例化后的对象的属性和实现细节)。

若需要访问某个属性,则提供公共方法对其访问。

具体步骤

  1. 使用private关键字来修饰成员变量,限制属性的可见性;
  2. 为每个属性创建一对取值getXxx()和赋值setXxx()的方法,用于对这些属性的存取;
  3. 在赋值方法中,加入对属性的存取控制语句
/**
 * 封装:被认为是一种屏障,隔绝外部类可以随意的访问和操作本类的代码和数据.
 * 封装的原则:隐藏对象的属性和实现的细节,外部类若要操作对象的数据,只能通过对象提供的公共方法来实现.
 * 封装的步骤: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()
}

做项目,项目很大需要模块分工,所以就会有一个命名问题,可能会命名同名的类。所以为了更好的管理和分工。