读《Java编程思想》笔记——第3站【对象之间的访问限制1】

对象之间的访问限制,可以分成三种:

第一种,遵守默认规则(同一个包之下随便调用,不同包之间需要特权)

第二种,范围小于默认,同一个包下的私有空间。

第三种,范围大于默认,用于解决不同包之间的通信问题。

所以,访问控制的界在于包package!有界就好办。

这一站的核心内容就是讲一讲包的概念,以及与包相关的小的知识点。

1.为什么一个Java文件中设置为public的类,类名与文件名要相同?

先看一个类,这个类依赖Java类库中的ArrayList。

//全称型
public class FullQualification{
    public static void main(String[] args){
        java.util.ArrayList list = new java.util.ArrayList();
    }
}

    看到java.util.ArrayList 这种调用方式,我似乎想明白了,为什么一个类文件中,设置为public的类,要求类名与文件名相同。(如果一个类文件中,所有类都没有设置为public,那么类名可以与文件名不同)因为文件名是用来查找用的,而Java类是用来调用的。想在我们讨论一下查找与调用放到一起与不放到一起两种情况:

  • new java.util.ArrayList();//既有查找又有调用(当前的设计就是这样的)
  • new java.util.ArrayList.ArrayList();//查找与调用不放到一起,前一个ArrayList表示查找,后一个表示调用。

    如果类被设置为public了,包外就可以访问,如果包外访问的话,就涉及查找问题,Java设计人员想让查找与调用放到一起,才要求类名与文件名一致的。那为什么不设置为public就可以让类名与文件名不同呢,因为不涉及查找啊,比如在ArrayList.java中除了public ArrayList之外还有ArrayList1(不是public的),这样就不能再包外访问,于是调用都是new ArrayList1(),不会涉及到查找问题,也就是在调用者所在的包中(不涉及包中的包——参考第4点:图解import语句),找到ArrayList1.class,也不会有什么争议。同时我们也明白了为什么一个类文件中不能有两个以上的public类,因为采用如果有两个以上的public类,我们就不得不采用第二种方案,也就是查找与调用不放到一起。需要注意的就是不管两个Java类放到一个类文件中,还是放到两个类文件中,编译之后得到的都是两个.class文件——参考第2点:编译单元

//导入型
import java.util.ArrayList;

public class SingleImport{
    public static void main(String[] args){
        ArrayList list = new ArrayList();
    }
}

 

2.编译单元(.java文件)

    说白了就是文件夹,那么与文件夹对应的是什么呢?当然是文件了。俗话说得好:“我们不管打开多少文件夹,目的都是找文件”。所以会有这样一条线:最外层的包=>次外层的包=>......最里层的包=>.java的文件=>class类=>属性/方法。需要注意的一个小的知识点“当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同。【6.1节】”也就是说可以没有public,但是不能有1个以上的public。

  1. 可以没有是因为即使不能与包之外的世界联系,还是可以与包里面的其它类联系嘛。
  2. 只有一个是因为调用的关系,因为在外界调用,文件名即为类名。比如,new java.util.ArrayList();而不用写成new java.util.ArrayList.ArrayList();

    “当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。因此,在编译少量.java文件之后,会得到大量的.class文件”

3.带有package语句的编译单元(诸多编译单元的“打包”)

    “类库实际上是一组类文件。其中每个文件都有一个public类,以及任意数量的非public类。因为每个文件都有一个构件。如果希望这些构件从属于同一个群组,就可以使用关键字package。”【6.1.1节】

我想这个package的作用就是打包的意思吧。

【规范】Java包的命名规则全部使用小写字母,包括中间的字也是如此。【6.1.1节】

4.图解import语句

不同包之间,要想通信,第一步就是导入,其次才看各个类与各个方法的权限。

//:net/mindview/simple/List.java
//Creating a package
package net.mindview.simple;
public class List{
    public List(){
        System.out.println("net.mindview.simple.List");
    }
}
//:access/LibTest.java
//User the library
import net.mindview.simple.*;
public class LibTest{
    public static void main(String[] args){
        List l = new List();    
    }
}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值