返回列表 发新帖

【Android入坑系列教程】50.包---面向对象

[复制链接]

62

主题

722

回帖

2756

积分

大学生

Rank: 5Rank: 5

金币
2029
好评
12
信誉
100

考神

发表于 2019-4-8 12:31:26 | 显示全部楼层 | 阅读模式  来自 四川
本帖最后由 pansong291 于 2019-4-9 12:55 编辑

上篇:49.异常(三)---面向对象
下篇:51.访问控制---面向对象

注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!


读者可以想一想,sun 公司的 JDK,系统软件商,开发工具商都会提供成千上万个具有
各种用途的类,我们也要管理自己的大型软件系统中数目众多的类。如果不对这些类进行分
门别类的使用和存放,就象我们不用文件夹去管理众多的文件一样,在使用时将极度困难和
不方便,也极易出现类的命名冲突问题。Java 是通过引入包(package)机制,提供类的多层
类命名空间,来解决上述问题的。

package 语句及应用
我们还是通过一段程序来开始 package 的讲解:
package org.it315;
public class TestPackage
{
    public static void main(String [] args)
    {
        new Test().print();
    }
}
class Test
{
    public void print()
    {
        System.out.println("the program is demostrating how to using package!");
    }
}
上面的程序第一条语句,指示这个源文件中的所有类都位于包 org.it315 中,位于包中
的每个类的完整名称都应该是包名与类名的组合,如上面的类 TestPackage 的完整名称应是
org.it315.TestPackage
同一个包中的类相互访问,不用指定包名,如程序中的 TestPackage 类访问 Test 类时,
用的是 Test,而不是 org.it315.Test。如果从外部访问一个包中的类,必须使用类的完整
名称。就好比北京人说:“我要去一趟上海!”,如果说成“我要去一趟中国﹒上海!”,同是中
国的两个城市,使用时非要加个中国前缀,也是行得通的,但让人听来就有点像卖国贼了。
美国纽约人则必须说:“我要去一趟中国﹒上海!”,因为这是两个不同国家的城市。
位于在包中的类,在文件系统中(通俗地说,就是硬盘上)的存放
位置,必须有与包名层次相对应的目录结构。在 package 语句中,用点(.)来指明包的
层次,如:
package org.it315;
这个语句表示有一个 org 的包,该包中包含有一个名为 it315 的子包。如上面的程
序,类 TestPackage 就在 it315 子包中,我们假设 TestPackage.java 源文件所在目录
的名称为 C:\myjava,我们需要在 C:\myjava 目录中创建一个 org 的子目录,在 org 子
目录中又要创建一个 it315 子目录,TestPackage.class 文件就要位于 it315 目录中,
如图 4.3 所示:

正常编程开发过程中,java源文件的目录也必须与包所指定的目录相同。
脚下留心:
即使文件名都是 TestPackage.class,但其中包含的类的完整名称却不见得相
同,如 org.it315.TestPackage 类与 com.sun.TestPackage 类的文件名都是
TestPackage.class,但却是两个完全不同的类,应存放在不同的目录结构中。
提示:很多初学者常常误以为把一个类放在某个目录下,就等于这个目录名就成了
这个类的包名。再次强调,不是有了目录结构,就等于有了包名,包名必须在程序中通
package 语句指定,而不是靠目录结构来指定的,是先要有了包名后,才需要相应的
目录结构。
有关包的其他细节:
package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包,必须把
包声明放在源文件的最前面,每个源文件只能声明一个包。
如果没有 package 语句,则为缺省无名包。但实际项目应用中,没有使用无名包的类,
读者就把这当着是一个硬性规定吧,相信我,这不仅是一个良好的编程习惯,而且有助你在
日后实际工作中避免许多可能碰到的麻烦。

import 语句及应用
了解完 package 语句的作用,我们来看看不同包的类之间是如何调用的。我们将
TestPackage.java 中的两个类放到不同的包中,按我们前面所讲,我们需要两个单独的.java
源文件来容纳这两个类,程序如下:
程序清单 1:TestPackage.java
package org.it315;
public class TestPackage
{
    public static void main(String [] args)
    {
        new Test().print(); //标记 1
    }
}
程序清单 2:Test.java
package org.it315.example;
public class Test
{
    public void print()
    {
        System.out.println("the program is demostrating how to using package!");
    }
}
编译器报错:

