Java 笔记
Object

toString()
调用对象的 toString()方法可以返回对象的字符串表示toCast. 该方法在Object类中的定义是返回包名.类名@一个十六进制整数. 如 Father@4f3f5b24. 输出函数传入类的实例默认调用. Java 类库中,有许多类覆盖了 toString()方法,输出时能够得到可理解的结果.
equals()
比较两个对象是否相等, 比较的是对象的引用. 在Java类库中的许多类也覆盖了该方法,如String类。因此,对String对象使用equals()方法的比较是字符串的内容是否相等。
在子类中,使用签名equals(ClassName obj)覆盖 equals()方法是一个常见的错误,应该使用 equals (Object obj) 覆盖 equals()方法.
hashCode()
hashCode()方法返回一个对象的哈希码 (hash code) 值,它是一个整数,主要用来比较对象的大小。在Object类中hashCode()方法的实现是返回对象在计算机内部存储的十进制内存地址.
hashCode()方法和 equals()方法必须是兼容的,如果你为一个类覆盖了equals()方法,则也需要覆盖hashCode()方法,以兼容equals()方法
java.util.Objects类的 hash()方法的参数是可变参数,该方法计算每个参数的哈希码,并将它们组合起来。这个方法是空指针安全的。
如果类包含数组类型的实例变量,比较它们的哈希码时,首先使用静态方法Arrays.hashCode()计算数组的每个元素哈希码组成的哈希码,然后将结果传给 Objects 的hash()方法.
clone()
使用 Object类的 clone()方法可以克隆一个对象,即创建一个对象的副本。要使类的对象能够克隆,类必须实现Cloneable接口.
使用 Object类继承的 clone()方法克隆对象只是做了浅拷贝。它简单地从原对象中复制所有实例变量到目标对象中。如果实例变量是基本类型或不变对象(如String), 将没有问题;否则,原对象和克隆对象将共享可变的状态。
finalize()
每个对象都有一个 finalize()方法。在对象被销毁之前,垃圾回收器允许对象调用该方法进行清理工作,这个过程称为对象终结 (finalization)。 格式为 protected void finalize() throws Throwable
Math

基本类型包装类

