Java 中文官方教程 2022 版(五)(2)

简介: Java 中文官方教程 2022 版(五)

Java 中文官方教程 2022 版(五)(1)https://developer.aliyun.com/article/1486294

当抽象类实现接口时

接口部分中指出,实现接口的类必须实现所有接口的方法。然而,可以定义一个不实现所有接口方法的类,只要该类声明为abstract。例如,

abstract class X implements Y {
  // implements all but one method of Y
}
class XX extends X {
  // implements the remaining method in Y
}

在这种情况下,类X必须是abstract,因为它没有完全实现Y,但事实上,类XX实现了Y

类成员

一个抽象类可能有static字段和static方法。您可以像使用其他类一样使用这些静态成员,通过类引用(例如,AbstractClass.staticMethod())。

继承摘要

原文:docs.oracle.com/javase/tutorial/java/IandI/summaryinherit.html

除了Object类外,一个类只有一个直接的父类。一个类从所有直接或间接的父类那里继承字段和方法。子类可以重写继承的方法,或者隐藏继承的字段或方法。(请注意,隐藏字段通常是不良的编程实践。)

在覆盖和隐藏方法部分的表格显示了声明具有与超类中方法相同签名的方法的效果。

Object类是类层次结构的顶部。所有类都是从这个类继承的后代,并从中继承方法。从Object继承的有用方法包括toString()equals()clone()getClass()

通过在类的声明中使用final关键字,可以防止类被子类化。同样,通过将方法声明为最终方法,可以防止子类覆盖它。

抽象类只能被子类化;它不能被实例化。抽象类可以包含抽象方法—声明但未实现的方法。然后子类为抽象方法提供实现。

问题和练习:继承

原文:docs.oracle.com/javase/tutorial/java/IandI/QandE/inherit-questions.html

问题

1. 考虑以下两个类:

public class ClassA {
    public void methodOne(int i) {
    }
    public void methodTwo(int i) {
    }
    public static void methodThree(int i) {
    }
    public static void methodFour(int i) {
    }
}
public class ClassB extends ClassA {
    public static void methodOne(int i) {
    }
    public void methodTwo(int i) {
    }
    public void methodThree(int i) {
    }
    public static void methodFour(int i) {
    }
}

a. 哪个方法覆盖了超类中的方法?

b. 哪个方法隐藏了超类中的方法?

c. 其他方法做什么?

2. 考虑你在问题和练习:类中编写的CardDeckDisplayDeck类。每个类应该覆盖哪些Object方法?

练习

1. 编写你在问题 2 中回答的方法的实现。

检查你的答案。

课程:数字和字符串

原文:docs.oracle.com/javase/tutorial/java/data/index.html

数字

这一部分从讨论Number类(位于java.lang包中)及其子类开始。特别是,本节讨论了在何种情况下您会使用这些类的实例化而不是原始数据类型。此外,本节还讨论了您可能需要与数字一起工作的其他类,例如格式化或使用数学函数来补充语言内置的运算符。最后,还讨论了自动装箱和拆箱,这是一种简化代码的编译器功能。

字符串

字符串在 Java 编程中被广泛使用,它们是字符序列。在 Java 编程语言中,字符串是对象。本节描述了使用String类来创建和操作字符串。它还比较了StringStringBuilder类。

数字

原文:docs.oracle.com/javase/tutorial/java/data/numbers.html

本节开始讨论java.lang包中的Number类,它的子类,以及在何种情况下您会使用这些类的实例化而不是原始数字类型。

本节还介绍了PrintStreamDecimalFormat类,它们提供了用于编写格式化数字输出的方法。

最后,讨论了java.lang中的Math类。它包含了用于补充语言内置运算符的数学函数。该类具有三角函数、指数函数等方法。

数字类

原文:docs.oracle.com/javase/tutorial/java/data/numberclasses.html

在处理数字时,大多数情况下您会在代码中使用原始类型。例如:

