提交 5db72dc8 编写于 作者: W wizardforcel

2020-06-25 15:09:50

上级 23490deb
......@@ -20,7 +20,7 @@
## 创建一个包
现在,我们将为我们的 Java 项目创建一个程序包。 **包**用于避免*命名冲突*,以便*控制访问*(访问修饰符)和*捆绑相关类型*的组。
现在,我们将为我们的 Java 项目创建一个包。 **包**用于避免*命名冲突*,以便*控制访问*(访问修饰符)和*捆绑相关类型*的组。
要创建包,请在 Java 项目(`JBTProject`)中选择`src`文件夹,右键单击该文件夹并选择“**新建 -> 包**”。
......
......@@ -4,7 +4,7 @@
嗨呀大家! 是时候喝杯 Java 了,我是说咖啡😉
事不宜迟,让我们开始使用 WebDriver 中的第一个测试脚本。 在我们根据[上一篇文章](https://javabeginnerstutorial.com/selenium/9b-webdriver-eclipse-setup/)(添加了 WebDriver JAR 文件)创建的同一项目下,我创建了一个名为`com.blog.tests`的新程序包。
事不宜迟,让我们开始使用 WebDriver 中的第一个测试脚本。 在我们根据[上一篇文章](https://javabeginnerstutorial.com/selenium/9b-webdriver-eclipse-setup/)(添加了 WebDriver JAR 文件)创建的同一项目下,我创建了一个名为`com.blog.tests`的新包。
接下来,右键单击“包 -> 新建 -> 类”。
......@@ -77,7 +77,7 @@ Selenium 3 Beta 版本不像 Selenium 2 版本那样支持直接启动 Firefox
#### 2.接下来,为了实例化 Firefox 浏览器,我们将必须导入两个包。
键入“`WebDriver driver = new FirefoxDriver();`”后,在“`WebDriver`”和“`FirefoxDriver()`”下方会出现一条波浪线。 悬停时,蚀将建议所有可能的快速修复。 单击建议导入相应程序包的第一个修复程序。
键入“`WebDriver driver = new FirefoxDriver();`”后,在“`WebDriver`”和“`FirefoxDriver()`”下方会出现一条波浪线。 悬停时,蚀将建议所有可能的快速修复。 单击建议导入相应包的第一个修复程序。
![test script - import packages](img/2a99d6b6cbb982884a90b4dbcb9b30ff.png)
......
......@@ -74,7 +74,7 @@ System.setProperty("webdriver.ie.driver", "browser-drivers\\IEDriverServer.exe")
WebDriver driver = new InternetExplorerDriver();
```
键入此语句后,“`WebDriver`”和“`InternetExplorerDriver()`”下方会出现一条波浪线。 悬停时,日食将建议所有可能的快速修复。 单击建议导入相应程序包的第一个修复程序。
键入此语句后,“`WebDriver`”和“`InternetExplorerDriver()`”下方会出现一条波浪线。 悬停时,Eclipse将建议所有可能的快速修复。 单击建议导入相应包的第一个修复程序。
```java
import org.openqa.selenium.WebDriver;
......
......@@ -6,13 +6,13 @@
您准备好将帽子戴上戒指了吗? 如果是,那就开始吧!
展望未来,我们所有的测试都将使用 JUnit 框架。 因此,是时候通过右键单击“项目->新建->程序包”(已设置 Selenium 和 junit)创建新程序包了。 我已将程序包命名为“`com.blog.junitTests`”。
展望未来,我们所有的测试都将使用 JUnit 框架。 因此,是时候通过右键单击“项目->新建->包”(已设置 Selenium 和 junit)创建新包了。 我已将包命名为“`com.blog.junitTests`”。
我们的下一步是创建一个类。 右键单击“新创建的包 -> 新建 -> 类”。 给它起一个名字“`FirstJunitTest.java`”,然后单击“完成”。 您的 IDE 现在看起来应该与此类似,
![JUnit implementation](img/ac2ffc78ad525227b36a8a3fa84ed450.png)
现在我们已经准备好上课的文件了,让我们采用与“[**第一个测试脚本 – 通过启动 Firefox**](https://javabeginnerstutorial.com/selenium/9c-webdriver-first-test-script-firefox/)”帖子中相同的方案。
现在我们已经准备好教程的文件了,让我们采用与“[**第一个测试脚本 – 通过启动 Firefox**](https://javabeginnerstutorial.com/selenium/9c-webdriver-first-test-script-firefox/)”帖子中相同的方案。
1. 打开 Firefox 浏览器。
2. 导航到“<https://www.google.com/>
......@@ -79,7 +79,7 @@ public class FirstJunitTest {
如果将此代码与实现 JUnit 之前的代码进行比较,将会有明显的变化,
1.`@Before``@Test``@After`
1.`@Before``@Test``@After`
2. 方法:`setUp()``testPageTitle()``tearDown()`
3. 类开头的私有变量声明
4. 在新创建的方法下,将相同的代码分为几部分
......@@ -90,15 +90,15 @@ public class FirstJunitTest {
**`@Test`** – 被当作测试方法运行。
**`@Before`** – 在指定的每种测试方法之前运行。 这用于各种目的。 读取或分配数据,初始化或如果多个测试需要先创建相似的对象才能执行,则最好在之前注释的方法下进行指定。
**`@Before`** – 在指定的每种测试方法之前运行。 这用于各种目的。 读取或分配数据,初始化或如果多个测试需要先创建相似的对象才能执行,则最好在`@Before`注解的方法下进行指定。
**`@After`** – 在执行每种测试方法之后运行。 通常,会指定与环境清理相关的命令,例如,关闭打开的资源/数据库连接,删除临时数据,释放内存等。即使`@Before``@Test`方法引发异常,也可以保证运行带`after`注解的方法。
键入这些注释,在它们下方会出现一条弯曲的线。 悬停时,日食将建议所有可能的快速修复。 单击建议导入`org.junit`程序包的第一个修复程序。
键入这些注解,在它们下方会出现一条弯曲的线。 悬停时,Eclipse将建议所有可能的快速修复。 单击建议导入`org.junit`包的第一个修复程序。
![JUnit import packages](img/ce8da4202841e9f631539ef66816bcfb.png)
在这三个注下的**方法***公开的*,返回类型为`void`。 在`junit.framework.TestCase`类下,我们有`setUp()``tearDown()`方法。 最佳实践是覆盖这些方法,以分别编写初始化代码和清除代码。 这不仅可以防止内存泄漏,还可以使代码更易于阅读。 JUnit 首先调用`setUp()`方法,然后调用`test`方法,最后调用`tearDown()`方法。 对于附加到`@Test`的每个测试方法,都会发生这种情况。
在这三个注下的**方法***公开的*,返回类型为`void`。 在`junit.framework.TestCase`类下,我们有`setUp()``tearDown()`方法。 最佳实践是覆盖这些方法,以分别编写初始化代码和清除代码。 这不仅可以防止内存泄漏,还可以使代码更易于阅读。 JUnit 首先调用`setUp()`方法,然后调用`test`方法,最后调用`tearDown()`方法。 对于附加到`@Test`的每个测试方法,都会发生这种情况。
#### 要运行测试
......@@ -114,7 +114,7 @@ public class FirstJunitTest {
![JUnit4 test error](img/088bcc21e786b7be7f5496d288cdea44.png)
我们到了这篇文章的结尾。 现在轮到您尝试一些实现 JUnit 框架的方案,并在注释部分大声疾呼,以防您遇到问题或得到澄清。
我们到了这篇文章的结尾。 现在轮到您尝试一些实现 JUnit 框架的方案,并在评论部分留言,以防您遇到问题或得到澄清。
在另一个帖子中再见! 祝你今天愉快!
......@@ -14,7 +14,7 @@
**注意:**
*如果到目前为止,您从未接触过 XPath,请在继续进行操作之前先了解 XPath 术语。 特别是,节点和这些节点之间的关系即父母,子女,兄弟姐妹,祖先,后代。*
*如果到目前为止,您从未接触过 XPath,请在继续进行操作之前先了解 XPath 术语。 特别是,节点和这些节点之间的关系即父级,子级,同级,祖先,后代。*
如果您已经知道这些术语,并且希望略微刷一下,请参考下图。 礼貌: [w3schools](https://www.w3schools.com/xml/dom_intro.asp)
......
......@@ -83,8 +83,8 @@ XPath 轴定义在当前节点浏览 DOM 的树形结构时要考虑的相对于
| **轴名称** | **结果** |
| --- | --- |
| 祖先 | 选择当前节点的所有祖先(父,祖父等) |
| 祖先或自己 | 选择当前节点的所有祖先(父,祖父等)和当前节点本身 |
| 祖先 | 选择当前节点的所有祖先(父,祖父等) |
| 祖先或自己 | 选择当前节点的所有祖先(父,祖父等)和当前节点本身 |
| 属性 | 选择当前节点的所有属性 |
| 子项 | 选择当前节点的所有子节点 |
| 后代 | 选择当前节点的所有后代(子代,孙代等) |
......@@ -125,7 +125,7 @@ driver.findElement(By.xpath("//i[@class='fb_logo']/parent::a"));
### 3b. 祖先轴
选择当前节点的所有祖先(父代,祖父等)。
选择当前节点的所有祖先(父代,祖父等)。
**示例**:让我们在“Facebook 注册”页面上找到文字“生日”。
......
......@@ -31,8 +31,8 @@ Java 中的类只能使用`public`和默认访问修饰符。
| **可见性** | **公开访问修饰符** | **默认访问修饰符** |
| --- | --- | --- |
| **位于同一程序包中** | Yes | Yes |
| **来自同一个程序包** | Yes | NO |
| **位于同一包中** | Yes | Yes |
| **来自同一个包** | Yes | NO |
## 实例和静态变量的访问修饰符
......@@ -74,7 +74,7 @@ Java 中的类只能使用`public`和默认访问修饰符。
| **在同一个类中** | Yes | Yes | Yes | Yes |
| **来自同一包装中的任何类** | Yes | No | Yes | Yes |
| **来自同一包中的任何子类** | Yes | No | Yes | Yes |
| **来自不同程序包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包装中的任何非子类** | Yes | No | No | No |
## 方法的访问修饰符
......@@ -106,7 +106,7 @@ Java 中的类只能使用`public`和默认访问修饰符。
| **相同类中** | Yes | Yes | Yes | Yes |
| **来自同一包中的任何类** | Yes | No | Yes | Yes |
| **来自同一包中的任何子类** | Yes | No | Yes | Yes |
| **来自不同程序包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包装中的任何非子类** | Yes | No | No | No |
## 局部变量的访问修饰符
......@@ -193,7 +193,7 @@ class SecondClass extends FirstClass {
* 其他成员甚至可以从其他包中访问公开成员。
* 只能通过同一类中的代码访问私有成员。
* 默认成员对包外部的子类不可见。
* 即使在不同的程序包中,受保护的成员也可以被子类看到。
* 即使在不同的包中,受保护的成员也可以被子类看到。
* *受保护**默认*之间的不同之处在于,默认仅在包之外的子类的情况下才会显示。
* 局部变量*不能*具有*访问修饰符*
* 局部变量只能具有可以应用的最终非访问修饰符。
......
......@@ -212,7 +212,7 @@ public class PopupBoxes {
Alert alertPopUp = driver.switchTo().alert();
```
该包指定了`Alert`界面,该界面用于处理基于 Web 的弹出框。
该包指定了`Alert`接口,该界面用于处理基于 Web 的弹出框。
`alertPopUp`”是为引用显示的弹出窗口而创建的新实例变量。
......
......@@ -48,7 +48,7 @@
参数:
`Modifier_key` - 可以是`Keys.SHIFT``Keys.ALT``Keys.CONTROL`。 如果提供的密钥都不是,则抛出`IllegalArgumentException`
`Modifier_key` - 可以是`Keys.SHIFT``Keys.ALT``Keys.CONTROL`。 如果提供的按键都不是,则抛出`IllegalArgumentException`
说明:执行修改键,但不释放键。 随后的交互可以假定按键被按下。 请注意,修饰键永远不会隐式释放-必须调用`keyUp(theKey)``sendKeys(Keys.NULL)`才能释放修饰键。
......
......@@ -4,7 +4,7 @@
嗨冠军! 现在我们已经有了 [PDF 格式](https://javabeginnerstutorial.com/selenium/10e-advanced-webdriver-generating-pdf-report/)的 JUnit 报告,让我们将其附加到电子邮件中并发送给各个项目利益相关者。 因此,今天我们主要将仅使用 Java。 大家都来一杯咖啡(Java)!
我们将研究两个课程
我们将研究两个
1. `SendMail.java` – 此类包含用于发送电子邮件的所有代码。
2. `InvokeMail.java` – 通过提供从地址到地址,主题行和一些文本来调用`SendMail.java`
......
......@@ -22,7 +22,7 @@
现在是时候从测试用例中提取所有这些硬编码的值了。
在“`config.properties`”文件中,将所有必需的属性作为键值对。 这将帮助我们在测试用例中引用每个属性及其密钥,该属性将在一分钟内演示。 可以在这个特定文件中对值进行任何更改,并且这些更改将神奇地反映在进行引用的所有测试用例中。
在“`config.properties`”文件中,将所有必需的属性作为键值对。 这将帮助我们在测试用例中引用每个属性及其,该属性将在一分钟内演示。 可以在这个特定文件中对值进行任何更改,并且这些更改将神奇地反映在进行引用的所有测试用例中。
![property file](img/30192b906e750b66936d351b54584625.png)
......@@ -44,7 +44,7 @@
`props.load(fis);` - 使用打开的连接“`fis`”从输入字节流中读取所有属性。
`props.getProperty("baseURL");` – 要获取特定属性的值,请使用“`getProperty`”方法。 将在双引号中提及相应的键作为 `getProperty()`方法的参数。 它使用属性列表中的指定键搜索属性。 如果找不到密钥,则返回`null`
`props.getProperty("baseURL");` – 要获取特定属性的值,请使用“`getProperty`”方法。 将在双引号中提及相应的键作为 `getProperty()`方法的参数。 它使用属性列表中的指定键搜索属性。 如果找不到,则返回`null`
## 概览
......
......@@ -142,7 +142,7 @@ public class ReadExcelData {
![excel console output](img/afeb40dbbf98d4b1f60208d231d21f9c.png)
如果您想检索代码段,请在注释部分大声疾呼
如果您想检索代码段,请在评论部分留言
1. 给定条目的从零开始的行和列索引
2. 使用给定的从零开始的行和列索引的值
......
......@@ -18,7 +18,7 @@
## 什么是 Log4j
1. 1996 年开发的基于 Java 的流行日志记录程序
1. 1996 年开发的基于 Java 的流行日志记录包
2. 根据 Apache Software License 分发,因此它是开源的
3. 具有各种级别的日志记录 – 允许我们控制日志输出的数量
4. 一切都可以通过编辑简单的配置文件来控制-无需理会应用二进制文件
......@@ -96,7 +96,7 @@
![Log4j.properties file creation](img/e27b7184646bb1e673729341bb77e0f8.png)
我现在已经忽略了三个额外的程序包,因为我出于编码目的创建了它们。
我现在已经忽略了三个额外的包,因为我出于编码目的创建了它们。
**日志文件**
......
......@@ -164,7 +164,7 @@ public class Log4jTest {
}
```
`import org.apache.log4j.Logger;` – 记录程序包已导入。
`import org.apache.log4j.Logger;` – 记录包已导入。
`log = Logger.getLogger("SeleniumTestLogger");` – 创建一个名为的实例,记录`Logger`类并传递“`SeleniumTestLogger`”作为参数。
......
......@@ -113,6 +113,6 @@ new Vue({
该代码一如既往在 [GitHub 仓库](https://github.com/JBTAdmin/vuejs)中可用。
试一试,并注意 Vue 如何根据输入类型是否为文本字段,复选框,单选按钮,选择,多选,文本区域元素等来正确更新元素……它看起来和听起来很神奇,因为你需要用于完成这项艰巨的的所有语法,都是一个简单的指令`v-model`。 如果遇到任何问题,请随时在评论部分大声疾呼
试一试,并注意 Vue 如何根据输入类型是否为文本字段,复选框,单选按钮,选择,多选,文本区域元素等来正确更新元素……它看起来和听起来很神奇,因为你需要用于完成这项艰巨的的所有语法,都是一个简单的指令`v-model`。 如果遇到任何问题,请随时在评论部分留言
祝您有美好的一天!
......@@ -359,6 +359,6 @@ new Vue({
与往常一样,可以在 [GitHub 仓库](https://github.com/JBTAdmin/vuejs)中找到整个代码,以方便参考。 随意拨叉并编写代码以符合您的内心需求。
现在是时候在您自己的示例中练习其中的一些表单输入,如果您有任何疑问,请在注释部分大声疾呼
现在是时候在您自己的示例中练习其中的一些表单输入,如果您有任何疑问,请在评论部分留言
祝你今天愉快!
......@@ -102,7 +102,7 @@ Type "help", "copyright", "credits" or "license" for more information.
某些模块可通过 [PyPI](https://pypi.python.org) (Python 包索引)使用。
可能您已经听说过`pip`命令。 它是“Python 安装程序包”或“Python 包安装器”或更多程序的缩写。 您也可以使用 on 版本。 您应该关心的主要事情是,使用`pip`可以通过一个命令安装模块及其依赖项。 如果您有更新版本的模块,也可以使用`pip`进行更新。
可能您已经听说过`pip`命令。 它是“Python 安装包”或“Python 包安装器”或更多程序的缩写。 您也可以使用 on 版本。 您应该关心的主要事情是,使用`pip`可以通过一个命令安装模块及其依赖项。 如果您有更新版本的模块,也可以使用`pip`进行更新。
让我们继续并安装`lxml`模块,稍后当我告诉您有关使用 Python 处理 XML 时将需要用到。
......
......@@ -70,7 +70,7 @@ C: \Python and then press Enter. // It is the path of the python directory
## Macintosh 安装
在 Mac 中使用 Python 时,无需安装或配置其他任何东西。 但是在安装 Python 之前,您需要先安装 GCC。 可以通过下载 XCode,命令行工具或 OSX GCC 安装程序包来获得 GCC。 但是,如果您已安装 XCode,则无需安装 OSX-GCC 安装程序,因为它可能会引起问题。 在执行 XCode 的全新安装时,您需要通过在终端上运行`xcode-select –install`来添加命令行工具。 由于 OS X 由大量 UNIX 工具组成,因此熟悉 Linux 系统的人会注意到缺少一个像样的包管理器的关键组件,因此 Homebrew 将填补这一空白。
在 Mac 中使用 Python 时,无需安装或配置其他任何东西。 但是在安装 Python 之前,您需要先安装 GCC。 可以通过下载 XCode,命令行工具或 OSX GCC 安装包来获得 GCC。 但是,如果您已安装 XCode,则无需安装 OSX-GCC 安装程序,因为它可能会引起问题。 在执行 XCode 的全新安装时,您需要通过在终端上运行`xcode-select –install`来添加命令行工具。 由于 OS X 由大量 UNIX 工具组成,因此熟悉 Linux 系统的人会注意到缺少一个像样的包管理器的关键组件,因此 Homebrew 将填补这一空白。
现在要安装 Homebrew,请打开终端或 OS X 终端仿真器并运行
......
......@@ -141,7 +141,7 @@ File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
```
如您所见,`remove`函数仅使用一个参数,而不是更多。 即使使用`A.remove((3,4))`,我们也只提供一个元素—元组。 如果要添加多个元素,则会出现`TypeError`。 如果该键不存在于集合中,则在尝试使用`remove`摆脱键时会出现`KeyError`。 但是,如果给定密钥不在集合中,则丢弃不会产生任何噪音。 它默默地发出有关该应用的通知,该应用不知道集合的状态,因此不再打扰。
如您所见,`remove`函数仅使用一个参数,而不是更多。 即使使用`A.remove((3,4))`,我们也只提供一个元素—元组。 如果要添加多个元素,则会出现`TypeError`。 如果该键不存在于集合中,则在尝试使用`remove`摆脱键时会出现`KeyError`。 但是,如果给定不在集合中,则丢弃不会产生任何噪音。 它默默地发出有关该应用的通知,该应用不知道集合的状态,因此不再打扰。
`pop`函数(就像我们已经知道的那样)采用集合中的一个元素,将其删除并返回。 如果集合为空,则将再次收到`KeyError`。 似乎在使用`pop`时总是返回第一个元素,但是您不知道集合中元素的顺序。 实现可能会改变它们存储元素的方式并记住:如果您自己运行应用,则不会看到集合中的元素。
......
......@@ -4,7 +4,7 @@
在上一篇文章中,我们讨论了 [Python 列表](https://javabeginnerstutorial.com/python-tutorial/python-list-2/)。 在这里,我将向您详细介绍 Python 字典。
字典是 Python 中的键值存储。 由于像哈希表这样的实现,并且密钥必须唯一,因此它们使对元素的快速访问成为可能。 键和值之间用冒号(`:`)分隔,整个字典在花括号(`{}`)之间定义。
字典是 Python 中的键值存储。 由于像哈希表这样的实现,并且必须唯一,因此它们使对元素的快速访问成为可能。 键和值之间用冒号(`:`)分隔,整个字典在花括号(`{}`)之间定义。
## 创建字典和访问元素
......@@ -86,7 +86,7 @@ None
要从字典中删除元素,可以使用众所周知的`del`语句,并提供键和字典名称。 自然,如果字典中不存在该键,则将得到一个`KeyError`
`pop`函数将删除具有给定键的元素,并返回与此键关联的值。 如果密钥不存在,您将收到`KeyError`。 要解决此问题,您可以将`pop`函数传递给默认值,当给定键不在字典中时会返回该默认值。
`pop`函数将删除具有给定键的元素,并返回与此键关联的值。 如果不存在,您将收到`KeyError`。 要解决此问题,您可以将`pop`函数传递给默认值,当给定键不在字典中时会返回该默认值。
`popitem`函数从字典中删除一个元素,然后将已删除的(键,值)对作为元组返回。 在这里,您不知道返回哪个元素。 如果字典为空,则您将收到`KeyError`
......
......@@ -126,7 +126,7 @@ class JBTClassClone implements Cloneable {
**关于克隆**的其他说明
* 在这里,我们正在创建现有对象而不是任何新对象的克隆。
* 克隆方法在`Object`类中声明为受保护的。 因此,只能在子类或同一包中对其进行访问。 这就是为什么它在课堂上被覆盖的原因。
* 克隆方法在`Object`类中声明为受保护的。 因此,只能在子类或同一包中对其进行访问。 这就是为什么它在上被覆盖的原因。
* 类需要实现`Cloneable`接口,否则它将引发`CloneNotSupportedException`
## 使用对象反序列化
......
......@@ -10,7 +10,7 @@
与其他编程语言相比,Python 中的类概念被添加了最少的新语法和语义。 Python 中类的概念是 C++ 和 Modula-3 中类的混合。 Python 类提供 OOP 的所有基本功能,例如允许多个基类的类继承,可以覆盖其基类的任何方法的派生类以及可以使用相同名称调用基类的方法的方法。
首先看
首先看看类:
在 Python 中,使用新的语法和语义引入了类。
......
......@@ -214,7 +214,7 @@ def generator_function(collection):
        return
```
如注释中所述,第一种形式逐步遍历可迭代的项目集合,并对每个项目进行某种处理,然后再“屈服”。 虽然不是很令人兴奋,但对于简单的旧迭代当然可以实现,但是它的强大之处在于它可以成为其他生成器链的一部分。 由于每个项目需要更多的处理,生成器很快变得易于维护代码。
如注释中所述,第一种形式逐步遍历可迭代的项目集合,并对每个项目进行某种处理,然后再“`yield`”。 虽然不是很令人兴奋,但对于简单的旧迭代当然可以实现,但是它的强大之处在于它可以成为其他生成器链的一部分。 由于每个项目需要更多的处理,生成器很快变得易于维护代码。
第二种形式是一个示例,可以适用于生成任意长度的值的序列,支持无限序列或无限循环序列等。 例如,该机制在处理数学或科学问题时非常有用。
......
......@@ -55,7 +55,7 @@ Hibernate 具有自己的内部[连接池](https://javabeginnerstutorial.com/hib
**与 POJO 相关的规则**
* POJO 类需要具有默认构造器,这是 Hibernate 所需的。
* 延迟加载不适用于最终课程。 最好具有非最终类。
* 延迟加载不适用于最终。 最好具有非最终类。
**关联类型**
......
......@@ -18,7 +18,7 @@
如果下载并解压缩了包,则可以在`lib`文件夹中看到一些子文件夹。 使用 Hibernate 的任何项目都需要`required`下的所有内容。 其他文件夹包含特殊情况的库。 例如,在`jpa`下,您可以找到提供 JPA 实体管理器支持的库。
另外,您可以设置一个 Maven 项目并将 Hibernate 添加为依赖项。 在这种情况下,您无需担心 Hibernate 的其他必需依赖关系,这些依赖关系在捆绑下载的*必需*程序包中附带。 使用 Maven 更简单明了,因此我将使用 Maven 作为依赖项管理。
另外,您可以设置一个 Maven 项目并将 Hibernate 添加为依赖项。 在这种情况下,您无需担心 Hibernate 的其他必需依赖关系,这些依赖关系在捆绑下载的*必需*包中附带。 使用 Maven 更简单明了,因此我将使用 Maven 作为依赖项管理。
### 一个简单的示例
......@@ -201,7 +201,7 @@ Java 8 by JBT (ISBN:9393939894
Hibernate 提供了一个很好的功能,可以利用 Java 对象和关系数据库之间的映射。 当然,该示例应用并没有显示 Hibernate 的全部功能:为了获得更好的用户体验,您可以添加一个用户界面来在应用中创建和列出书籍。
在下一篇文章中,我将展示如何摆脱 XML 配置(某些开发人员称为“XML 地狱”)并改为使用注。 因此,请继续关注。
在下一篇文章中,我将展示如何摆脱 XML 配置(某些开发人员称为“XML 地狱”)并改为使用注。 因此,请继续关注。
[您可以在此处找到并下载应用的源码](https://github.com/ghajba/hibernate_example/)
......@@ -2,25 +2,25 @@
> 原文: [https://javabeginnerstutorial.com/hibernate/hibernate-4-annotations-configuration/](https://javabeginnerstutorial.com/hibernate/hibernate-4-annotations-configuration/)
在最后的介绍性文章中,我提到了所谓的“XML 地狱”,它是 XML 在 Hibernate 配置中的大量使用。 在本文中,我将介绍基于注释的配置,您可以在其中使用 Hibernate 在实体上的注释来减少所需的 XML 数量。
在最后的介绍性文章中,我提到了所谓的“XML 地狱”,它是 XML 在 Hibernate 配置中的大量使用。 在本文中,我将介绍基于注解的配置,您可以在其中使用 Hibernate 在实体上的注解来减少所需的 XML 数量。
## 为什么注解很好
正如您将在示例代码中看到的那样:使用注,您可以在实体类定义本身中看到属性映射是什么,因此您无需查找正确的`.hbm.xml`文件即可查找映射定义。
正如您将在示例代码中看到的那样:使用注,您可以在实体类定义本身中看到属性映射是什么,因此您无需查找正确的`.hbm.xml`文件即可查找映射定义。
而且有一个很好的副作用:您只需要修改实体。 例如,如果要向`Book`类添加新的`Date`字段,则还需要在`Book.hbm.xml`文件中添加映射。 使用注,这只是 Java 类中的更改。 您将在本文后面的示例中找到有关使用日期的示例。
而且有一个很好的副作用:您只需要修改实体。 例如,如果要向`Book`类添加新的`Date`字段,则还需要在`Book.hbm.xml`文件中添加映射。 使用注,这只是 Java 类中的更改。 您将在本文后面的示例中找到有关使用日期的示例。
### 一个示例
在此示例中,我将继续使用第一篇文章中介绍的`Book`实体。 现在,我将转换 POJO 以使用注解而不是 XML 配置-在本系列的后续部分中,我将继续介绍。 这是因为注比 XML 更易于阅读和查找。
在此示例中,我将继续使用第一篇文章中介绍的`Book`实体。 现在,我将转换 POJO 以使用注解而不是 XML 配置-在本系列的后续部分中,我将继续介绍。 这是因为注比 XML 更易于阅读和查找。
#### 实体
对于实体,我需要添加一些注以表示与 XML 文件中相同的映射。
对于实体,我需要添加一些注以表示与 XML 文件中相同的映射。
第一个是告诉 Hibernate `Book`类是一个实体。 我们可以通过`@Entity`注解来实现。 否则,Hibernate 将在启动时引发异常,并显示错误消息“`hibernate_example.Book`”是未知实体。
下一个是表定义。 我将书添加到`BOOKS`表中。 如果没有明确的表定义,Hibernate 会将实体添加到 `BOOK`表中。 通常,我可以说没有表定义,实体将保存在与实体类相同名称的表中。 要命名表,我必须在课程上使用`@Table`。 该注释具有名为*名称*的参数。 此名称定义表的名称-因此我添加了此属性并将其命名为 `BOOKS`
下一个是表定义。 我将书添加到`BOOKS`表中。 如果没有明确的表定义,Hibernate 会将实体添加到 `BOOK`表中。 通常,我可以说没有表定义,实体将保存在与实体类相同名称的表中。 要命名表,我必须在类上使用`@Table`。 该注解具有名为*名称*的参数。 此名称定义表的名称-因此我添加了此属性并将其命名为 `BOOKS`
最后,我将 ISBN 定义为实体的 **ID**。 这是通过`@ID`注解完成的。
......@@ -102,9 +102,9 @@
## 总结
Hibernate 可以利用一组标准注来消除映射 XML 文件的需要。 通过使用标准`javax.persistence`注解,您可以从 Hibernate 切换到另一个实现标准接口的 ORM 解决方案。
Hibernate 可以利用一组标准注来消除映射 XML 文件的需要。 通过使用标准`javax.persistence`注解,您可以从 Hibernate 切换到另一个实现标准接口的 ORM 解决方案。
但是,如今有些开发人员正在谈论“注释地狱”,因为您几乎可以使用注释配置任何内容,有时这会使应用的可读性变差。
但是,如今有些开发人员正在谈论“注解地狱”,因为您几乎可以使用注解配置任何内容,有时这会使应用的可读性变差。
在下一篇文章中,我将向您展示如何使用 Hibernate 建模实体之间的关系。
......
......@@ -48,7 +48,7 @@
}
```
如您所见,这里有一个新的注`@ManyToMany`。 这告诉 Hibernate `Author`实体映射到其他`Book`实体。 `mappingBy`属性用于告诉 Hibernate 哪个实体是关系的所有者。 这主要用于*一对多**多对一*关系中。
如您所见,这里有一个新的注`@ManyToMany`。 这告诉 Hibernate `Author`实体映射到其他`Book`实体。 `mappingBy`属性用于告诉 Hibernate 哪个实体是关系的所有者。 这主要用于*一对多**多对一*关系中。
## 将作者添加到`Book`实体
......
......@@ -50,7 +50,7 @@
并且没有为抽象类创建用于存储人员的表,因为 Hibernate 知道`AbstractPerson`*实体是*抽象*,因此它不需要任何表来存储信息。
每个类的表继承可以与超类的以下注一起使用:
每个类的表继承可以与超类的以下注一起使用:
```java
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
......
......@@ -12,7 +12,7 @@
我将在本文中的示例中使用本地 H2 数据库,但是,我将向您展示要在 Hibernate 中使用流行的关系数据库时需要更改的内容。
配置上的唯一区别是要使用的 **Hibernate 驱动程序**。 方言是 Hibernate 从其内部关键字(例如,注)到数据库特定命令的映射。
配置上的唯一区别是要使用的 **Hibernate 驱动程序**。 方言是 Hibernate 从其内部关键字(例如,注)到数据库特定命令的映射。
### 在哪里更改
......
......@@ -10,11 +10,11 @@
默认情况下,Hibernate 使用第一级缓存,这意味着它将通过会话将实体存储在应用的内存中(为 Hibernate 分配)。 它是所有实体都必须传递的强制性缓存。 这有两个好处:如果经常访问该实体,则 Hibernate 会记住它;如果您的应用再次需要该实体,则将从会话的缓存中返回它; 第二个好处是,如果您在一个实体上执行多个更新,则 Hibernate 尝试将这些更新分组在一起,并延迟实际的数据库调用以减少 I/O 流量。 如果关闭会话,则存储在第一级缓存中的对象将被销毁并保存或更新到数据库。
您可以使用可选的二级缓存来扩展此缓存。 一级始终是强制性的,始终会首先被咨询。 二级缓存用于跨会话缓存对象。 对于二级缓存,有一些第三方解决方案可以与 Hibernate 一起使用。 Hibernate 提供了`org.hibernate.cache`提供程序必须实现`CacheProvider`接口,以使 Hibernate 处理缓存。
您可以使用可选的二级缓存来扩展此缓存。 一级始终是强制性的,始终会首先被咨询。 二级缓存用于跨会话缓存对象。 对于二级缓存,有一些第三方解决方案可以与 Hibernate 一起使用。 Hibernate 提供了`org.hibernate.cache`供应器必须实现`CacheProvider`接口,以使 Hibernate 处理缓存。
市场上有一些缓存提供程序,但是 Hibernate 希望您为整个应用选择一个提供程序
市场上有一些缓存供应器,但是 Hibernate 希望您为整个应用选择一个供应器
让我提及一些缓存提供程序
让我提及一些缓存供应器
* 高速缓存
* OS 缓存
......@@ -29,9 +29,9 @@
* **只读**此策略应用于永远不会更新的持久对象。 这对于读取和缓存应用配置以及其他静态数据非常有用。 这是具有最佳性能的最简单的策略,因为没有重载可以检查是否在数据库中更新了实体。
* **读写**此策略对由应用更新的实体很有用。 但是,如果数据是通过数据库或其他应用更新的,则 Hibernate 无法判断是否发生了更改,并且您的数据可能已过时。
* **非受限读写**如果应用仅偶尔更新数据并且不需要严格的事务隔离,则此缓存策略可能是合适的。
* **事务性**此缓存策略为完全事务性缓存提供程序(例如 JBoss TreeCache)提供支持。 这样的缓存只能在 JTA 环境中使用,并且必须指定`transaction.manager_lookup_class`
* **事务性**此缓存策略为完全事务性缓存供应器(例如 JBoss TreeCache)提供支持。 这样的缓存只能在 JTA 环境中使用,并且必须指定`transaction.manager_lookup_class`
也不奇怪:EHCache 支持上述所有这四种策略,因此是开始使用二级缓存提供程序的不错选择。
也不奇怪:EHCache 支持上述所有这四种策略,因此是开始使用二级缓存供应器的不错选择。
## 查询缓存
......
......@@ -45,7 +45,7 @@
`REV`字段保存所存储条目的修订号。
如果仅使用`@Audited`释对实体的一个或某些字段进行注释,则`*_AUD`表将包含两个额外的审计字段,即使用`@Audited`注释的字段和实体的 ID。
如果仅使用`@Audited`解对实体的一个或某些字段进行注解,则`*_AUD`表将包含两个额外的审计字段,即使用`@Audited`注解的字段和实体的 ID。
Hibernate 创建了一个称为`REVINFO`的额外表,其中在实体发生更改时`REV`编号与时间戳进行映射。
......
......@@ -59,7 +59,7 @@ Session session = sessionFactory.withOptions().tenantIdentifier( yourTenantIdent
### `MultiTenantConnectionProvider`
要使用两个可用的多租户提供程序之一,我们需要配置`MultiTenantConnectionProvider`。在这种特殊情况下,这意味着我们必须自己实现。
要使用两个可用的多租户供应器之一,我们需要配置`MultiTenantConnectionProvider`。在这种特殊情况下,这意味着我们必须自己实现。
在本文的示例应用中,我添加了接口的最基本的实现。
......
......@@ -10,9 +10,9 @@
## C3P0
就像《星球大战》中的黄金翻译和协议机器人一样,主要使用的连接池提供程序称为 c3p0。
就像《星球大战》中的黄金翻译和协议机器人一样,主要使用的连接池供应器称为 c3p0。
C3P0 是一个开源连接池,它具有一个 Hibernate 程序包,您可以将其添加为项目的依赖项,并准备配置该池:
C3P0 是一个开源连接池,它具有一个 Hibernate 包,您可以将其添加为项目的依赖项,并准备配置该池:
```java
<dependency>
......@@ -42,7 +42,7 @@ c3p0 连接池的最重要的配置属性如下:
<property name="hibernate.c3p0.max_statements">10</property>
```
连接提供程序的第一行是可选的,您不必输入它,Hibernate 会知道您正在使用 C3P0。 这是因为位置(包结构)在 Hibernate 版本之间可能会发生变化,并且每次更新到连接提供程序类位于不同位置的较新版本时,都会遇到麻烦,这很容易让人感到头痛。
连接供应器的第一行是可选的,您不必输入它,Hibernate 会知道您正在使用 C3P0。 这是因为位置(包结构)在 Hibernate 版本之间可能会发生变化,并且每次更新到连接供应器类位于不同位置的较新版本时,都会遇到麻烦,这很容易让人感到头痛。
如果在启动服务器时仔细查看日志或控制台输出,则应该看到正在配置 C3P0:
......@@ -56,7 +56,7 @@ Proxool 是 C3P0 的替代连接池,但是它需要更多配置,因此我个
仅设置依赖项和属性是不够的,您需要一个额外的 XML 文件,其中包含 Proxool 的配置信息。
依赖几乎与 C3P0 相同:
依赖几乎与 C3P0 相同:
```java
<dependency>
......@@ -108,7 +108,7 @@ Proxool 存在一个缺点:您必须定义要使用的方言。 使用 C3P0
## 一般关于配置
Hibernate 使用其魔力来根据您配置的属性来标识要使用的连接池提供程序。 但是,您可以使用`hibernate.connection.provider_class`属性定义连接提供程序
Hibernate 使用其魔力来根据您配置的属性来标识要使用的连接池供应器。 但是,您可以使用`hibernate.connection.provider_class`属性定义连接供应器
如果未配置连接池,则使用默认值。 启动应用时,它在日志或控制台输出中可见:
......@@ -118,7 +118,7 @@ org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderIm
## 总结
有一些连接池提供程序,您可以轻松地将它们与 Hibernate 绑定在一起,从而为您提供良好的数据库连接体验。
有一些连接池供应器,您可以轻松地将它们与 Hibernate 绑定在一起,从而为您提供良好的数据库连接体验。
配置这些提供程序很容易,因为大多数提供程序都可以将其 Hibernate 集成包作为项目的依赖项导入,并使所有程序运行。
配置这些供应器很容易,因为大多数供应器都可以将其 Hibernate 集成包作为项目的依赖项导入,并使所有程序运行。
......@@ -66,7 +66,7 @@ public void setCount(int count)
## 超类字段遮盖
让我们考虑以下课程
让我们考虑以下
```java
public class SuperClass
......
......@@ -40,7 +40,7 @@ Java 中的每个异常都是`Exception`类的子类型,而`Exception`类又
## Java 异常处理
现在我们知道 Java 程序可以在任何时间(或任何位置)发生异常。 因此,我们需要知道如何处理这些异常。 处理异常是开发健壮的应用时必需的属性。 处理异常意味着在发生异常时将程序的执行转移到适当的处理程序。 我们可以使用`try-catch`块来处理异常。
现在我们知道 Java 程序可以在任何时间(或任何位置)发生异常。 因此,我们需要知道如何处理这些异常。 处理异常是开发健壮的应用时必需的属性。 处理异常意味着在发生异常时将程序的执行转移到适当的处理。 我们可以使用`try-catch`块来处理异常。
**`try`**`try`用于定义可能发生异常的代码块。
......
......@@ -9,7 +9,7 @@ Java 继承定义了超类及其子类之间的 is-a 关系。 这意味着只
使用 Java 类继承是不可能的?
1. 超类的私有成员不被子类继承,并且只能间接访问。
2. 由于构造器和初始化程序块不是类的成员,因此它们不会被子类继承。
2. 由于构造器和初始化块不是类的成员,因此它们不会被子类继承。
3. 子类只能扩展一个超类
4. 在超类中具有默认可访问性的成员也不会被其他包中的子类继承,因为这些成员只能通过其与超类在同一包中的子类中的简单名称进行访问。
......
......@@ -2,7 +2,7 @@
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/history-of-java/](https://javabeginnerstutorial.com/core-java-tutorial/history-of-java/)
Java 是一种通用的通用计算机编程语言,它是基于环境的,基于类的,面向对象的,并且经过专门设计以尽可能减少应用依赖。 Java 最初是为交互式电视开发的,但是对于当时的数字有线电视行业来说,它是太先进的技术。 建议让应用开发人员“编写一次,就可以在任何地方运行”,这表明已编译的 Java 代码可以在纵容 Java 的所有平台上运行,而无需重新编译。 Java 应用被编译为可以在任何 Java 虚拟机([JVM](https://javabeginnerstutorial.com/core-java-tutorial/jdk-vs-jre-vs-jvm/))上运行的字节码,而与计算机的架构无关。
Java 是一种通用的通用计算机编程语言,它是基于环境的,基于类的,面向对象的,并且经过专门设计以尽可能减少应用依赖。 Java 最初是为交互式电视开发的,但是对于当时的数字有线电视行业来说,它是太先进的技术。 建议让应用开发人员“编写一次,就可以在任何地方运行”,这表明已编译的 Java 代码可以在纵容 Java 的所有平台上运行,而无需重新编译。 Java 应用被编译为可以在任何 Java 虚拟机([JVM](https://javabeginnerstutorial.com/core-java-tutorial/jdk-vs-jre-vs-jvm/))上运行的字节码,而与计算机的架构无关。
Java 包罗万象,但事实并非如此。 它毫不费力地开始。 这一切始于 1990 年,当时 Sun Microsystems 工程师 Patrick Naughton 对 Sun 的 C++ 和 C API 的情况更加恼火,并有机会作为 The Stealth Project 的一部分来创建替代语言。
......@@ -20,7 +20,7 @@ Java 编程语言是由 James Gosling,Patrick Naughton,Chris Warth,Mike Sh
## Java 版本
自 JDK 1.0 以来,Java 语言经历了各种修改,并且将许多课程和单元包含到标准库中。 从 J2SE 1.4 开始,Java 语言的开发已经由 Java Community Process(JCP)监督,该社区利用 Java Specification Requests(JSR)提出和指定对 Java 程序的扩展和修改。 该语言由 Java 语言规范(JLS)规定; 根据 JSR 901 对 JLS 进行更改。
自 JDK 1.0 以来,Java 语言经历了各种修改,并且将许多和单元包含到标准库中。 从 J2SE 1.4 开始,Java 语言的开发已经由 Java Community Process(JCP)监督,该社区利用 Java Specification Requests(JSR)提出和指定对 Java 程序的扩展和修改。 该语言由 Java 语言规范(JLS)规定; 根据 JSR 901 对 JLS 进行更改。
除了语言的变化之外,Java 类库还进行了许多令人激动的更改,从 JDK 1.0 中的几百个类增加到 J2SE 5 中的三千多个。全新的 API,例如 Swing 和 Java2D 已提出,并且反对了许多原始的 JDK 1.0 类和实践。 某些程序允许将 Java 程序从 Java 平台的一种版本转换为旧版本(例如,将 Java 5.0 反向移植到 1.4)。
......
......@@ -37,7 +37,7 @@ public interface Iterator {
}
```
界面支持 4 种操作:
接口支持 4 种操作:
* `hasNext`:如果当前可迭代对象具有更多要访问的元素,则此方法返回`true`
* `next`:此方法返回当前可迭代对象中的下一个对象。 如果没有更多对象,则将获得`java.util.NoSuchElementException`
......@@ -52,7 +52,7 @@ public interface Iterator {
## 示例
现在是时候使用`Iterator`界面进行一些示例了。 因为我们没有引入其他任何集合,所以我们使用由`java.util.Arrays.asList`创建的列表。
现在是时候使用`Iterator`接口进行一些示例了。 因为我们没有引入其他任何集合,所以我们使用由`java.util.Arrays.asList`创建的列表。
## 迭代
......
......@@ -31,7 +31,7 @@ Java `HashMap`是基于哈希表的`Map`实现。 这就是为什么面试官总
**值**:与指定键关联的值。
首先,`HashMap`将为给定密钥生成一个哈希码,然后检查是否已经有与给定密钥相关联的值。 如果是,则它将返回已经关联的值。 否则,它将通过提供的键在`HashMap`中增加值。
首先,`HashMap`将为给定键生成一个哈希码,然后检查是否已经有与给定键相关联的值。 如果是,则它将返回已经关联的值。 否则,它将通过提供的键在`HashMap`中增加值。
## 重点
......@@ -46,7 +46,7 @@ Java `HashMap`是基于哈希表的`Map`实现。 这就是为什么面试官总
5. 使用“`Collections.synchronizedMap()`”方法使映射同步。
6.`HashMap`类返回的迭代器为“**故障快速**”。
7. `HashMap`由数组(`Key`)和`LinkedList``Value`)支持。
8. `HashMap`使用`hashcode`(使用密钥)来标识应在`HashMap`中放置或检索对象的确切位置。
8. `HashMap`使用`hashcode`(使用)来标识应在`HashMap`中放置或检索对象的确切位置。
9. 最后,`HashCode`返回后备数组中的确切位置(索引)。
10. 支持数组的大小固定。 因此,只要数组已满(此映射中的键数达到其阈值)。 将创建一个具有新容量的新数组,并将所有元素添加到该新数组中。
11. 在两种情况下(添加和检索对象)都将使用`HashCode`,而在任何情况下均可以使用或可以不使用`equals()`方法。
......
......@@ -86,5 +86,5 @@ listA.add(0, "element 0");
## 性能要点
* 列表界面具有搜索对象的方法。 但是不应使用相同的方法,因为它会降低性能,因为在某些实现中它将使用线性搜索。
* 列表接口具有搜索对象的方法。 但是不应使用相同的方法,因为它会降低性能,因为在某些实现中它将使用线性搜索。
* 列表可以包含另一个列表作为元素,但是`HashCode``Equals`不适用于这些列表,因此不应使用相同的列表。
\ No newline at end of file
......@@ -10,7 +10,7 @@
* 映射不能包含重复值。
* 每个键最多可以映射到一个值。
* 该接口替代了`Dictionary`类,后者是一个抽象类,而不是接口。
* `Map`界面允许 3 个集合视图
* `Map`接口允许 3 个集合视图
* 键集
* 值集
* 键值映射集
......@@ -38,7 +38,7 @@
* **`put(K key, V value)`**:使用指定的键将指定的值放入映射中。
* **`putAll(Map<? extends K, ? extends V> m)`**:将所有映射从给定`Map`复制到此`Map`
* **`keySet()`**:返回包含此映射中的密钥的**集**
* **`keySet()`**:返回包含此映射中的**键集**
* **`values()`**:返回一个**集合**,其中包含此`Map`中的所有值。
* **`isEmpty()`**:检查给定`Map`中是否有任何元素。
* **`remove(Object key)`**:从此映射中删除键的映射(如果存在)。
......
......@@ -83,7 +83,7 @@ C:JBT>javac FirstProgramme.java
C:JBT>
```
如果正确编译了 Java 文件,则编译器将为源 Java 创建一个类文件。 它将被保存在与源文件相同的位置。 由于在给定的代码中未声明任何程序包,因此将在相同的文件夹位置中创建`.class`文件。
如果正确编译了 Java 文件,则编译器将为源 Java 创建一个类文件。 它将被保存在与源文件相同的位置。 由于在给定的代码中未声明任何包,因此将在相同的文件夹位置中创建`.class`文件。
注意使用包声明的 Java 文件的区别。 让我们如下创建另一个 Java 文件。
......
......@@ -2,7 +2,7 @@
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/set-collection-tutorial-for-java-beginners/](https://javabeginnerstutorial.com/core-java-tutorial/set-collection-tutorial-for-java-beginners/)
`Set`是 Java 集合框架的一部分。 `Set``java.util`程序包中的一个接口。 它实现了`Collection`接口。
`Set`是 Java 集合框架的一部分。 `Set``java.util`包中的一个接口。 它实现了`Collection`接口。
# 与集有关的要点
......
......@@ -145,5 +145,5 @@ java.io.InvalidClassException: com.jbt.Employee; local class incompatible: strea
## `@SuppressWarnings("serial")`
如果您没有在应该序列化的类中提供`serialVersionId`,则编译器将给出有关该序列的警告消息。 如果要覆盖此警告,则可以使用给定的注。 使用后,编译器将不再报错缺少的`serialVersionUID`
如果您没有在应该序列化的类中提供`serialVersionId`,则编译器将给出有关该序列的警告消息。 如果要覆盖此警告,则可以使用给定的注。 使用后,编译器将不再报错缺少的`serialVersionUID`
......@@ -10,7 +10,7 @@
好吧,您在 Java 代码中使用了枚举。 如果您不这样做,那么您做错了什么,或者拥有非常简单的应用而没有太多复杂功能。
无论如何,让我们看一下基础知识。 例如,您想要一个使用工作日的课程。 您可以这样定义它:
无论如何,让我们看一下基础知识。 例如,您想要一个使用工作日的。 您可以这样定义它:
```java
public class Schedule {
......@@ -225,7 +225,7 @@ public interface DatabaseEnum<T extends Enum<T>> {
该接口使用泛型(由`T`类型表示),并在`String`和枚举类型之间进行转换。
要实现此界面,请扩展“工作日”示例:
要实现此接口,请扩展“工作日”示例:
```java
public enum Workday implements DatabaseEnum<Workday>{
......
......@@ -121,9 +121,9 @@ Thread(String name)
当线程处于可运行状态时,表示已创建线程,但尚未执行该线程的`run`方法,并且该线程正在等待轮到他。 选定线程后,线程的`run`方法将执行,该状态称为运行状态。
**线程调度程序**
**线程调度**
线程调度程序是 JVM 的一部分,它决定在任何给定的时间应该运行哪个线程,并使线程退出运行状态 。 调度程序可以选择任何处于可运行状态的线程作为唯一正在运行的线程。 如果线程不处于可运行状态,则不能将其选择为当前正在运行的线程。 某种可能在某种程度上影响调度程序的方法(**注**:我们无法控制线程调度程序的行为)
线程调度器是 JVM 的一部分,它决定在任何给定的时间应该运行哪个线程,并使线程退出运行状态 。 调度器可以选择任何处于可运行状态的线程作为唯一正在运行的线程。 如果线程不处于可运行状态,则不能将其选择为当前正在运行的线程。 某种可能在某种程度上影响调度器的方法(**注**:我们无法控制线程调度器的行为)
**这些方法来自线程类**
......@@ -157,7 +157,7 @@ Thread(String name)
`sleep()``sleep()`方法是`Thread`类的静态方法。 (它仍然必须乞求成为当前正在运行的线程)。 由于它仅在当前是静态方法,因此运行`Thread`将进入睡眠状态。 语法为:`Thread.sleep()`
**`yield()`**`yield`方法与`Thread`的优先级相关。 这也是一个静态方法,因此它仅适用于当前正在运行的线程。 调度程序确保如果线程进入可运行状态,并且其优先级高于池中的任何线程,并且具有比当前正在运行的线程更高的优先级,则优先级较低的运行线程通常会被撞回可运行状态,然后将选择优先级最高的线程来运行。 在任何给定时间,当前正在运行的线程通常不会具有低于池中任何线程的优先级。 `yield()`应该做的是使当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程轮流使用。
**`yield()`**`yield`方法与`Thread`的优先级相关。 这也是一个静态方法,因此它仅适用于当前正在运行的线程。 调度确保如果线程进入可运行状态,并且其优先级高于池中的任何线程,并且具有比当前正在运行的线程更高的优先级,则优先级较低的运行线程通常会被撞回可运行状态,然后将选择优先级最高的线程来运行。 在任何给定时间,当前正在运行的线程通常不会具有低于池中任何线程的优先级。 `yield()`应该做的是使当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程轮流使用。
**`Join()`**`Join`是一种非静态方法。 它使一个线程“连接到另一线程的末端”。 如果将线程 B 连接线程 A,则直到线程 A 完成,线程 B 才会启动。
......
......@@ -62,7 +62,7 @@ x -> x * x;
## 函数式接口
Lambda 表达式可用于实现所谓的**函数式接口**的方法。 较新的接口可以带有注`@FunctionalInterface`,以指示此接口是函数式接口-但是,每个接口都可以视为仅具有**一个抽象方法**的函数式接口。因此,即使接口没有被非正式地标记为`FunctionalInterface`,也可以使用 lambda 表达式替换/实现`ActionListener``addActionListener`
Lambda 表达式可用于实现所谓的**函数式接口**的方法。 较新的接口可以带有注`@FunctionalInterface`,以指示此接口是函数式接口-但是,每个接口都可以视为仅具有**一个抽象方法**的函数式接口。因此,即使接口没有被非正式地标记为`FunctionalInterface`,也可以使用 lambda 表达式替换/实现`ActionListener``addActionListener`
默认方法不具有抽象性,因为它们具有实现。 如果接口在不提供实现的情况下覆盖了`java.lang.Object`的方法,则该实现也不会被视为抽象,因为该实现将继承`java.lang.Object`类的实现。 让我们来看一个示例:
......@@ -94,7 +94,7 @@ public interface ExampleFunctionalInterface {
}
```
即使我们不添加注,上面的接口也是一个函数式接口。 现在,我们创建一个 lambda 并使用它。 请记住,我们的 lambda 必须仅实现`getName()`函数,该函数不需要任何参数并返回`String`
即使我们不添加注,上面的接口也是一个函数式接口。 现在,我们创建一个 lambda 并使用它。 请记住,我们的 lambda 必须仅实现`getName()`函数,该函数不需要任何参数并返回`String`
```java
final ExampleFunctionalInterface example = () -> "GHajba"; // implements the getName() function
......
......@@ -13,7 +13,7 @@
[访问修饰符](https://javabeginnerstutorial.com/core-java-tutorial/access-modifier-in-java/ "Access Modifier in Java"):定义 Java 世界中谁可以访问该类以及该类的成员。
**`CLASS_NAME`**:特定程序包中类的唯一名称。
**`CLASS_NAME`**:特定包中类的唯一名称。
**`SUPER_CLASS_NAME`**:给定类扩展的类的名称。 (为此使用 `extends`关键字)
......@@ -77,7 +77,7 @@ class AnotherClass {
* 每个源代码文件只能有一个公开类,但可以有多个非公开类。
* 如果源代码文件中存在任何公开类,则文件名应为该类的名称。
* 源代码文件中的语句序列应为程序包 >> `import` >> 类声明。
* 源代码文件中的语句序列应为包 >> `import` >> 类声明。
* 没有序列规则适用于注释。
* 注释可以在源代码文件的任何部分的任何位置。
* 没有公开类的文件可以具有该类的任何名称。
......@@ -117,7 +117,7 @@ public class HelloWorld {
HelloWorld obj = new HelloWorld();
```
## 如何访问班级成员
## 如何访问成员
`ClassObjectReference.member`)。 您将通过命名对象,后跟句点(`.`),后跟方法的名称及其参数列表来调用对象的方法。
......
......@@ -31,7 +31,7 @@ Selenium 将我们带到了新的地方,现在是时候让我们进一步了
* 由于它是 Firefox 插件,因此不支持 Mozilla Firefox 以外的任何浏览器。
* 它没有明确提供支持警报,弹出窗口和导航的帮助。
* 它不支持听众
* 它不支持监听器
* 不支持错误处理和数据库测试。
* 它不能用于测试 iPhone 和 Android 应用。
* 不支持从外部文件读取和上传文件。
......
......@@ -96,7 +96,7 @@
![File logging destination file](img/65829cdb618d402f6b029d3421df816a.png)
希望这两个插件能为您提供总体上如何根据需要和便利来下载,安装和使用 Selenium IDE 插件的总体情况。 这些特殊功能在您遇到困难时确实可以派上用场! 因此,如果您有任何疑问,请务必在评论部分中发掘并大声疾呼
希望这两个插件能为您提供总体上如何根据需要和便利来下载,安装和使用 Selenium IDE 插件的总体情况。 这些特殊功能在您遇到困难时确实可以派上用场! 因此,如果您有任何疑问,请务必在评论部分中发掘并留言
在另一篇文章中再见。 祝你有美好的一天!
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册