java import、package与php的namespace和use、requie实质

首先,java的工作原理是,首先去java的环境变量classpath或者你当前编译目录下去找有没有你需要的类

import、package 后跟着的其实不是文件的真实路径,事实上,它们不需要按照名称组织文件夹,你把他们统统放在一个目录下也可以正常编译运行。将其按照文件路径组织仅仅是为了人们看起来方便。
它真实的目的是 为了避免类的冲突。

package名称就像是我们的姓,而class名称就像是我们的名字
所以,import 跟 c的#include 不同,是因为import 的功能到此為止,它不像#include 一样,会将其他文件的内容载入进来。import 只是让编译器编译这个java文件时把没有姓的类别加上姓,并不会把别的文件程序写进来。

那么 使用它有什么好处呢?

  • 避免类属性的冲突,世界上这么多java类,总会存在冲突,需要包名标识
  • 避免每次都写冗长的包名。java也可以不通过import 而直接写带包名的类全称直接调用类,比如可以直接写 java.lang.System.in 但是每次都这样写太麻烦,所以,你import java.lang.System后,代码中就可以只写System.in了

直接引入所有的类 import java.*可以么?
历史告诉我们,这样是不行的。因為那些类别是姓 http://java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 先生吧。这样写的话只会将java包下的类声明,而不不会声明子包的任何类。

使用按需导入*的模式,是否会降低效率?
结论:不会降低代码运行效率 但是会影响编译效率,因为本质上,是将你写的代码中的简写换成全称。所以会影响编译的速度

它会产生的问题如下

  1. 编译速度:在一个很大的项目中,它们会极大的影响编译速度,但在小型项目中使用在编译时间上可以忽略不计.
  2. 命名冲突:解决避免命名冲突问题的答案就是使用全名。而按需导入恰恰就是使用导入声明初衷的否定。
  3. 说明问题: 毕竟高级语言的代码是给人看的,按需导入看不出使用到的具体类型。
  4. 无名包问题,如果在编译单元的项部没有包声明,Ja编译器首选会从无名包中搜索一个类型,然后才是按需类型声明。如果有命名冲突就会产生问题。

而php需要require引入方能使用。和namespace、use的机制不一样

PS
程序员有时会导入当前包或java.lang包,这是不需要的,因为当前包的成员本身就在作用域内,而java.lang包是自动导入的。java编译器会忽略这些冗余导入声明(redundant import declarations)。即使像这样

import java.util.ArrayList;

import java.util.*;

多次导入,也可编译通过。编译器会将冗余导入声明忽略.

猜你喜欢

转载自blog.csdn.net/S_ZaiJiangHu/article/details/131501603