4.7 Java中的包 package

  • 作用
    • 使用package将类组织起来,借助于包可以将自己定义的类进行统一的管理,还可以与其他外部导入的包进行区分
  • 使用原因
    • 确保类名的唯一性,与xml中的namespace是同一个道理.
    • 如何让包名独一无二呢,您可以选择

公司的因特网域名以逆序的形式来作为包名,并且不同的项目使用不同的包名

    这也是SUN公司所建议的.

4.7.1 包的引入

  • 一个类可以使用所属包中的所有类,以及其他包中的公有类.我们可以采用两种方式来访问另一个包中的类名.
      1. 每个类名前添加完整的类名
        但这显然是费劲的.

java.time.LocalDate today = java.time.LocalDate.now();

 - 2.使用import进行导入你想要的类
 - 

import java.time.LocalDate;

  • 注意:指定包下的特定类名易于读者的理解你具体导入了那个类
  • 另外,要注意的是
    • 有些类名是同名的,但不属于不同的包
    • -

java.util和java.ql中的Date类

  • 你也不能两个包都导入;
  • 否则编译会出错误
  • -

Date date;
//Error–java.util.Date or java.sql.Date?

 - 编译器是不知道程序使用的是哪个类.

那要是两个类都要使用呢
-答案是:每个类名签名加上完整的包名

import java.util.*;
import java.sql.*;
java.util.Datedeadline= new java.util.Date();

在包中定位类是编译器的工作.类文件中的字节码肯定使用完整的包名来引用其他的类.

4.7.2 静态导入

  1. import不仅可以导入类,还增加了导入静态方法和静态域的功能.

  2. import static java.lang.System.*;
    就可以使用System中的静态方法和静态域,而不需要加类名前缀.

out.println(“hello world”);

  • 但这有似乎不利于代码的清晰度.
  • 所以不太建议

    4.7.3 将类放到包中

  • 如果想要将一个类放入到包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前.
  • 实例:
    default中的类

上图是放置在默认包中的一个A类,默认包时没有名称的包;
查看classpath下的包结构就可以得出以上结论:
src下的A路径
- 可以看出在默认包中的A类是直接放置在src目录下的裸露的一个类,且默认包default是没有名称的包

4.7.4 包作用域

被标记为public的部分可以被任意的类使用;标记为private的部分只能被自己类使用;没有指明public或private则是default,被他修饰的部分(类,方法,变量)可以被同一个包中的所有方法访问,以及父类子类之间是可以访问的.

权限表

包存在的问题

  • 在默认情况下,包不是一个封闭的实体.任何人都可以向包中添加更多的类.当然.有敌意的程序员可以利用包的可见性,添加一些具有修改代码功能的代码.这一弊端是极其危险的.
  • 可以使用一下语句放在类文件的开头,就可以很容易地将其他类混入到你想要攻击的包中

    package java.awt

  • 好在,从1.2版本开始,JDK的实现这修改了类加载器,明确地禁止加载用户自定义的、包名以”java.”开头的类!当然了用户自定义的类是无法从这种保护中受益.

  • 然而.用户可以通过包密封(package sealing)机制来解决将各种包混杂在一起的问题.如何将一个包密封起来呢,请听下回分解;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值