Java面向对象9--包

1.作用:用于解决类名冲突

例如:

小军写了一个Arrays类,恰好JDK也自带了一个Arrays类,两个都需要的情况下,可以用包来解决类名冲突。

2.定义:

package,是一种定义的名字空间,一个类总是属于某个包

例如:

一个Person,完整的名称是 某个包名.Person

3.注意

①.在定义一个class的时候,需要在class中第一行声明这个class属于哪个包。

②.包存在多级结构,但不属于继承关系,例如:java.util和java.util.zip属于不同的包。

③.没有写包名的类会有默认的包,但容易造成类名冲突。

④.所有Java文件对应的目录层次要和包的层次一致。

4.包作用域

不用 public、protected、private修饰的方法或字段,就是包作用域。即在同一个包下,class可以对于包内的class进行调用。

例如:

package hello;

public class Person {
    // 包作用域:
    void hello() {
        System.out.println("Hello!");
    }
}
package hello;

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.hello(); // 可以调用,因为Main和Person在同一个包
    }
}

5.import

在不同的包的情况下,对于class的调用有三种方法。

①.在使用另一个包的class时,完整写出类名。

例如:

zhangsan.Person 调用lisi.ls.Person

// Person.java
package zhangsan;

public class Person {
    public void run() {
        lisi.ls.Person person =new lisi.ls.Person();
    }
}

2.使用import

// Person.java
package zhangsan;

// 导入完整类名:
import lisi.ls.Person;

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

注意:

①.在使用import时,可以使用*,表示导入该包下的所有类,不包括子包中的类。

例如:导入ls下的所有类  import  lisi.ls.*;

一般不推荐这样的写法,很难找到某个类属于哪个包,就比如现在,不知道Person是否属于lisi.ls包下的类。

3.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。

例如:

// Main.java
package test;

import java.text.Format;

public class Main {
    public static void main(String[] args) {
        java.util.List list; // ok,使用完整类名 -> java.util.List
        Format format = null; // ok,使用import的类 -> java.text.Format
        String s = "hi"; // ok,使用java.lang包的String -> java.lang.String
        System.out.println(s); // ok,使用java.lang包的System -> java.lang.System
        MessageFormat mf = null; // 编译错误:无法找到MessageFormat: MessageFormat cannot be resolved to a type
    }
}

 

编写class的时候,编译器会自动帮我们做两个import动作:

默认自动import当前package的其他class;

默认自动import java.lang.*。

注意:

①.自动导入的是java.lang包,但类似java.lang.reflect这些包仍需要手动导入。

②.导入的类名中有相同的,一个使用import,另一个就必须写完整类名。

③.自行定义类名的时候,不要将java.lang包的类和JDK常用类重名,即不要使用String、System、java.uitl.List等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值