关于java的包Package中同名类的冲突及其理解

 更新时间:2023年07月10日 15:33:53   作者:钟眞龙  
这篇文章主要介绍了关于java的包Package中同名类的冲突及其理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java的包Package中同名类的冲突及理解

在一个项目中建立三个包分别为

  • chapter2
  • pack2
  • pack3

其中初始化(主)函数在InitialTelphone类里,看图显然是在chapter2包里。

这是chapter2包下的Telphone类实现

package chapter2;
public class Telphone {
  //属性
	 private float cup;
	 private float screen;
	 private float mem;
  //get set方法
	 public float getScreen() 
	 {
		 return screen;
	 }
	 public void setScreen(float newScreen) 
	 {
		 screen=newScreen;
	 }
	 //方法	
	 public Telphone() 
	 {
		 System.out.println("第一个包的Telphone类");
	 }
}

这是pack2包下的Telphone类实现

package pack2;
public class Telphone {
     public Telphone() {
		// TODO Auto-generated constructor stub
    	 System.out.println("第二个包的类Telphone");
	}
}

这是pack3包下的Telphone类实现

package pack3;
public class Telphone {
   public Telphone() {
	// TODO Auto-generated constructor stub
	   System.out.println("第三个包的Telphone类");
}
}

chapter2包下的initialTelphone类实现

package chapter2;
public class InitalTelphone {
	public static void main(String[] args) {
		//通过无参方法生成对象
	 Telphone tel=new Telphone();	
	}
}

在initialTelphone文件写没有导入包pack2.Telphone和pack3.Telphone

执行程序将会得到以下结果:

第一个包的Telphone类

若在initialTelphone文件中导入pack2.telphone

intialTelphone代码改变如下:

package chapter2;
import pack2.Telphone;
public class InitalTelphone {
	public static void main(String[] args) {
		//通过无参方法生成对象
	 Telphone tel=new Telphone();
	}
}

执行程序会发现结果为:  

第二个包的类Telphone

但是如果导入的包形式为:impor pack2.*;

package chapter2;
import pack2.*;
public class InitalTelphone {
	public static void main(String[] args) {
		//通过无参方法生成对象
	 Telphone tel=new Telphone();
	}
}

程序运行结果又发生了变化:

第一个包的Telphone类

如果同时导入pack2.Telphone和pack3.Telphone

则会发生包冲突报错

The import pack3.Telphone collides with another import statement

package chapter2;
import pack2.Telphone;
import pack3.Telphone;;
public class InitalTelphone {
	public static void main(String[] args) {
		//通过无参方法生成对象
	 Telphone tel=new Telphone();
	}
}

但是把pack2.telphone格式改为pack2.*,pack3.Telphone保持不变

package chapter2;
import pack2.*;
import pack3.Telphone;;
public class InitalTelphone {
	public static void main(String[] args) {
		//通过无参方法生成对象
	 Telphone tel=new Telphone();
	 //有参构造方法生成对象
	 //Telphone tel2=new Telphone(4.0f,3.0f,1.5f);
	}
}

程序执行结果为:

第三个包的Telphone类

显然如果把pack3.Telphone格式也改为pack3.*,结果可想而知:

第一个包的Telphone类

但是如果把chapter2中的Telphone类给删除了

导入包的格式为pack2.*;pack3.*;

运行程序就会出现冲突错误:

        The type Telphone is ambiguousThe type Telphone is ambiguous

如果只导入Pack2.*或者只导入Pack3.*则又可以运行成功:

(import Pack2.*;)结果:第二个包的Telphone类

(import Pack3.*;)结果:第三个包的Telphone类

通过上述程序的测试,

我知道了包重名类的简单运行机制:

1、如果没有导入任何包,主函数运行时创建类的实例首先从自己所在的包里面找

2、如果导入一个包,并且导入该包的形式精确到重名的类,则主函数创建重名类实例将会从导入的包里找

3、如果导入一个包,包的格式为  import 包名.*;类型的,则主函数创建重名类实例时首先在主函数自己所在的包里找,找不到了再去导入的.*包里面找

4、如果导入多个包,并且导入的多个包中只有一个导入类型精确到重名类,则主函数创建重名类实例时在导入精确到类的包里面找。

5、如果导入多个包,并且读入的多个包中都是(import 包名.*;)类型的,主函数创建重名类实例时直接在自己所在包里找;如果找不到,并且导入的多个包里有两个同名类就会报错 ;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一篇超详细的Spring Boot对jdbc支持的文章

    一篇超详细的Spring Boot对jdbc支持的文章

    JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans,下面给大家介绍spring boot中使用JdbcTemplate相关知识,一起看看吧
    2021-07-07
  • 如何基于JavaFX开发桌面程序

    如何基于JavaFX开发桌面程序

    这篇文章主要介绍了如何基于JavaFX开发桌面程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java调用浏览器打开网页完整实例

    Java调用浏览器打开网页完整实例

    这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    这篇文章主要介绍了使用IDEA异常断点来定位java.lang.ArrayStoreException的问题,平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理,下面我们来一起学习一下吧
    2019-06-06
  • SpringBoot中的自定义Banner详细解析

    SpringBoot中的自定义Banner详细解析

    这篇文章主要介绍了SpringBoot中的自定义Banner详细解析,Banner即横幅标语,我们在启动SpringBoot项目时会将Banner信息打印至控制台,我们可以输出一些图形、SpringBoot版本信息等内容,需要的朋友可以参考下
    2024-01-01
  • 使用Java visualVM监控远程JVM的流程分析

    使用Java visualVM监控远程JVM的流程分析

    我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少,JDK1.6开始自带的VisualVM就是不错的监控工具,本文给大家分享使用Java visualVM监控远程JVM的问题,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 使用Spring Security控制会话的方法

    使用Spring Security控制会话的方法

    在本文中,我们将说明Spring Security如何允许我们控制HTTP会话。这篇文章主要介绍了使用Spring Security控制会话 ,需要的朋友可以参考下
    2019-05-05
  • java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题

    java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题

    这篇文章主要为大家介绍了java图论弗洛伊德算法和迪杰斯特拉算法解决最短路径的问题示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • springmvc path请求映射到bean 方法的流程

    springmvc path请求映射到bean 方法的流程

    这篇文章主要介绍了springmvc path请求映射到bean 方法的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringBoot+mybatis+thymeleaf实现登录功能示例

    SpringBoot+mybatis+thymeleaf实现登录功能示例

    这篇文章主要介绍了SpringBoot+mybatis+thymeleaf实现登录功能示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论