int i = 500;
float gpa = 3.65f;
byte mask = 0x7f;

然而,有理由使用对象代替原始类型,并且 Java 平台为每种原始数据类型提供了包装类。这些类将原始类型“包装”在对象中。通常,编译器会执行包装操作—如果您在期望对象的地方使用原始类型,编译器会为您将原始类型装箱到其包装类中。同样,如果您在期望原始类型的地方使用数字对象,编译器会为您拆箱对象。有关更多信息,请参阅自动装箱和拆箱

所有数字包装类都是抽象类Number的子类:


注意: 还有四个Number的子类没有在此处讨论。BigDecimalBigInteger用于高精度计算。AtomicIntegerAtomicLong用于多线程应用程序。


有三个原因可能会使用Number对象而不是原始类型:

  1. 作为期望对象的方法的参数(在操作数字集合时经常使用)。
  2. 要使用类定义的常量,如MIN_VALUEMAX_VALUE,提供数据类型的上限和下限。
  3. 要使用类方法将值转换为其他原始类型,将值转换为字符串,以及在不同数字系统之间进行转换(十进制、八进制、十六进制、二进制)。

以下表格列出了所有Number类的子类实现的实例方法。

所有Number子类实现的方法

方法 描述

| `byte byteValue() short shortValue()

int intValue()

long longValue()

float floatValue()

double doubleValue() | 将此Number`对象的值转换为返回的原始数据类型。 |

| `int compareTo(Byte anotherByte) int compareTo(Double anotherDouble)

int compareTo(Float anotherFloat)

int compareTo(Integer anotherInteger)

int compareTo(Long anotherLong)

int compareTo(Short anotherShort) | 将此Number`对象与参数进行比较。 |

| boolean equals(Object obj) | 确定此数字对象是否等于参数。如果参数不为null且为相同类型且具有相同数值的对象,则方法返回true

对于DoubleFloat对象,还有一些额外的要求,这些要求在 Java API 文档中有描述。 |

每个Number类包含其他方法,用于将数字转换为字符串,以及在不同数字系统之间进行转换。以下表格列出了Integer类中的这些方法。其他Number子类的方法类似:

转换方法,Integer

方法 描述
static Integer decode(String s) 将字符串解码为整数。可以接受十进制、八进制或十六进制数字的字符串表示作为输入。
static int parseInt(String s) 返回一个整数(仅限十进制)。
static int parseInt(String s, int radix) 返回一个整数,给定十进制、二进制、八进制或十六进制(radix分别等于 10、2、8 或 16)数字的字符串表示作为输入。
String toString() 返回表示此Integer值的String对象。
static String toString(int i) 返回表示指定整数的String对象。
static Integer valueOf(int i) 返回一个包含指定原始值的Integer对象。
static Integer valueOf(String s) 返回一个Integer对象,其中包含指定字符串表示形式的值。
static Integer valueOf(String s, int radix) 返回一个Integer对象,其中包含指定字符串表示形式的整数值,使用基数进行解析。例如,如果s = "333"radix = 8,则该方法返回八进制数 333 的十进制整数等价值。

格式化数字打印输出

原文:docs.oracle.com/javase/tutorial/java/data/numberformat.html

之前你看到了使用printprintln方法将字符串打印到标准输出(System.out)的示例。由于所有数字都可以转换为字符串(稍后将会看到),你可以使用这些方法打印任意混合的字符串和数字。然而,Java 编程语言还有其他方法,允许你在包含数字时更好地控制打印输出。

printfformat方法

java.io包中包含一个PrintStream类,其中有两个格式化方法可用于替换printprintln。这些方法,formatprintf,是等效的。你一直在使用的熟悉的System.out恰好是一个PrintStream对象,因此你可以在System.out上调用PrintStream方法。因此,在你以前使用printprintln的代码中,你可以使用formatprintf。例如,

System.out.format(.....);

