Java 为什么在链接方法时可以省略import语句,但如果单独调用它们,就不能这样做?

Java 为什么在链接方法时可以省略import语句,但如果单独调用它们,就不能这样做?,java,swing,import,awt,Java,Swing,Import,Awt,例如,在这个简单的Java程序中: 如果我写: frame.getContentPane.addbutton 我只需要导入javax.swing.*;代码编译得非常完美 然而,如果我写: Container=frame.getContentPane; 继续添加按钮 我必须同时导入javax.swing.*;并导入java.awt.*;因为不存在“找不到符号”编译器错误 这两种书写方式在技术上不是完全相同吗?为什么这样或那样需要更少或更多的导入语句 当我以第一种方式调用它时,如我的示例所示,即使我

例如,在这个简单的Java程序中:

如果我写: frame.getContentPane.addbutton

我只需要导入javax.swing.*;代码编译得非常完美

然而,如果我写: Container=frame.getContentPane; 继续添加按钮

我必须同时导入javax.swing.*;并导入java.awt.*;因为不存在“找不到符号”编译器错误

这两种书写方式在技术上不是完全相同吗?为什么这样或那样需要更少或更多的导入语句


当我以第一种方式调用它时,如我的示例所示,即使我可能没有使用容器引用变量引用它,getContentPane是否仍然返回容器类型对象?

您正在定义java.awt.Container类型的变量您正在定义java.awt.Container类型的变量,因为容器类在此包中:java.awt.*,然后您的IDE抱怨要求您也导入这些文件。

因为容器类在此包中:java.awt.*,所以您的IDE抱怨要求您也导入这些文件。

来自java语言规范:

导入声明允许引用命名类型或静态成员 使用由单个标识符组成的简单名称§6.2

如果不使用适当的进口声明,参考 要使用另一个包中声明的类型或另一个类型的静态成员 完全限定名称§6.7

因此,需要导入的唯一原因是可以使用缩短的类名。在不使用import java.awt.*的情况下,以下各项应该可以工作:


代码的链接版本隐式使用限定的类名,因此不需要导入语句。

来自Java语言规范:

导入声明允许引用命名类型或静态成员 使用由单个标识符组成的简单名称§6.2

如果不使用适当的进口声明,参考 要使用另一个包中声明的类型或另一个类型的静态成员 完全限定名称§6.7

因此,需要导入的唯一原因是可以使用缩短的类名。在不使用import java.awt.*的情况下,以下各项应该可以工作:


代码的链接版本隐式使用限定的类名,因此不需要import语句。

原因是java的导入与其他语言略有不同

在Java中,在运行时,类路径中的所有类都存在于JVM中

事实上,提供import语句是为了帮助编译器在有许多同名类的情况下识别您所引用的类

那么,为什么在方法链接时不需要它们呢


因为编译器可以很容易地知道特定方法返回的类型,所以永远不会有歧义。

原因是java的导入与其他语言略有不同

在Java中,在运行时,类路径中的所有类都存在于JVM中

事实上,提供import语句是为了帮助编译器在有许多同名类的情况下识别您所引用的类

那么,为什么在方法链接时不需要它们呢

因为编译器可以很容易地知道特定方法返回的类型,所以永远不会有歧义。

当我们编写:

frame.getContentPane().add(button);  
getContentPane在运行时返回一个匿名容器对象,通过该对象调用addbutton方法。如果您碰巧检查了JFrame类,它将如下所示:

import java.awt.Container;
public class JFrame extends SomeClassName {  
    public Container getContentPane() {
        Container cont;
        //Some great code which assigns container with its appropriate value.
        return cont;
    }
} 
当我们写作时:

Container cont = frame.getContentPane();  
cont.add(button);  
我们正在创建一个已知对象,即自己命名它,编译器必须知道类容器属于哪个包。

当我们编写:

frame.getContentPane().add(button);  
getContentPane在运行时返回一个匿名容器对象,通过该对象调用addbutton方法。如果您碰巧检查了JFrame类,它将如下所示:

import java.awt.Container;
public class JFrame extends SomeClassName {  
    public Container getContentPane() {
        Container cont;
        //Some great code which assigns container with its appropriate value.
        return cont;
    }
} 
当我们写作时:

Container cont = frame.getContentPane();  
cont.add(button);  

我们正在创建一个已知对象,即自己命名它,编译器必须知道类容器属于哪个包。

容器是java.awt包中的类,可能JFrame是javax.swing包中的类,它们位于不同的位置。这两种书写方式在技术上不是完全相同吗不,它们是不同的API/包/名称spacesThanks,但是我仍然不清楚。当我以第一种方式调用它时(如我的示例所示),getContentPane是否仍然返回一个容器类型的对象,即使我可能没有使用容器引用变量引用它?啊,很抱歉,这更多地是因为via JFrame导入了容器,以便Java可以找到它,但是如果
u声明变量Java想知道您指的是哪个容器,因此它要确保赋值正确/validContainer是Java.awt包中的类,假设JFrame是javax.swing包中的类,它们位于不同的位置。这两种书写方式在技术上不是完全相同吗不,它们是不同的API/包/名称spacesThanks,但是我仍然不清楚。当我以第一种方式调用它时(如我的示例中所示),getContentPane是否仍然返回容器类型对象,即使我可能没有使用容器引用变量引用它?啊,对不起,这更多地是因为via JFrame导入了容器,以便Java可以找到它,但是,如果您声明变量Java想知道您指的是哪个容器,那么它会确保赋值是正确的/validHanks,但是它仍然没有为我澄清。当我以示例中所示的第一种方式调用它时,getContentPane是否仍然返回容器类型对象,即使我可能没有使用容器引用变量引用它?导入只需要能够编写容器而不是java.awt.Container。如果您使用FQCN,则根本不需要导入。谢谢,但是它仍然无法为我清除它。当我以示例中所示的第一种方式调用它时,getContentPane是否仍然返回容器类型对象,即使我可能没有使用容器引用变量引用它?导入只需要能够编写容器而不是java.awt.Container。如果您使用FQCN,则根本不需要导入。谢谢,但是它仍然无法为我清除它。当我以示例中所示的第一种方式调用它时,getContentPane是否仍然返回容器类型对象,即使我可能没有使用容器引用变量引用它?谢谢,但是它仍然没有为我清除它。当我以示例中所示的第一种方式调用它时,getContentPane是否仍然返回一个容器类型对象,即使我可能没有使用容器引用变量引用它?这将清除它!我只学过C,现在正在学习Java,很高兴了解import语句以及它与Java的区别。非常感谢。这就把它清理干净了!我只学过C,现在正在学习Java,很高兴了解import语句以及它与Java的区别。非常感谢。谢谢!这绝对有助于我理解它。非常感谢!这绝对有助于我理解它。