前言
Java是一门面向对象编程语言,因此它实现了各种面向对象编程的概念,其中之一是对访问权限进行控制。在Java中,这种控制是通过“访问修饰符”实现的。包则是Java中一个重要的概念,既可以用来组织Java类或接口,也可以配合访问控制实现对某些类或接口的限制访问。本篇文章将介绍Java中的包和访问控制。
一、包是什么?
Java包是一种将类和接口组织在一起的机制。它们主要用于保持有关类和接口的信息和访问控制。可以将类和接口分组为功能相似或相关的包。这有助于避免命名冲突,因为每个包中的所有类和接口都具有唯一的完全限定名。
Java包的命名约定是小写字母的有意义的单词序列,用句点分隔(例如com.example.myapp)。此命名约定使包名称易于读取和理解。
每个Java包都与磁盘上的一个目录相对应。包名中的每个句点(.)都转换为目录分隔符(/或\)。包目录中包含编译后的类文件。在编译Java类时,可以指定其包,为它们创建相应的目录层次结构。
包的作用:
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
命名规则:
个人
indi:多人完成,版权属于发起者
包名为:indi.发起者名.项目名.模块名
pers :独自完成,公开,版权属于个人
包名为:pers.个人名.项目名.模块名
priv : 独自完成,非公开,版权属于个人
包名为:priv.个人名.项目名.模块名
团队
team:团队项目指由团队发起,并由该团队开发的项目,版权属于该团队所有
包名为:team.团队名.项目名.模块名
公司
com:由公司发起,版权由项目发起的公司所有
包名为:com.公司名.项目名.模块名
二、访问控制是什么?
Java提供了访问修饰符(private、protected、public和默认访问修饰符)来控制方法、变量以及类的访问权限。如果没有指定修饰符,则默认为“默认访问修饰符”。每个访问修饰符都有不同的访问级别,包括:
default (即默认,什么也不写): 也被称为“缺省访问修饰符”,在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。
注意:不能修饰类(外部类)。
使用访问控制修饰符可以控制类的方法和变量的可访问性。这可以增强代码的封装性和安全性。包管理则用于管理Java中的包。
public:
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
public static void main(String[] args) {
// 方法体
}
protected:
protected 需要从以下两个点来分析说明:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。
子类能访问 protected 修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。
下面的父类使用了 protected 访问修饰符,子类重写了父类的 say() 方法。
class Human {
protected boolean say(String msg) {
// 方法体,具体逻辑
}
}
class Man extends Human {
protected boolean say(String msg) {
// 方法体,具体逻辑
}
}
如果把 say() 方法声明为 private,那么除了 Human 外,其他类将不能访问该方法。
如果把 say() 声明为 public,那么所有的类都能够访问该方法。
如果我们只想让该方法对其所在类的子类可见,则将该方法声明为 protected。
default:
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public、static、final,而接口里的方法默认情况下访问权限为 public。
如下例所示,变量和方法的声明可以不使用任何修饰符。
int defaultNum;
// 默认方法
void myDefaultMethod() {
System.out.println("This is a default method.");
}
private:
私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
public class MyClass {
private int privateNum; // 私有属性,只能在本类中访问
private void privateMethod() { // 私有方法,只能在本类中调用
// 方法定义...
}
public String getPrivateNum() {
return this.privateNum;
}
public void setPrivateNum(String privateNum) {
this.privateNum = privateNum;
}
}
实例中,MyClass 类中的 privateNum 变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个 public 方法:getPrivateNum() (返回 privateNum的值)和 setPrivateNum(String)(设置 privateNum 的值)
访问控制和继承
请注意以下方法继承的规则:
父类中声明为 public 的方法在子类中也必须为 public。
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
父类中声明为 private 的方法,不能够被子类继承。
总结
Java中的包和访问控制是Java面向对象编程的重要概念。包可以用于组织相关的类和接口,从而提高代码的管理和开发便捷性。访问控制用于管理可见性和访问权限,从而增强代码的安全性和封装性。访问控制修饰符包括private、protected、public和默认访问修饰符。 Java软件包管理可以帮助我们轻松地管理、发布和维护软件包。
private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。