这两个java.io.PrintStream方法的语法是相同的:

public PrintStream format(String format, Object... args)

其中format是一个指定要使用的格式化的字符串,args是要使用该格式化打印的变量列表。一个简单的示例可能是

System.out.format("The value of " + "the float variable is " +
     "%f, while the value of the " + "integer variable is %d, " +
     "and the string is %s", floatVar, intVar, stringVar); 

第一个参数,format,是一个格式字符串,指定了第二个参数args中的对象如何被格式化。格式字符串包含普通文本以及格式说明符,这些是特殊字符,用于格式化Object... args的参数。(Object... args的表示法称为可变参数,意味着参数的数量可能变化。)

格式说明符以百分号(%)开始,并以转换器结束。转换器是指示要格式化的参数类型的字符。在百分号(%)和转换器之间,你可以有可选的标志和说明符。有许多转换器、标志和说明符,这些都在java.util.Formatter中有文档记录。

这里是一个基本示例:

int i = 461012;
System.out.format("The value of i is: %d%n", i);

%d指定单个变量为十进制整数。%n是一个与平台无关的换行符。输出为:

The value of i is: 461012

printfformat方法是重载的。每个都有以下语法版本:

public PrintStream format(Locale l, String format, Object... args)

例如,要在法国系统中打印数字(在英文浮点数表示中使用逗号代替小数点),你可以使用:

System.out.format(Locale.FRANCE,
    "The value of the float " + "variable is %f, while the " +
    "value of the integer variable " + "is %d, and the string is %s%n", 
    floatVar, intVar, stringVar); 

一个示例

下表列出了在接下来的示例程序TestFormat.java中使用的一些转换器和标志。

TestFormat.java中使用的转换器和标志

转换器 标志 说明
d 十进制整数。
f 一个浮点数。
n 适用于运行应用程序的平台的换行符。应始终使用%n,而不是\n
tB 日期和时间转换—月份的区域设置全名。
td, te 日期和时间转换—月份中的 2 位数字。td 根据需要带有前导零,te 则不带。
ty, tY 日期和时间转换—ty = 2 位年份,tY = 4 位年份。
tl 日期和时间转换—12 小时制钟表中的小时。
tM 日期和时间转换—以 2 位数字表示的分钟,必要时带有前导零。
tp 日期和时间转换—区域设置特定的上午/下午(小写)。
tm 日期和时间转换—月份以 2 位数字表示,必要时带有前导零。
tD 日期和时间转换—日期为 %tm%td%ty
08 宽度为 8 个字符,必要时带有前导零。
+ 包括符号,无论是正数还是负数。
, 包括特定于区域设置的分组字符。
- 左对齐。
.3 小数点后三位。
10.3 宽度为 10 个字符,右对齐,小数点后三位。

以下程序展示了您可以使用format进行的一些格式化。输出在嵌入式注释中用双引号显示:

import java.util.Calendar;
import java.util.Locale;
public class TestFormat {
    public static void main(String[] args) {
      long n = 461012;
      System.out.format("%d%n", n);      //  -->  "461012"
      System.out.format("%08d%n", n);    //  -->  "00461012"
      System.out.format("%+8d%n", n);    //  -->  " +461012"
      System.out.format("%,8d%n", n);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", n); //  -->  "+461,012"
      double pi = Math.PI;
      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"
      System.out.format(Locale.FRANCE,
                        "%-10.4f%n%n", pi); // -->  "3,1416"
      Calendar c = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"
      System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"
      System.out.format("%tD%n", c);    // -->  "05/29/06"
    }
}

注意: 本节讨论仅涵盖了formatprintf方法的基础知识。更详细的信息可以在基础教程的基本 I/O部分的“格式化”页面中找到。

使用String.format创建字符串的方法在字符串中有介绍。


DecimalFormat 类