出错的原因在于:在类 TestPackage 中直接调
用类 Test,编译器认为这两个类应在同一包中,即类 Test 完整名称为 org.it315.Test,实
际上,我们是找不到这个类的。我们将标记 1 处的语句修改成:
new org.it315.example.Test().print();
就一切正常了。
如果我们要在程序中多次用到 org.it315.example 包中的若干类名,我们每次用到其中
的类名时,都要加上 org.it315.example 前缀,显然有点儿繁琐。在 java 中是使用 import
语句来简化这个问题的。
我们修改 TestPackage.java 源文件的程序代码,如下:
package org.it315;
import org.it315.example.*;
//import org.it315.example.Test;
public class TestPackage
{
    public static void main(String [] args)
    {
        new Test().print(); //标记 1
    }
}
这个例子已经向读者显示了 import 语句的作用。有了 import
语句,我们在使用某个包里的类时,就不用写上一长串包名了(如
org.it315.example.Test)。我们也可以去掉第二行的注释,然后注释掉第一行,
发现是完全一样的。那么上面粗体的两行 import 语句有什么不一样呢?
第一个 import 语句,导入了整个包中的所有类,那么我们的程序中凡是遇到的
org.it315.example 包中的类,都不用再写包名了,只需写一个类名就可以了。第二个 import
语句只导入了该包中的 Test 类,对该包中的其他类不起作用,在程序中用到 Test 类时,我
们不用写包名了,但对于该包中的其他类,我们还必须写上完整的包名。
如果两个包中都含有同样的类名,如 java.util、java.sql 这两个包中都有 Date 这个
类,程序又同时导入了这两个包中的所有类,如:
import java.util.*;
import java.sql.*;
这时候程序就不知道该用哪个包里面的 Date 类,编译器在碰到使用 Date 类的地方就会
报错。对于这种情况,我们就需要在用到这个特殊的类的地方写上完整的包名,如
new java.sql.Date()
多学两招:
父 包 和 子 包 之 间 , 能 从 语 意 上 表 示 某 种 血 缘 和 亲 近 关 系 , 如 org.it315.*
org.it315.mail.*,从包名上可以看出这些类都是 it315 这个组织(或公司)开发的类,
org.it315.mail.* 还能更进一步地说明其中的类是专用于 mail 项目的。但父包和子包在使
用上没有任何关系,如父包中的类调用子包中的类,必须引用子包的全名,而不能省略父包
名部分。另外,当我们 import 了一个包中所有的类,并不会 import 这个包中的子包中的类,
如果程序中用到了子包的类,需要再次对子包作单独引入,如我们以后经常会见到在同一程
序中,经常同时出现下面的两条语句。
import java.awt.*;
import java.awt.event.*;

JDK 中的常用包
Sun 公司在 JDK 中为我们提供了大量的各种实用类,通常称之为 API(application
programming interface),这些类按功能不同分别被放入了不同的包中,供我们编程使用,
下面简要介绍其中最常用的六个包:
1. java.lang----包含一些 Java 语言的核心类,如 StringMathIntegerSystemThread
提供常用功能。
2. java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这
些类被用来构建和管理应用程序的图形用户界面(GUI)。
3. java.applet----包含 applet 运行所需的一些类。
4. java.net----包含执行与网络相关的操作的类。
5. java.io----包含能提供多种输入/输出功能的类。
6. java.util----包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。
注:java1.2 以后的版本中,java.lang 这个包会自动被导入,对于其中的类,不需要使用
import 语句来做导入了,如我们前面经常使用的 System 类。

上篇:49.异常(三)---面向对象
下篇:51.访问控制---面向对象

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

101

主题

1997

回帖

6948

积分

禁止访问

金币
51
好评
100
信誉
100

MT管理器插件作者MT论坛最佳新人MT论坛帅哥MT论坛灌水老大2019-5.1节快乐考神MT论坛侠客MT论坛活跃会员

QQ
发表于 2019-4-8 15:54:38 | 显示全部楼层  来自 四川
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

19

主题

255

回帖

3335

积分

大学生

Rank: 5Rank: 5

金币
364
好评
20
信誉
100
发表于 2019-4-8 17:19:54 | 显示全部楼层  来自 重庆
兄弟可以啊下一个版主就是你
回复

使用道具 举报

0

主题

8

回帖

72

积分

小学生

Rank: 2

金币
1
好评
0
信誉
100

MT论坛帅哥

发表于 2019-4-8 17:41:40 来自手机  | 显示全部楼层  来自 山东
入门必备。
回复

使用道具 举报

1

主题

2283

回帖

4494

积分

大学生

Rank: 5Rank: 5

金币
2610
好评
1
信誉
100
发表于 2019-4-8 19:25:13 | 显示全部楼层  来自 河北
加强学习,补足基础
回复

使用道具 举报

7

主题

666

回帖

1964

积分

高中生

Rank: 4

金币
1115
好评
0
信誉
98

MT论坛帅哥考神MT论坛最佳新人MT论坛新人

发表于 2019-4-20 13:34:52 来自手机  | 显示全部楼层  来自 山东
看教程那金币
回复

使用道具 举报

5

主题

1490

回帖

5571

积分

硕士生

Rank: 6Rank: 6

金币
3116
好评
0
信誉
101
QQ
发表于 2019-7-11 17:00:21 | 显示全部楼层  来自 河北
我是来学习的
回复

使用道具 举报

0

主题

78

回帖

301

积分

初中生

Rank: 3Rank: 3

金币
57
好评
0
信誉
100
发表于 2019-8-17 11:36:34 来自手机  | 显示全部楼层  来自 广西
感谢楼主
回复

使用道具 举报

10

主题

510

回帖

1725

积分

高中生

Rank: 4

金币
544
好评
2
信誉
101
发表于 2019-10-10 09:53:21 | 显示全部楼层  来自 重庆
这个讲得挺详细的,茅塞顿开
回复

使用道具 举报

1

主题

518

回帖

1703

积分

高中生

Rank: 4

金币
926
好评
0
信誉
101
发表于 2019-11-29 15:49:21 | 显示全部楼层  来自 福建
学习学习
回复

使用道具 举报

0

主题

2803

回帖

5674

积分

硕士生

Rank: 6Rank: 6

金币
783
好评
0
信誉
96
发表于 2019-12-27 10:18:42 | 显示全部楼层  来自 江西
怒刷存在感,包是啥,给我打个包,能装几个对象
回复

使用道具 举报

7

主题

2323

回帖

4081

积分

大学生

Rank: 5Rank: 5

金币
635
好评
2
信誉
100
发表于 2020-6-15 11:42:01 | 显示全部楼层  来自 广东
谢谢分享,挺有用的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表