导入包是否会改变类的可见性?

时间:2010-03-07 21:33:28

标签: java import package private

我知道了

  

可以用声明声明一个类   修饰符public,在这种情况下   class对所有类都可见   到处。如果一个类没有修饰符   (默认,也称为   package-private),它只是可见的   在自己的包装内。

这是一个明确的陈述。但是这些信息干扰了我对包装进口的理解(这很容易就是错误的)。我认为导入一个包我从导入包中可以看到导入类的类。

那么,它是如何运作的?是否所有类的公共类都可以在条件下导入包含公共类的包?还是没有这样的条件?包私有类怎么样?如果导入包含包,它们是不可见的吗?

增加: 在我看来,我得到了2个被标记为良好(被投票)并且相互矛盾的答案。

4 个答案:

答案 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;
}

其中,你可能已经意识到了。

1 - 问题是,

如果有两个同名但名称不同的类,编译器会使用它们吗?

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模仿微软,要么微软拥有这种导入形式的专利。

2 - 第二个问题是,

如果我们有一个班级

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。

3 - 第三个问题,

私有,受保护,公开可见性修饰符和默认可见性不应与import指令混淆。除了使用相同的语言外无所事事。

  • 私人参考仅可见 在同一个文件中。
  • 受保护的引用仅可见 在相同的命名空间包或 通过扩展类。
  • 所有人都可以看到公开引用。
  • 未声明,即默认参考 只在同一个内部可见 命名空间包。

导入指令根本不会改变这些行为。

总之,

  • import指令仅供参考 美德的继承 懒惰。
  • 导入指令不适用于 使类可见或的目的 改变他们的知名度 内容。
  • classpath参数用于制作 整个项目可见的类。
  • 注意其他可以改变行为 Java中的可见性修饰符 汇编

答案 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 Bclass B

如果不需要导入公共类,则无法声明两个具有相同名称的类。