您可以使用java.text.DecimalFormat类来控制前导和尾随零、前缀和后缀、分组(千位)分隔符以及小数点分隔符的显示。DecimalFormat在数字格式化方面提供了很大的灵活性,但可能会使您的代码变得更加复杂。

接下来的示例创建了一个DecimalFormat对象myFormatter,通过将模式字符串传递给DecimalFormat构造函数来创建。然后通过myFormatter调用从NumberFormat继承的format()方法—它接受一个double值作为参数,并以字符串形式返回格式化的数字:

这是一个演示DecimalFormat使用的示例程序:

import java.text.*;
public class DecimalFormatDemo {
   static public void customFormat(String pattern, double value ) {
      DecimalFormat myFormatter = new DecimalFormat(pattern);
      String output = myFormatter.format(value);
      System.out.println(value + "  " + pattern + "  " + output);
   }
   static public void main(String[] args) {
      customFormat("###,###.###", 123456.789);
      customFormat("###.##", 123456.789);
      customFormat("000000.000", 123.78);
      customFormat("$###,###.###", 12345.67);  
   }
}

输出为:

123456.789  ###,###.###  123,456.789
123456.789  ###.##  123456.79
123.78  000000.000  000123.780
12345.67  $###,###.###  $12,345.67

以下表格解释了每行输出。

DecimalFormat.java 输出

