Skip to content

java允许使用包(package)将类组织起来。使用包的主要原因是确保类名的唯一性,防止命名冲突。

package语句必须是文件中除注释以外的第一行程序代码:package access,以表明该文件是在包access 下。

比如说对于两个 Person 类,放在不同的包下,这样

java
package ming; // 申明包名ming

public class Person {
}
java
package hong; // hong

public class Person {
}

⚠️要特别注意:包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。

类的导入

一个类可以使用所属包中的所有类,以及其他包中的公有类(public class)。

我们可以采用两种方式访问另一个包中的公有类。

  1. 为每个类名之前添加完整包名
java
   java.time.LocalDate today = java.time.LocalDate.now();
  1. 使用import 语句

plain
package abc;

public class Hello {
    public void hi() {
    }
}
plain
package xyz;

class Main {
    void foo() {
        // Main可以访问Hello
        Hello h = new Hello();
    }
}
plain
package abc;

public class Hello {
    public void hi() {
    }
}
plain
package xyz;

class Main {
    void foo() {
        Hello h = new Hello();
        h.hi();
    }
}

plain
package abc;

public class Hello {
    // 不能被其他类调用:
    private void hi() {
    }

    public void hello() {
        this.hi();
    }
}
__
plain
package abc;

public class Hello {
    public void hello() {
        this.hi();
    }

    private void hi() {
    }
}
plain
// private

plain
package abc;

public class Hello {
    // protected方法:
    protected void hi() {
    }
}
plain
package xyz;

class Main extends Hello {
    void foo() {
        // 可以访问protected方法:
        hi();
    }
}

plain
package abc;
// package权限的类:
class Hello {
    // package权限的方法:
    void hi() {
    }
}
plain
package abc;

class Main {
    void foo() {
        // 可以访问package权限的类:
        Hello h = new Hello();
        // 可以调用package权限的方法:
        h.hi();
    }
}

plain
package abc;

public class Hello {
    void hi(String name) { // ①
        String s = name.toLowerCase(); // ②
        int len = s.length(); // ③
        if (len < 10) { // ④
            int p = 10 - len; // ⑤
            for (int i=0; i<10; i++) { // ⑥
                System.out.println(); // ⑦
            } // ⑧
        } // ⑨
    } // ⑩
}

plain
package abc;

// 无法被继承:
public final class Hello {
    private int n = 0;
    protected void hi(int t) {
        long i = t;
    }
}
plain
package abc;

public class Hello {
    // 无法被覆写:
    protected final void hi() {
    }
}
plain
package abc;

public class Hello {
    private final int n = 0;
    protected void hi() {
        this.n = 1; // error!
    }
}
plain
package abc;

public class Hello {
    protected void hi(final int t) {
        t = 1; // error!
    }
}