Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么;一揽子计划;关键字和.h?_Java_Header_Package - Fatal编程技术网

Java 为什么;一揽子计划;关键字和.h?

Java 为什么;一揽子计划;关键字和.h?,java,header,package,Java,Header,Package,为什么我应该在Java包中的文件中写“包”的东西?它不是间接地假设,如果它在目录中,那么它在包中 我来自C++世界。我总是从使用该类的其他文件中导入我需要的类的.h(我的意思是,我只想“显示”标题,而不是实现)。但是现在我对Java中的导入有点困惑。这在Java中是如何实现的 1) 包声明必须与项目上的目录层次结构相匹配 如果我使用包com.stackoverflow.bakkal在Car.java中,则需要以下层次结构 com/ |-- stackoverflow/ | `-- bak

为什么我应该在Java包中的文件中写“包”的东西?它不是间接地假设,如果它在目录中,那么它在包中

我来自C++世界。我总是从使用该类的其他文件中导入我需要的类的.h(我的意思是,我只想“显示”标题,而不是实现)。但是现在我对Java中的导入有点困惑。这在Java中是如何实现的

1)
声明必须与项目上的目录层次结构相匹配

如果我使用
包com.stackoverflow.bakkal
Car.java
中,则需要以下层次结构

com/
|-- stackoverflow/
|   `-- bakkal/
|       |-- Car.java
2) 如果要隐藏实现,可以在Java中使用
接口
,而不是
。然后在
.class
文件或JAR中分发实际实现

嗯,但是不能使用接口 实例化

接口在某种程度上像C++中的原型一样工作。你有了合同,那么实际的实施来自其他地方

我想实例化一个类,但是 在没有给出实施方案的情况下, 只有原型


<>这是不可能的,甚至C++,你怎么能在没有实际实现的情况下实例化某个东西呢?在C++中,你仍然需要链接到目标文件。在Java中,您使用
.class
文件。

包不是假定的,因为Java的理念是显式比隐式/假定更好

它确实使您能够访问当前包中的任何内容,但外部的任何内容都需要显式导入。(我认为Java.lang是个例外,因为它包含了很多基本功能,比如字符串,所以没有一个包不使用它)

这也是为什么你倾向于看到:

import java.util.ArrayList;
import java.util.LinkedList;
而不是:

import java.util.*;
这可能看起来很烦人,直到有一天你试图找出别人的代码,它击中你,如果事情被隐藏/暗示,这将是多么困难

如果您使用Eclipse、Netbeans或IntelliJ,您甚至不会注意到这两个特性

首先,如果在键入类名时点击Ctrl空间,它不仅会为您完成类名,而且还会自动将其添加到导入列表中。 第二,如果您遇到导入“错误”的地方,或者您没有使用ctrl-space扩展,您可以键入ctrl-shift-o(eclipse)使其“修复导入”。这将自动导入需要导入的内容,并删除不再需要的导入。根据您的设置,它还将展开或折叠*


一旦你得到一个系统,你甚至不会考虑导入。

包指定了一个类的路径。它必须与磁盘或jar(zip)中的目录匹配。位置相对于类路径上的位置。受保护的访问仅限于同一包中的类

在.h文件中可以执行的某些操作是在类定义中完成的。常量属于一个类,可以公开显示。在a.h中,常数必须公开可见

导入相当于包含a.h,但有助于处理同名定义冲突的问题。一个类中只能包含一个项或所有可见项。也可以跳过导入,并使用包名作为访问对象的类的前缀

通过导入,实现实际上不可见(至少不超过编译类提供的范围)。可见的是可见接口公共方法和数据。对于从相同包导入的方法和数据,没有指定访问权限(public/protected/private)也可见。受保护的方法和变量对类的子类可见。.h文件可以在不提供源文件或对象文件的情况下使用。导入要求提供指定的类。(类可能仅由常量组成,尽管这是一个糟糕的设计。)

  • 不,这不是假设。毕竟,我的包叫什么?com.mypackage.stuff?src.com.mypackage.stuff?myproject.com.mypackage.stuff?C.Users.makakko.workspace.myproject.src.com.mypackage.stuff

    如果您仅以文件夹为基础创建包,那么它是否相对于驱动器根目录?如果项目是在不同机器上的不同驱动器号上开发的?它是否相对于javac.exe的位置?同样,不同的安装目录如何?运行javac时工作目录如何?但您可以指定位置如果你想做一个简单的测试程序,或者教一个从未编程过的Java,你需要使用/解释包结构的整个概念吗

    如果省略了
    说明符,那么您仍然在包中。它只是“默认包”,没有名称

  • >P>头文件是C++中需要编译的一种工件,而不是实现信息隐藏的一种方法。在C语言中,一种方法必须先定义才能被引用。如果你想有几种方法互相引用,那么在使用它们之前,必须先定义所有的方法,然后才是头。r,但是C++中的更改改变了标题的必要性。 在Java中,编译器在执行任何需要方法/类的操作之前,都会查看您的所有方法和类签名。由头提供的函数被放入编译器本身。您不能依赖头来隐藏信息,因为

  • 代码可以放在头文件中

  • 除非使用真正的信息隐藏(如单独的库),否则程序员可以毫无疑问地找到与头匹配的c/cpp文件

  • 类似地,在Java中,您只能获得真实的信息