模式 输出 解释
123456.789 ###,###.### 123,456.789 井号(#)表示数字,逗号是分组分隔符的占位符,句点是小数分隔符的占位符。
123456.789 ###.## 123456.79 value小数点右侧有三位数字,但pattern只有两位。format方法通过四舍五入处理这个问题。
123.78 000000.000 000123.780 pattern指定了前导和尾随零,因为使用的是 0 字符而不是井号(#)。
12345.67 $###,###.### $12,345.67 pattern中的第一个字符是美元符号($)。请注意,它紧跟在格式化output中最左边的数字之前。

超出基本算术

原文:docs.oracle.com/javase/tutorial/java/data/beyondmath.html

Java 编程语言支持基本算术运算,使用算术运算符:+,-,*,/和%。java.lang包中的Math类提供了更高级数学计算的方法和常量。

Math类中的方法都是静态的,因此您可以直接从类中调用它们,如下所示:

Math.cos(angle);

注意: 使用static import语言特性,您不必在每个数学函数前面写Math

import static java.lang.Math.*;

这使您可以通过简单名称调用Math类的方法。例如:

cos(angle);

常量和基本方法

Math类包括两个常量:

  • Math.E,即自然对数的底数,以及
  • Math.PI,即圆周与直径的比值。

Math类还包括 40 多个静态方法。以下表格列出了一些基本方法。

基本数学方法

方法 描述

| `double abs(double d) float abs(float f)

int abs(int i)

long abs(long lng) | 返回参数的绝对值。 |

double ceil(double d) 返回大于或等于参数的最小整数。返回为 double 类型。
double floor(double d) 返回小于或等于参数的最大整数。返回为 double 类型。
double rint(double d) 返回与参数最接近的整数值。返回为 double 类型。
long round(double d) int round(float f) 返回最接近参数的 long 或 int,如方法的返回类型所示。

| `double min(double arg1, double arg2) float min(float arg1, float arg2)

int min(int arg1, int arg2)

long min(long arg1, long arg2) | 返回两个参数中较小的值。 |

| `double max(double arg1, double arg2) float max(float arg1, float arg2)

int max(int arg1, int arg2)

long max(long arg1, long arg2) | 返回两个参数中较大的值。 |

以下程序,BasicMathDemo,演示了如何使用其中一些方法:

public class BasicMathDemo {
    public static void main(String[] args) {
        double a = -191.635;
        double b = 43.74;
        int c = 16, d = 45;
        System.out.printf("The absolute value " + "of %.3f is %.3f%n", 
                          a, Math.abs(a));
        System.out.printf("The ceiling of " + "%.2f is %.0f%n", 
                          b, Math.ceil(b));
        System.out.printf("The floor of " + "%.2f is %.0f%n", 
                          b, Math.floor(b));
        System.out.printf("The rint of %.2f " + "is %.0f%n", 
                          b, Math.rint(b));
        System.out.printf("The max of %d and " + "%d is %d%n",
                          c, d, Math.max(c, d));
        System.out.printf("The min of of %d " + "and %d is %d%n",
                          c, d, Math.min(c, d));
    }
}

这个程序的输出如下:

The absolute value of -191.635 is 191.635
The ceiling of 43.74 is 44
The floor of 43.74 is 43
The rint of 43.74 is 44
The max of 16 and 45 is 45
The min of 16 and 45 is 16

Java 中文官方教程 2022 版(五)(3)https://developer.aliyun.com/article/1486296

相关文章
|
9天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
33 0
|
2天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(<https://www.sojump.com/m/2792226.aspx/>)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
10 0
|
2天前
|
Java 测试技术 项目管理
Java基础教程(22)-构建工具Maven的基本使用
【4月更文挑战第22天】Maven是Java项目管理及构建工具,简化构建、测试、打包和部署等任务。遵循约定优于配置原则,核心是`pom.xml`配置文件,用于管理依赖和项目信息。安装涉及下载、解压、配置环境变量。在IDEA中使用Maven创建项目,通过`pom.xml`添加依赖和管理版本。常用命令包括`clean`、`compile`、`test`、`package`、`install`和`deploy`。IDEA支持直接执行这些命令。
|
2天前
|
NoSQL Java 关系型数据库
Java基础教程(21)-Java连接MongoDB
【4月更文挑战第21天】MongoDB是开源的NoSQL数据库,强调高性能和灵活性。Java应用通过MongoDB Java驱动与之交互,涉及MongoClient、MongoDatabase、MongoCollection和Document等组件。连接MongoDB的步骤包括:配置连接字符串、创建MongoClient、选择数据库和集合。伪代码示例展示了如何建立连接、插入和查询数据。
|
3天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
11 0
|
3天前
|
Java 关系型数据库 MySQL
Java基础教程(20)-Java连接mysql数据库CURD
【4月更文挑战第19天】MySQL是流行的关系型数据库管理系统,支持SQL语法。在IDEA中加载jar包到项目类路径:右击项目,选择“Open Module Settings”,添加库文件。使用JDBC连接MySQL,首先下载JDBC驱动,然后通过`Class.forName()`加载驱动,`DriverManager.getConnection()`建立连接。执行CRUD操作,例如创建表、插入数据和查询,使用`Statement`或`PreparedStatement`,并确保正确关闭数据库资源。
|
4天前
|
设计模式 算法 Java
Java基础教程(19)-设计模式简述
【4月更文挑战第19天】设计模式是软件设计中反复使用的代码设计经验,旨在提升代码的可重用性、可扩展性和可维护性。23种模式分为创建型、结构型和行为型三类。创建型模式如工厂方法、抽象工厂、建造者、原型和单例,关注对象创建与使用的分离。结构型模式涉及对象组合,如适配器、装饰器、外观等,增强结构灵活性。行为型模式专注于对象间职责分配和算法合作,包括责任链、命令、观察者等。设计模式提供标准化解决方案,促进代码交流和复用。
|
4天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
11 0
|
5天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
6天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
【4月更文挑战第24天】本文介绍了在自动化测试中处理HTML下拉选择(select)的方法。使用Selenium的Select类,可以通过index、value或visible text三种方式选择选项,并提供了相应的取消选择的方法。此外,文章还提供了一个示例HTML页面(select.html)和相关代码实战,演示了如何使用Selenium进行选择和取消选择操作。最后,文章提到了现代网页中类似下拉框的新设计,如12306网站的出发地选择,并给出了相应的代码示例,展示了如何定位并选择特定选项。
16 0