Character
1 | public class Main { |
常用方法:
public char charValue() |
返回 Character 对象所包含的 char值。 |
public int compareTo(Character anotherChar) |
比较两个字符对象。如果该字符对象与参数字符对象相等,返回0;若小于参数字符,返回值小于0;若大于参数字符,则返回值大于0。 |
public static boolean isDigit(char ch) |
返回参数字符是否是数字。 |
public static boolean isLetter(char ch) |
返回参数字符是否是字母。 |
public static boolean isLowerCase(char ch) |
返回参数字符是否是小写字母。 |
public static boolean isUpperCase(char ch) |
返回参数字符是否是大写字母。 |
public static boolean isWhiteSpace(char ch) |
返回参数字符是否是空白字符。 |
public static char toLowerCase(char ch) |
将参数字符转换为小写字母返回。 |
public static char toUpperCase(char ch) |
将参数字符转换为大写字母返回。 |
public static boolean isJavaIdentifierStart(char ch) |
返回参数字符是否允许作为 Java标识符的开头字符。 |
public static boolean isJavaldentifierPart (char ch) |
返回参数字符是否允许作为 Java标识符的中间字符。 |
Boolean
常用方法:
public Boolean(boolean value) |
用一个boolean型值创建一个Boolean对象。 |
public Boolean(String s) |
用一个字符串创建Boolean对象。如果字符串 s不为 null 且其值为 “true”(不区分大小写)就创建一个true值,否则创建一个 false值。 |
public boolean booleanValue() |
返回该Boolean 对象所封装的 boolean值。 |
public static boolean parseBoolean(String s) |
将参数s解析为一个 boolean 值。如果参数不为 null 且等于 “true”(不区分大小写),则返回true, 否则返回 false。 |
public static Boolean valueOf(boolean b) |
将参数b 的值转换为 Boolean 对象。 |
public static Boolean valueOf(String s) |
将参数s 的值转换为 Boolean对象。 |
1 | public class Main { |
数值类对象
常用方法:
public Integer(int value) |
使用 int类型的值创建包装类型 Integer对象。 |
public Integer(String s) |
使用字符串构造Integer对象,如果字符串不能转换成相应的数值,则抛出NumberFormatException异常 |
public static String toBinaryString(int i) |
返回整数i用字符串表示的二进制序列。 |
public static String toHexString(int i) |
返回整数i用字符串表示的十六进制序列。 |
public static String toOctalString(int i) |
返回整数 i用字符串表示的八进制序列。 |
public static int highestOneBit(int i) |
返回整数i的二进制补码的最高位1所表示的十进制数,如7(111)的最高位的1表示的值为4。 |
public static int lowestOneBit(int i) |
返回整数 i的二进制补码的最低位1所表示的十进制数,如10(1010)的最低位的1表示的值为2。 |
public static int reverse(int i) |
返回将整数i的二进制序列反转后的整数值。 |
public static int signum(inti) |
返回整数i的符号。若 i大于0,返回1;若 i等于0, |
| 返回0,若 i小于0则返回-1。 |
每种包装类型都覆盖了toString()方法和 equals()方法,因此使用 equals()方法比较包装类型的对象时是比较内容或所包装值.每种包装类型的对象中所包装的值是不可改变的,要改变对象中的值必须重新生成新的对象.
每个数值包装类都定义了 SIZE、BYTES、MAX_VALUE、MIN_VALUE 常量。
SIZE 表示每种类型的数据所占的位数
BYTES 表示数据所占的字节数
MAX_VALUE 表示对应基本类型数据的最大值.
对于Byte、Short、Integer和Long 来说,MIN_VALUE 表示类型的最小值。对 Float和 Double 来说,MIN_VALUE 最小正值。
除了上面的常量外,在 Float 和 Double 类中还分别定义了 POSITIVE_INFINITY、NEGATIVE INFINITY、NaN(not a number), 它们分别表示正、负无穷大和非数值。
自动装箱与自动拆箱
Java 5 版提供了一种新的功能,称为自动装箱和自动拆箱。自动装箱 (autoboxing) 是指基本类型的数据可以自动转换为包装类的实例,自动拆箱 (unboxing) 是指包装类的实例自动转换为基本类型的数据。
1 | public class Main { |
字符串与基本数据类型转化
public static Type parse{Type}(String s)
1 | public class Main { |
BigInteger BigDecimal
如果在计算中需要非常大的整数或非常高精度的浮点数,可以使用java.math 包中定义的BigInteger类和 BigDecimal类。这两个类都扩展了Number类并实现了Comparable 接口,它们的实例都是不可变的.
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html
时间日期API
java.time
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html
内部类
Java 语言允许在一个类的内部定义另一个类(接口、枚举或注解),这种类称为内部类 (inner class)或嵌套类 (nested class)
使用内部类的优点:对只在一处使用的类进行分组;提高封装性;增强代码的可读性和可维护性。
有多种类型的内部类,大致可分为成员内部类、局部内部类、匿名内部类和静态内部类。
内部成员类
成员内部类没有用 static修饰且定义在外层类的类体中
1 | public class OuterClass { |
使用成员内部类时需要注意下面几个问题:
- 成员内部类中不能定义 static变量和 static方法。
- 成员内部类也可以使用 abstract和 final修饰,其含义与其他类一样。
- 成员内部类还可以使用 private、public、protected或包可访问修饰符。
局部内部类
可以在方法体或语句块内定义类。在方法体或语句块 (包括方法、构造方法、局部块、初始化块或静态初始化块)内部定义的类称为局部内部类 (local inner class)
1 | public class OuterClass { |
匿名内部类
定义类最终目的是创建一个类的实例,但如果某个类的实例只使用一次,可以将类的定义和实例的创建在一起完成,或者说在定义类的同时就创建一个实例。以这种方式定义的没有名字的类称为匿名内部类 (anonymous inner class)。
1 | abstract class Person { |
匿名内部类可以继承一个类或实现一个接口, 如果实现一个接口,该类是Object类的直接子类。匿名类继承一个类或
实现一个接口不需要使用 extends 或 implements 关键字。匿名内部类不能同时继承一个类和实现一个接口,也不能实现多个接口
匿名内部类的一个重要应用是编写 JavaFX 图形界面的事件处理程序。如为按钮对象button 注册事件处理器,就可以使用匿名内部类。
静态内部类
静态内部类使用 static修饰,静态内部类也称嵌套类 (nested class)
1 | public class OuterClass { |
枚举类型
枚举类型是一种特殊的引用类型,它的声明和使用与类和接口有类似的地方。它可以作为顶层的类型声明,也可以像内部类一样在其他类的内部声明,但不能在方法内部声明枚举。
任何枚举类型都隐含地继承了java.lang.Enum抽象类,Enum类又是Object类的子类,同时实现了 Comparable 接口和 Serializable接口。每个枚举类型都包含了若干方法,下面是一些常用的
public static E[] values() |
返回一个包含所有枚举常量的数组,这些枚举常量在数组中是按照它们的声明顺序存储的。 |
public static E valueOf(String name) |
返回指定名字的枚举常量。如果这个名字与任何一个枚举常量的名字都不能精确匹配,将抛出 IlegalArgumentException 异常。 |
public final int compareTo(Eo) |
返回当前枚举对象与参数枚举对象的比较结果。 |
public final Class<E> getDeclaringClass() |
返回对应该枚举常量的枚举类型的类对象。两个枚举常量 el、e2, 当且仅当 el.getDeclaringClass() == e2.getDeclaringClass()时,这两个枚举常量类型相同。 |
public final String name() |
返回枚举常量名。 |
public final int ordinal() |
返回枚举常量的顺序值,该值是基于常量声明的顺序的,第一个常量的顺序值是0,第二个常量的顺序值为1,依次类推。 |
public String toString() |
返回枚举常量名。 |
1 | public class Main { |
1 | enum Color { |
注解类型
注解类型 (annotation type) 是 Java 5 新增的功能。注解以结构化的方式为程序元素提供信息,这些信息能够被外部工具(编译器、解释器等)自动处理.
注解有许多用途,其中包括:
- 为编译器提供信息。编译器可以使用注解检测错误或阻止编译警告。
- 编译时或部署时处理。软件工具可以处理注解信息生成代码、 XML 文件等。
- 运行时处理。有些注解在运行时可以被检查。
像使用类一样,要使用注解必须先定义注解类型(也可以使用语言本身提供的注解)
注解 (annotation)和注解类型 (annotation type)。注解类型是一种特殊的接口类型,注解是注解类型的一个实例。就像接口一样,注解类型也有名称和成员。注解中包含的信息采用“键/值”对的形式,可以有零或多个“键/值”对,并且每个键有一个特定类型。没有“键/值”对的注解类型称作标记注解类(marker annotation type)。如果注解只需要一个“键/值”对,则称为单值注解类型。
标准注解
Java语言规范中定义了3个注解类型,它们是供编译器使用的。这3个注解类型定义在java.lang包中,分别为@Override、@Deprecated 和 @SuppressWarnings。
Override :
是一个标记注解类型, 告诉编译器此方法要覆盖父类方法.
Deprecate:
是一个标记注解类型,可以应用于某个方法或某个类型,指明方法或类型已被弃用。标记已被弃用的方法或类型,是为了警告其代码用户,不应该使用或覆盖该方法,或不该使用或扩展该类型。一个方法或类型被标记弃用通常是因为有了更好的方法或类型。当前的软件版本中保留这个被弃用的方法或类型是为了向后兼容。
SuppressWarnings:
注解指示编译器阻止某些类型的警告,具体的警告类型可以用初始化该注解的字符串来定义。该注解可应用于类型、构造方法、方法、成员变量、参数以及局部变量。它的用法是传递一个 String数组,其中包含需要阻止的警告。
常用有效参数:
unchecked未检查的转换警告。deprecation使用了不推荐使用方法的警告。serial实现 Serializable 接口但没有定义 serialVersionUID 常量的警告。rawtypes如果使用旧的语法创建泛型类对象时发出的警告。finally任何 finally子句不能正常完成的警告。fallthroughswitch块中某个 case 后没有 break 语句的警告。
标准元注解
元注解 (meta annotation) 是对注解进行标注的注解。在java.lang.annotation包中定义Documented、Inherited、Retention 和 Target 四个元注解类型。
Documented
Documented是一种标记注解类型,用于对一个注解类型的声明进行标注,使该注解类型的实例包含在用javadoc 工具产生的文档中。Inherited
用 Inherited标注的注解类型的任何实例都会被继承。如果 Inherited标注一个类,那么注解将会被这个被标注类的所有子类继承。Retension
Retension 注解指明被标注的注解保留多长时间。 Retension 注解的值为 RetensionPolicy枚举的一个成员:
SOURCE表示注解仅存于源文件中,注解将被编译器丢弃。CLASS表示注解将保存在类文件中,但不被JVM保存的注解,是默认值。RUNTIME表示要被JVM保存的注解,在运行时可以利用反射机制查询
Target
Target注解用来指明哪个(些)程序元素可以利用被标注的注解类型进行标注。 Target的值为java.lang.annotation.ElementType枚举的一个成员:
ANNOTATION_TYPE可以对注解类型标注。CONSTRUCTOR可以对构造方法进行标注。FIELD可以对成员的声明进行标注。LOCAL_VARIABLE可以对局部变量进行标注。METHOD可以对方法进行标注。PACKAGE可以对包进行标注。PARAMETER可以对参数声明进行标注。TYPE可以对类型声明进行标注
如Override 注解类型使用了 Target 注解标注,使得 Override 只适用于方法声明.
SuppressWarnings 注解类型的声明
1 | (value={TYPE,FIELD,METHOD,PARAMETER, CONSTRUCTOR,LOCAL_VARIABLE}) |
定义注解
默认情况下,所有的注解类型都扩展了java.lang.annotation.Annotation接口。该接口定义一个返回Class对象的 annotationType()方法 Class <?extends Annotation> annotationType(), 该接口还定义了equals()方法、hashCode()方法和toString()方法。
1 |
|
在注解类型中声明的方法称为注解类型的元素,它的声明类似于接口中的方法声明,没有方法体,但有返回类型。元素的类型有一些限制,如只能是基本类型、String、枚举类型、其他注解类型等,并且元素不能声明任何参数。
实际上,注解类型的元素就像对象的域一样,所有应用该注解类型的程序元素都要对这些域实例化。这些域的值是在应用注解时由初始化器决定,或由元素的默认值决定。
在定义注解时可以使用 default 关键字为元素指定默认值。
javaxjws 包中定义了一些用来创建 Web 服务的注解类型,在 javax.xml.ws包和 javax.xml.bind.annotation 包中也定义了许多注解类型。注解类型在 Java Web 开发和Java EE 开发中被广泛使用.
参考
- 《Java程序设计(第3版)》 IBSN 9787302485520
- Java API 文档
- Hash值的理解,Java中hashCode()和equals究竟有什么用?