我知道了
可以用声明声明一个类 修饰符public,在这种情况下 class对所有类都可见 到处。如果一个类没有修饰符 (默认,也称为 package-private),它只是可见的 在自己的包装内。
这是一个明确的陈述。但是这些信息干扰了我对包装进口的理解(这很容易就是错误的)。我认为导入一个包我从导入包中可以看到导入类的类。
那么,它是如何运作的?是否所有类的公共类都可以在条件下导入包含公共类的包?还是没有这样的条件?包私有类怎么样?如果导入包含包,它们是不可见的吗?
增加: 在我看来,我得到了2个被标记为良好(被投票)并且相互矛盾的答案。
答案 0 :(得分:6)
导入类不会以任何方式更改其可见性。将类导入到另一个类或多或少只是一种使源代码可读的方法,因此您不必一直输入完全限定的类。例如这个类
import java.util.*;
class ImportTests {
private Collection collection;
}
编译为此类
的相同代码class ImportTests {
private java.util.Collection collection;
}
第一个类中的import
语句不会更改Collection
或其java.util
包中的任何其他类的可见性,因此只会ImportTests
类可以在没有完全限定名称的情况下引用Collection
。
答案 1 :(得分:0)
您无需导入路径或类以使其可见。
要使类或路径可见,您必须在编译或执行期间在类路径声明中指定。
“import”指令(在C#中使用“using”指令)只会让我们变得懒惰。
如果你有课程
why.does.the.sun.go.on.Shining.java,
rather.be.ahammer.thana.Nail.java,
你总是可以用它们的完整路径引用它们而不导入它们:
public java.util.Hashtable<rather.be.ahammer.thana.Nail> bornFree(
java.lang.String shiningKey,
why.does.the.sun.go.on.Shining shiningPath){
rather.be.ahammer.thana.Nail nailed =
new rather.be.ahammer.thana.Nail(shiningPath);
java.util.Hashtable<rather.be.ahammer.thana.Nail> nailedHash =
new java.util.Hashtable<rather.be.ahammer.thana.Nail>();
nailedHash.put(shiningKey, nailed);
return nailedHash;
}
然而,懒惰是创造力的美德,我宁愿做
import java.util.Hashtable;
import why.does.the.sun.go.on.Shining.java;
import rather.be.ahammer.thana.Nail.java;
public Hashtable<Nail> bornFree(
String shiningKey,
Shining shiningPath){
Nail nailed =
new Nail(shiningPath);
HashTable<Nail> nailedHash =
new Hashtable<Nail>();
nailedHash.put(shiningKey, nailed);
return nailedHash;
}
其中,你可能已经意识到了。
如果有两个同名但名称不同的类,编译器会使用它们吗?
import java.util.Date;
import java.sql.Date;
编译器会抱怨错误消息 - 日期冲突类 而你将无法成功编译。
所以你必须导入其中一个并使用另一个完整路径。
在C#中我们可以导入
using Dayhawk = hello.day.Hawk;
using Nitehawk = hello.nite.Hawk;
这样我们就可以了,
DayHawk dhawk = new DayHawk(new NiteHawk());
然而,无论是一如既往,java独裁者要么害羞/自豪地允许自己允许java模仿微软,要么微软拥有这种导入形式的专利。
如果我们有一个班级
atlantic.salmon.are.trouts.String.java
然后你做了导入
import atlantic.salmon.are.trouts.String;
当你宣布
时String salmon = new String();
将使用哪个String? java.lang.String或atlantic.salmon.are.trouts.String?
编译器会选择并遵守import语句并使用atlantic.salmon.are.trouts.String。
私有,受保护,公开可见性修饰符和默认可见性不应与import指令混淆。除了使用相同的语言外无所事事。
导入指令根本不会改变这些行为。
答案 2 :(得分:0)
我有两个包A和C. A中有一个名为Random的类。我的代码编写得很好,随机来自A而不是来自java.util。 java.util导入在eclipse中给我一个警告,导致未使用导入。
package C;
import A.Random;
import java.util.*;
public class C
{
public static void main(String[] args)
{
Random b = new Random();
}
}
这是隐藏类的另一个例子。
package C;
import java.util.*;
public class C
{
public static void main(String[] args)
{
Random b = new Random();
System.out.println(b.nextDouble());
}
}
这是我的随机课。
package C;
import java.util.Scanner;
public class Random
{
private static final long serialVersionUID = 2632389638401709212L;
Scanner s;
public Random()
{
super();
s = new Scanner(System.in);
}
public double nextDouble()
{
System.out.println("Enter your own random number");
return Double.parseDouble(s.nextLine());
}
}
当我运行C main方法时,我得到了......
Enter your own random number
1
1.0
答案 3 :(得分:-1)
如果您要使用class A
中的class B
,并且class B
<{1>} ,必须导入class A
,即使class B
为class B
。
如果不需要导入公共类,则无法声明两个具有相同名称的类。