目录
前言
在编写 Java 程序时,随着程序架构越来越大,类的个数也越来越多,这时就会发现管理程序中维护类名称也是一件很麻烦的事,尤其是一些同名问题的发生。开发人员还可能需要将处理同一方面的问题的类放在同一个目录下,以便于管理。
一、Java包概述
1.包的简介
计算机中存放了若干类型的文档,为了管理方便,操作系统采用了树形结构的文件夹形式存放这些文档,并对文档进行管理。为了更好地组织类,Java 提供了包机制。
包是类的容器,用于分隔类名空间。如果没有指定包名,所有的类都属于一个默认的无名包。Java 中将实现相关功能的类组织到一个包中。例如,Java 中通用的工具类,一般都放在 java.util 包中。
总的来说,包有以下三个方面的作用:
- 提供了类似于操作系统树形文件夹的组织形式,能分门别类地存储、管理类,易于查找并使用类。
- 解决了同名类的命名冲突问题。
- 包允许在更广的范围内保护类、属性和方法。
2.包的语法
程序员可以使用 package 关键字指明源文件中的类属于哪个具体的包,包的语法形式如下。
package pkg1[.pkg2[.pkg3…]];
程序中如果有 package 语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。
一个文件中最多只能有一条 package 语句,即只能把一个类放在一个包中。
包的名字应该有层次关系,各层之间以.分隔。
3.包的命名规则
通常包名全部用小写字母,这与类名以大写字母开头且各单词的首字母亦大写的命名约定有所不同。关于包的命名,现在使用最多的规则是使用翻转的 internet 域名(不含 www、ftp 等访问协议)。
例如 abc 公司的域名为 abc.com,该公司开发部门正开发一个名为 fly 的项目,在这个项目中有一个工具类的包,则这个工具包的包名可以为:com.abc.fly.tools。
4.JDK类库里的包
java.lang:lang 是 language 的简写,这个包提供 Java 语言的基础类,例如 String、Math、Integer、System 和 Thread 等。
java.util:util 是 utility 的简写,组织了 Java 的工具类,包含集合、事件模型、日期和时间设置、国际化和各种实用工具类。
java.io:io 是 input 和 output 的合并简写,指输入和输出,组织了数据流、序列化和文件系统相关的类。
java.net:net即网络,这个包组织了为实现网络应用程序而提供的类。
java.awt:抽象窗口工具集(Abstract Window Toolkit),包含用于创建用户界面和绘制图形图像的类。
5.怎么导包
import java.util.ArrayList; //导入java.util包中的ArrayList类
import java.util.Random; //导入java.util包中的Random类
java 还提供了一种批量导入的方式:如果要导入的多个类存在于同一个包中,那么可以使用通配符 * 代表包中的所有类。例如可以使用 import java.util.* 代表导入了 java.util 包中的所有类,如下图所示。
二、访问控制
1.访问权限修饰符
Java 语言中的访问权限修饰符有 4 种,但却只有 3 个关键字。因为不写访问权限修饰符时,在 Java 中被称为默认权限(包权限),这里以 default 代替。其他 3 个访问权限修饰符分别为 private、protected 和 public。
私有权限 private
private 可以修饰属性、构造方法、普通方法。被 private 修饰的类成员只能在定义它们的类中使用,在其他类中都不能访问。
默认权限 default
不写任何权限关键字就代表使用默认权限,属性、构造方法、普通方法都能使用默认权限。默认权限也称为同包权限。同包权限的元素只能在定义它们的类中以及同包的类中被调用。
受保护权限 protected
protected 可修饰属性、构造方法、普通方法,能在定义它们的类中以及同包的类中调用被 protected 修饰的成员。如果有不同包中的类想调用它们,那么这个类必须是这些成员所属类的子类。关于子类及相关概念,将会在后续讲解继承的时候详细介绍。
公共权限 public
public 可以修饰属性、构造方法和普通方法。被 public 修饰的成员,可以在任何一个类中被调用,是权限最大的访问权限修饰符。
2.Static关键字作用
静态方法只能访问静态成员,不可以直接访问实例成员。
不可直接访问并不等于说不能访问,那么我们应该怎么访问呢,可以创建对象去调用它
public class Test { //实例成员 private String name; private static int age; //实例方法 public void eat(){ System.out.println(name + "要吃东西"); } //静态方法 public static void drink(){ System.out.println("喝东西"); } //静态方法 public static void test(){ Test test = new Test(); System.out.println(test.name); //创建对象访问实例成员 System.out.println(age); //可以直接访问静态成员 test.eat(); //创建对象访问实例方法 drink(); //可以直接访问静态方法 }
实例方法可以访问静态的成员,也可以访问实例成员。
//实例成员 private String name; private static int age; //实例方法 public void eat(){ System.out.println(name + "要吃东西"); } //静态方法 public static void drink(){ System.out.println("喝东西"); } //实列方法 public void go(){ System.out.println(name); //可以访问实例成员 System.out.println(age); //可以访问静态成员 eat(); //可以访问实例方法 drink(); //可以访问静态方法 } }
(简单来说实例方法就是西厂雨化田,静态能访的我要访,静态不能访的我更要访)
静态方法不可以出现this关键字
(This只能代表当前对象! 静态方法可以不用对象调用)
public class Test { static{ System.out.println("test static 1"); } static{ System.out.println("test static 2"); } public static void main(String[] args) { } }
总结
最后再重点强调
静态只能访问静态。
非静态既可以访问非静态的,也可以访问静态的