18-包及作用域

包https://www.jianshu.com/p/c798a019f2ec
Java定义了一种名字空间,称之为包:package,用于解决名字冲突。一个类总是属于某个包,类名只是一个简写,真正的完整类名是包名.类名。
例如:
小明的Person类存放在包ming下面,因此,完整类名是ming.Person;
小红的Person类存放在包hong下面,因此,完整类名是hong.Person;
小军的Arrays类存放在包mr.jun下面,因此,完整类名是mr.jun.Arrays;
JDK的Arrays类存放在包java.util下面,因此,完整类名是java.util.Arrays。
在定义class的时候,我们需要在第一行声明这个class属于哪个包。
//小明的Person.java文件:
package ming; // 申明包名ming

public class Person {
}

//小军的Arrays.java文件:
package mr.jun; // 申明包名mr.jun

public class Arrays {
}

注意:如果在定义包的时候出现了“.”,那么就表示子目录,多个.java文件可以属于一个包。
假设以package_sample作为根目录,src作为源码目录,那么所有文件结构就是:
package_sample
└─ src
    ├─ hong
    │  └─ Person.java
    │  ming
    │  └─ Person.java
    └─ mr
       └─ jun
          └─ Arrays.java


包的作用域一共有三种情况:
修饰符public:标记为public的部分可以被任意的类使用;
修饰符private:标记为private的部分只能被定义他们的类使用;
没有指定修饰符的部分:这部分(类、方法和变量)可以被同一个包中的所有方法访问

包的导入(import)
在一个class中,总会引用其他的class。例如,小明的ming.Person类,如果要引用小军的mr.jun.Arrays类,他有三种写法
// Person.java 直接写出完整类名
package ming;

public class Person {
    public void run() {
        mr.jun.Arrays arrays = new mr.jun.Arrays();
    }
}

// Person.java
package ming;

import mr.jun.Arrays;//用import语句,导入小军的Arrays

public class Person {
    public void run() {
        Arrays arrays = new Arrays();
    }
}

// Person.java
package ming;

import mr.jun.*;// 导入mr.jun包的所有class:

public class Person {
    public void run() {
        Arrays arrays = new Arrays();
    }
}//一般不推荐这种写法,因为在导入了多个包后,很难看出Arrays类属于哪个包

注意:但是有时会在一个文件中导入不同的包,并且不同的包里有可能会存在同名类,那么只能import其中一个,另一个必须写完整类名。
还有一种import static的语法,它可以导入可以导入一个类的静态字段和静态方法: package main;
// 导入System类的所有静态字段和静态方法: import static java.lang.System.*; public class Main { public static void main(String[] args) { // 相当于调用System.out.println(…) out.println("Hello, world!"); } }//用处较少 Java编译器最终编译出的.class文件只使用完整类名,因此,编译器遇到一个class,会按规则确定类名,如果无法确定类名,则编译报错。
如果是完整类名,就直接根据完整类名查找这个class; 如果是简单类名,按下面的顺序依次查找: 查找当前package是否存在这个class; 查找import的包是否包含这个class; 查找java.lang包是否包含这个class。 作用域 定义为public的class、interface可以被其他任何类访问 定义为public的field、method可以被其他类访问,前提是首先有访问class的权限 定义为private的field、method无法被其他类访问,但嵌套类拥有访问private的权限 protected作用于继承关系。定义为protected的字段和方法可以被子类访问,以及子类的子类 局部变量作用域从变量声明处开始到对应的块结束。方法参数也是局部变量。 注意:定义在一个class内部的class称为嵌套类(nested
class),Java支持好几种嵌套类。

猜你喜欢

转载自www.cnblogs.com/nsss/p/11417542.html