Java中包相关知识总结

04月20日 收藏 0 评论 0 java开发

Java中包相关知识总结

文章申明:转载来源https://blog.csdn.net/qq_45661125/article/details/112507479

Java中的包非常重要,它关系到java中的继承。我们需要对其有一定的了解。

一、包的定义和存在的意义

在讲继承前我们必须知道包。包 (package) 是组织类的一种方式. 使用包的主要目的是保证类的唯一性.
例如, 你在代码中写了一个 Test 类. 然后你的同事也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致代码不能编译通过.类比于windows,当前目录为E:\Javacode\Test\src,你在此目录下已经创建了TestDemo.java文件,你同事想再此目录下创建一个同名的TestDemo.java文件时就会报错。但而在别的目录下创建的话就会成功(他E:\Javacode\Test\src\com\baidu\www创建一个同名的TestDemo.java文件就可以)我们可以简单得将包理解为路径,同样是TestDemo.java文件,但它们的路径不同(一个是E:\Javacode\Test\src下的,另一个是E:\Javacode\Test\src\com\baidu\www下的),因为路径的不同,我们就可以保证类的唯一性。如下图:

二、将类放到包中

1.操作步骤

我们该如何创建一个包呢?有该如何将类放入到包中呢?(我们用IDEA来演示)

①在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包

②在弹出的对话框中输入包名, 例如 baidu.com.www(一般情况下为公司域名的倒置)

③在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可(这里我们创建TestDemo.java)

④此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

⑤同时我们也看到了, 在新创建的 TestDemo.java 文件的最上方, 就出现了一个 package 语句(package com.baidu.www)

2.基本规则

①在文件的最上方加上一个 package 语句指定该代码在哪个包中

②包名需要尽量指定成唯一的名字,且用英文小写字母, 通常会用公司的域名的颠倒形式(例如 com.baidu.com).

③包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码.

④如果一个类没有 package 语句, 则该类被放到一个默认包中.

三、常见的系统包

1.java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。

2.java.lang.reflect:java 反射编程包;

3.java.net:进行网络编程开发包。

4.java.sql:进行数据库开发的支持包。

5.java.util:是java提供的工具程序包。(集合类等) 非常重要

6.java.io:I/O编程开发包。

四、如何导入包中的类

1.正常导入

除了我们自己创建的包之外,系统还给我们提供了大量的包供我们使用其内部包含的各种类,那么我们怎样去使用这些类呢?下面我们来看看如何导入包中的类。

①可以使用 java.util.Date 这种方式引入 java.util 这个包中的 Date 类

public class TestDemo {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}

②但是这种写法比较麻烦一些, 可以使用 import 语句导入包.

import java.util.Date;
public class TestDemo {
public static void main(String[] args) {
Date date=new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}

③但出现冲突的情况时,我们需要显示的指定要导入的类名,否则会编译出错

//错误写法
import java.util.*;
import java.sql.*;
public class TestDemo{
public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
Date date = new Date(); System.out.println(date.getTime());
}
}

// 编译出错
Error:(5, 9) java: 对Date的引用不明确 java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配


//正确写法
import java.util.*;
import java.sql.*;
public class Test {
public static void main(String[] args) { j
ava.util.Date date = new java.util.Date();
System.out.println(date.getTime());
}
}

2.静态导入

我们一般不使用静态导入,了解即可
使用 import static 可以导入包中的静态的方法和字段.
System底层是final是常量

import static java.lang.System.*; 
public class TestDemo {
public static void main(String[] args) {
out.println("hello");
}
}

使用这种方式可以更方便的写一些代码, 例如

import static java.lang.Math.*;

public class TestDemo {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);
}
}

3.注意事项

import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using

五、包的访问控制权限

1.访问控制权限分为四种:public、private、protected和默认的包访问控制权限
其中public在类内类外都可以访问,private只能在类内访问,prototected在之后的继承会讲到。如果字段或属性神魔都不加的话就是默认权限(包访问权限)
包访问权限顾名思义就是在同一个包中可以被访问(路径相同/在同一个目录下),其余地方不能被访问。

2.如图:在com.baidu.www这个包下定义了一个TestDemo这个类,这个类中定义了一个字段val(它没用public、private、protected修饰,代表默认权限包访问权限),它只能被它所在的com.baidu.www包中的其他类访问(TestDemo1访问),其余别的路径中的类不能访问val。(com.baidu下的Test2不能访问)

C 0条回复 评论

帖子还没人回复快来抢沙发