JAVA:不同包(package)的类之间如何调用(import)

欢迎关注公众号:VenusBlockChain 致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。
在这里插入图片描述

#【1】问题描述
Java由于应用了package的机制,将不同的类存放在不同 的类名空间中,如果不同包之间互相调用其中的类时,该怎么办呢,是直接调用还是有什么其他方法呢?
#【2】属于不同包的类之间的调用方法
程序1:Test.java

package org.it315.example;
public class Test 
{
	public void print() 
	{
		System.out.println("Hello World!");
	}
}

程序2:TestPackage.java

package org.it315;
public class TestPackage 
{
	public static void main(String[] args) 
	{
		new Test().print();
	}
}

程序1和2都放在同一目录下:
这里写图片描述
执行
这里写图片描述

出错的原因是:在类TestPackage中直接调用类Test,编译器会认为这两个类应在同一个包中,即Test完整名称为org.it315.Test。因此,在没有使用import语句时,可以将“程序2”按照下面修改。

修改“程序1”

package org.it315;
public class TestPackage 
{
	public static void main(String[] args) 
	{
		new org.it315.example.Test().print();
	}
}

执行
这里写图片描述

#【3】import

  • 在上面的修改过程中是,要调用的类直接将一个类的全名给写出来,即加上包名前缀:org.it315.example。
  • 新的问题来了,如果在程序中,要调用很多不再同一个包中的类,按照上述的做法就必须在类名前加上包名前缀。这时,为了简化书写操作,就可以使用import语句来简化此问题。通过使用import语句来导入指定的类的所属包即可。
  • import语句的做法就是在每个.java文件的第一条package语句的后面添加要调用的类的包名。
  • 语法格式为:import PackageName.*;
    import PackageName.ClassaName;

对“程序2”进行修改:

package org.it315;
import org.it315.example.*;//标记1
//import org.it315.example.Test;//标记2
public class TestPackage 
{
	public static void main(String[] args) 
	{
		new Test().print();
	}
}

执行
这里写图片描述

  • 通过重新编译可以发现,正是import语句的使用,我们在使用某个包里的类时,就不再需要写上一长串的包名了(如:org.it315.example)。

  • “标记1”和“标记2”所代表的语句的区别是:”标记1“的import语句导入了整个包中的类,此时程序凡是遇到的org.it315.example包中的类,都不再写包名(org.it315.example)了。”标记2“的import语句只是导入了该包中的Test类,对该包中的其他类不起作用,在程序遇到Test类时,就不再写包名了。然而,对于包中其他的类的调用,就必须写上完整的包名。

#【4】import使用注意事项

  • 如果两个包中有相同的类名,程序在调用这两个指定的类时,就必须写上完整的包名。如,java.util、java.sql包中都有Date类,程序又同时导入了这两个包中的所有类,如:
import java.util.*;
import java.sql.*

这时程序要调用Date类时就需要这个指定的类的地方写上完整的包名,如:java.sql.Date();或者增加一个特定的import语句来解决这个问题:import java.sql.Date;

  • 只能使用星号(*)导入一个包,而不能使用import.java.*或import java.*.*导入以java为前缀的所有包。

  • 父包与子包:如org.it.315.* 和 org.it315.example.*。父包中的类调用子包中的类,必须用子包的全名,不能省略父包名部分。

  • 当import了一个包中的所有类,并不会import这个包中的子类,如果程序中用到了子包的类,需要再次对子包单独导入。

  • import语句应该位于源文件的顶部(但是位于package语句的后面),位于类定义之前。

修该“程序2“

package org.it315;
import org.it315.*;
public class TestPackage 
{
	public static void main(String[] args) 
	{
		new Test().print();
	}
}

执行
这里写图片描述
可以发现,编译不成功。由于只是import了类Test的父包,Test本身所在的包并没有导入进去。

再次修改”程序2”

package org.it315;
import org.it315.example.*;
public class TestPackage 
{
	public static void main(String[] args) 
	{
		new Test().print();
	}
}

执行,编译成功,运行成功。
这里写图片描述

#【5】静态导入

  • import语句不仅可以导入一个特定的类或整个包。还可以导入静态方法和静态变量。静态导入是JDK1.5版本新增加的一个特性,尽管通常被称为“静态导入”,但注意语法上不是 static import ,而是 import static 。

  • 当在一个类中需要使用外部包中的静态成员变量或成员方法时,可以使用以下方式导入外部静态成员:
    (1)import static 包名.类名.静态成员变量名;
    (2)import static 包名.类名.静态成员方法名;
    (3)import static 包名.类名.*;//使用通配符“*”导入某个类的所有的静态成员。

  • 用实例来说明静态导入的用法:
    (1)按照上述的import导入一个类

package org.it315.example;

public class TestStaticImport 
{
	public static final int age = 100;
	public static final String name = "Brian";
	public static void printAge()
	{
		System.out.println("AGE = " + age);
	}
	public static void printName() 
	{
		System.out.println("NAME = " + name);
	}
}


package blog.csdn;
import org.it315.example.TestStaticImport;

public class TestPackage 
{
	public static void main(String[] args) 
	{
		int AGE = TestStaticImport.age;
		String NAME = TestStaticImport.name;
		//new TestStaticImport().printName();
		//new TestStaticImport().printAge();
		TestStaticImport.printName();
		TestStaticImport.printAge();
		System.out.println(AGE);
		System.out.println(NAME);
	}
}

这里写图片描述
(2)使用import static 导入静态成员函数和变量

package org.it315.example;

public class TestStaticImport 
{
	public static final int age = 100;
	public static final String name = "Brian";
	public static void printAge()
	{
		System.out.println("AGE = " + age);
	}
	public static void printName() 
	{
		System.out.println("NAME = " + name);
	}
}
package blog.csdn;
//import static org.it315.example.TestStaticImport.*;
import static org.it315.example.TestStaticImport.age;
import static org.it315.example.TestStaticImport.name;
import static org.it315.example.TestStaticImport.printAge;
import static org.it315.example.TestStaticImport.printName;

public class TestPackage 
{
	public static void main(String[] args) 
	{
		int AGE = age;
		String NAME = name;
		System.out.println(AGE);
		System.out.println(NAME);

		//new TestStaticImport().printName();
		//new TestStaticImport().printAge();
		printName();
		printAge();

	}
}

这里写图片描述
#【6】包的作用域

  • 标记为public的部分可以被任意的类使用;
  • 标记为private的部分只能被定义它们的类使用;
  • 如果没有指定public或private,这个部分(类,方法,变量)可以被同一个包中的所有方法访问。

#【7】JDK中的最常见的六种包

  • java.lang——包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
  • java.awt——包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
  • java.applet——包含applet运行所需的一些类。
  • java.net——包含执行与网络相关的操作的类。
  • java.io——包含能提供多种输入输出功能的类。
  • java.util——包含一些实用工具类,如定义系统的特性、使用日期日历相关的函数。

#【8】包package的作用域、类成员的访问控制
这里写图片描述

  • 57
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值