以及下面两个代码之间有什么不同:
//方法1:
package anyNameOfPackage;
public class Main{
public class Test{
public Test(){ //all stuff }
}
public static void main(String[] args) {
// all stuff
}
}
//方法2:
package anyNameOfPackage;
import otherPackageName.Test;
public class Main{
public static void main(String[] args) {
// all stuff
}
}
是方法2(使用导入)意味着代码是在包anyNameOfPackage 和类Main (如php中的include)之间或类之间创建的主要和方法main()(如方法1)??
我对此导入感到困惑
答案 0 :(得分:2)
这两个指令完全不同。
来自the PHP docs:
include语句包含并评估指定的文件。 [强调我的]
Java中没有这样的机制。 Java的import
指令允许您做的是使类可用于其他类。
也就是说,在Java中,而不是写:
final java.io.File file = ...;
你可以写:
import java.io.File;
// and anywhere in the class:
final File file = ...;
没有"代码评估"在Java;它不是脚本语言。您不能将Java文件包含在另一个Java文件中。
无论如何这都没有意义,因为根据规范,Java中的文件专门为一个类命名,因此在类路径中,类java.io.File
将位于名为java/io/File.class
的文件中(将从名为java/io/File.java
)的源路径中的文件编译。
答案 1 :(得分:0)
PHP包含
php中的include
在功能上等效(基于包含路径)将引用文件的源复制并粘贴到文件中。
<强> something.php 强>
<?php
echo 'hello';
?>
<强> otherthing.php 强>
<?php
include "something.php"
echo ', world!';
?>
otherthing.php的功能与
完全相同<?php
echo 'hello';
echo ', world!';
?>
这意味着包含文件在定义函数,类和变量之外所做的任何事情都将是包含脚本中include
进程的副作用。
Java导入
用于将符号导入当前范围。它不包括整个文件,也没有输出副作用。
import java.util.ArrayList;
// use ArrayList as if it were locally defined instead of typing java.util.ArrayList
答案 2 :(得分:-1)
Java包在Java中提供了名称间隔功能,尽管它们也具有访问语义。因此,package
声明通常类似于PHP的namespace
声明,import
与PHP use
或多或少相同as
(它没有'但是具有use
的所有功能。它与include
没有任何联系。
所以,给定一个Java程序,如:
档案a/b/c/Class1.java
package a.b.c;
class Class1 {}
文件d/e/f/Class2.java
package d.e.f;
import a.b.c.Class1;
class Class2 {
void c2() {
Class1 obj1 = new Class1();
}
}
相当于:
package d.e.f;
class Class2 {
void c2() {
a.b.c.Class1 obj1 = new a.b.c.Class1();
}
}
与以下PHP文件的内容相同:
使用此Class1.php
文件:
<?php
namespace a\b\c;
class Class1 {}
Class2.php
文件:
<?php
namespace d\e\f;
use a\b\c\Class1;
class Class2 {
function c2() {
$obj1 = new Class1();
}
}
相当于:
<?php
namespace d\e\f;
class Class2 {
function c2() {
$obj1 = new \a\b\c\Class1();
}
}
...假设您include
中某处的require
文件有自动加载或Class1.php
/ auto_prepend_file
声明。
如果不是import
中的Class2.java
,编译器会认为Class1
表示d.e.f.Class1
(假定不合格的文件名属于当前包在编译单元的顶部声明)。以同样的方式,在PHP方面,如果use
中没有Class2.php
,则会认为Class1
引用\d\e\f\Class1
。
您可能会说,等效于PHP的include
是在运行javac
命令编译Java代码时将jar文件或类文件放在类路径中。它在上述代码中没有include
或自动加载(明确地或在auto_prepend_file
中)Class1.php
的意义上是等效的,当您尝试使用时,PHP中会出现错误Class2
,如果在编译Class1.class
时没有将Class2.java
文件放在类路径中,则会出于同样的错误。这是因为它正在寻找符合名称\a\b\c\Class1
或a.b.c.Class1
的实际类,但是类实现不可用。
但是include
和classpath可用性不等同,因为你不能在编译期间在Java源代码中包含代码 - 不是通过类路径,也不是导入,也不是任何东西。类路径只是编译器正在查找您正在使用的已编译类的位置,以确保您正确使用它们。您不能在其中放置任何打印或可执行语句。
import
更像是PHP的use
:它允许您使用其他包中的类而不使用其完全限定名称。include
/ require
来完成。 / LI>
include
/ require
可用于运行任意代码。没有与Java相同的内容。