🦔 常用工具类
type
status
date
slug
summary
tags
category
icon
password
Property
 

Math

Math类就是用来进行数学计算的,它提供了大量的静态方法来实现数学计算
 
计算次方:
 
计算
 
计算 次方:
🦔 BigInteger和BigDecimal (1)
type
status
date
slug
summary
tags
category
icon
password
Property
 

BigInteger

在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。
如果使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。
 
java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数:
BigInteger做运算的时候,只能使用实例方法,例如加法运算:
 
long型整数运算比,BigInteger不会有范围限制,但缺点是速度比较慢。也可以把BigInteger转换成long型:
🦇 异常处理
type
status
date
slug
summary
tags
category
icon
password
Property
🦇

Java的异常

在计算机程序运行的过程中,总是会出现各种各样的错误。
有一些错误是用户造成的,比如:希望用户输入一个int类型的年龄,但是用户的输入是abc ;程序想要读写某个文件的内容,但是用户已经把它删除了。
还有一些错误是随机出现,并且永远不可能避免的。比如:
  • 网络突然断了,连接不到远程服务器;
  • 内存耗尽,程序崩溃了;
  • ……
 
🐻 Class类
type
status
date
slug
summary
tags
category
icon
password
Property
 
除了int等基本类型外,Java的其他类型全部都是class(包括interface),例如:
  • String
  • Object
  • Runnable
  • Exception
  • ...
 
class(包括interface)的本质是数据类型(Type),无继承关系的数据类型无法赋值:
class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。
每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。注:这里的Class类型是一个名叫Classclass
🐻 访问字段
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
对任意的一个Object实例,只要获取了它的Class,就可以获取它的一切信息。
Class类提供了以下几个方法来获取字段:
  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
 
一个Field对象包含了一个字段的所有信息:
  • getName():返回字段名称,例如,"name"
🐻 调用方法
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method
  • Method getMethod(name, Class...):获取某个publicMethod(包括父类)
  • Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
  • Method[] getMethods():获取所有publicMethod(包括父类)
  • Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
 
一个Method对象包含一个方法的所有信息:
  • getName():返回方法名称,例如:"getScore"
  • getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class
🐻 调用构造方法
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
通常使用new操作符创建新的实例:
如果通过反射来创建新的实例,可以调用Class提供的newInstance()方法:
调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。如果构造方法带有参数,或者不是public,就无法直接通过Class.newInstance()来调用。
为了调用任意的构造方法,Java的反射API提供了Constructor对象,它包含一个构造方法的所有信息,可以创建一个实例。Constructor对象和Method非常类似,不同之处仅在于它是一个构造方法,并且,调用结果总是返回实例:
通过Class实例获取Constructor的方法如下:
  • getConstructor(Class...):获取某个publicConstructor
  • getDeclaredConstructor(Class...):获取某个Constructor
🐻 获取继承关系
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
获取到某个Class对象时,实际上就获取到了一个类的类型:
还可以用实例的getClass()方法获取:
最后一种获取Class的方法是通过Class.forName(""),传入Class的完整类名获取:
这三种方式获取的Class实例都是同一个实例,因为JVM对每个加载的Class只创建一个Class实例来表示它的类型。
 

获取父类的Class

有了Class实例,还可以获取它的父类的Class
🐻 动态代理
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
比较Java的classinterface的区别:
  • 可以实例化class(非abstract
  • 不能实例化interface
所有interface类型的变量总是通过某个实例向上转型并赋值给接口类型变量的:
有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?
这是可能的,Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。
什么叫运行期动态创建?所谓动态代理,是和静态相对应的。
静态代码定义接口:
🐻‍❄️ 注解 Annotation
type
status
date
slug
summary
tags
category
icon
password
Property
 
什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:
注释会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。
 

注解的作用

从JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。
Java的注解可以分为三类:
  1. 第一类是由编译器使用的注解,例如:
      • @Override:让编译器检查该方法是否正确地实现了覆写
      • @SuppressWarnings:告诉编译器忽略此处代码产生的警告
      这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了
🐨 泛型
type
status
date
slug
summary
tags
category
icon
password
Property
 
我们先观察Java标准库提供的ArrayList,它可以看作“可变长度”的数组,因为用起来比数组更方便。
实际上ArrayList内部就是一个Object[]数组,配合存储一个当前分配的长度,就可以充当“可变数组”:
如果用上述ArrayList存储String类型,会有这么几个缺点:
  • 需要强制转型;
  • 不方便,易出错。
例如,代码必须这么写:
很容易出现ClassCastException,因为容易“误转型”:
要解决上述问题,可以为String单独编写一种ArrayList
🐨 使用泛型
type
status
date
slug
summary
tags
category
icon
password
Property
 
使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object
此时,只能把<T>当作Object使用,没有发挥泛型的优势。
当我们定义泛型类型<String>后,List<T>的泛型接口变为强类型List<String>
当定义泛型类型<Number>后,List<T>的泛型接口变为强类型List<Number>
编译器如果能自动推断出泛型类型,就可以省略后面的泛型类型
编译器看到泛型类型List<Number>就可以自动推断出后面的ArrayList<T>的泛型类型必须是ArrayList<Number> ,因此可以简写为: