1 内部类
1.1 内部类的基本使用
- 内部类概述:
- 就是在一个类中定义一个类。举例:在一个A类的内部定义一个B类, B类就被称为内部类。
- 内部类定义格式:
- 内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
public class Test1Inner {
public static void main(String[] args) {
/*
创建内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类对象().new 内部类对象();
*/
Outer.Inner i = new Outer().new Inner();
System.out.println(i.num);
i.show();
}
}
class Outer {
private int a = 10;
class Inner {
int num = 10;
public void show(){
System.out.println("Inner..show");
// 内部类, 访问外部类成员, 可以直接访问, 包括私有
System.out.println(a);
}
}
}
1.2 内部类分类
- 按照内部类在类中定义的位置不同,可以分为如下两种形式
- 在类的成员位置:成员内部类
- 在类的局部位置:局部内部类
1.2.1 成员内部类
成员内部类的定义位置
- 在类中方法,跟成员变量是一个位置
外界创建成员内部类格式
- 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
- 范例:Outer.Inner oi = new Outer().new Inner();
修饰符修饰成员内部类
成员内部类,也属于(成员),既然是成员就可以被一些修饰符所修饰
私有成员内部类
将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
- 私有成员内部类访问:在自己所在的外部类中创建对象访问。
public class Test2Innerclass {
/*
私有成员内部类演示
*/
public static void main(String[] args) {
// Outer.Inner oi = new Outer().new Inner();
Outer o = new Outer();
o.method();
}
}
class Outer {
private class Inner {
public void show(){
System.out.println("inner..show");
}
}
public void method(){
Inner i = new Inner();
i.show();
}
}
静态成员内部类
- 静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
- 静态成员内部类中的静态方法:外部类名.内部类名.方法名();
public class Test3Innerclass {
/*
静态成员内部类演示
*/
public static void main(String[] args) {
// 外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer.Inner oi = new Outer.Inner();
oi.show();
Outer.Inner.method();
}
}
class Outer {
static class Inner {
public void show(){
System.out.println("inner..show");
}
public static void method(){
System.out.println("inner..method");
}
}
}
1.2.2 局部内部类
- 局部内部类定义位置
- 局部内部类是在方法中定义的类
- 局部内部类方式方式
- 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
public class Test4Innerclass {
/*
局部内部类:
编写位置: 方法中
访问方式: 只能在方法中, 创建对象并访问
*/
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
class Outer {
int a = 10;
public void method(){
int b = 20;
class Inner {
public void show(){
System.out.println("show...");
System.out.println(a);
System.out.println(b);
}
}
Inner i = new Inner();
i.show();
}
}
1.3 匿名内部类
- 匿名内部类概述:
- 匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)
- 是一个继承了该类或者实现了该接口的子类匿名对象
- 匿名内部类前提:
- 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
- 匿名内部类的格式:
-
格式:
-
范例:
-
- 匿名内部类理解:
- 匿名内部类是将(继承 \ 实现)(方法重写)(创建对象)三个步骤,放在了一步进行
public class Test5Innerclass {
/*
1. 创建实现类, 通过implements关键字去实现接口
2. 重写方法
3. 创建实现类对象
4. 调用重写后的方法.
匿名内部类:
前提: 需要存在类\接口
格式:
new 类名 \ 接口名 (){
重写方法
}
*/
public static void main(String[] args) {
InterImpl ii = new InterImpl();
ii.show();
// 匿名内部类的理解: 将继承\实现, 方法重写, 创建对象, 放在了一步进行.
// 解释: 实现了Inter接口的, 一个实现类对象.
new Inter() {
@Override
public void show() {
System.out.println("我是匿名内部类中的show方法");
}
}.show();
// 情况: 接口中存在多个方法
Inter2 i = new Inter2() {
@Override
public void show1() {
System.out.println("show1...");
}
@Override
public void show2() {
System.out.println("show2...");
}
};
i.show1();
i.show2();
}
}
interface Inter {
void show();
}
interface Inter2 {
void show1();
void show2();
}
class InterImpl implements Inter {
@Override
public void show() {
System.out.println("InterImpl 重写的show方法");
}
}
1.4 匿名内部类在开发中的使用场景
- 匿名内部类的本质是一个继承了该类或者实现了该接口的【子类匿名对象】
- 既然是对象,那就可以作为参数传递
- 所以,当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去
public class TestSwimming {
public static void main(String[] args) {
goSwimming(new Swimming() {
@Override
public void swim() {
System.out.println("铁汁, 我们去游泳吧");
}
});
}
/**
* 使用接口的方法
*/
public static void goSwimming(Swimming swimming){
/*
Swimming swimming = new Swimming() {
@Override
public void swim() {
System.out.println("铁汁, 我们去游泳吧");
}
}
*/
swimming.swim();
}
}
/*
游泳接口
*/
interface Swimming {
void swim();
}
2 Lambda表达式
2.0 函数式编程思想概述
- 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”
- 面向对象思想强调“必须通过对象的形式来做事情”
- 函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
- 而我们要学习的Lambda表达式就是函数式思想的体现
2.1体验Lambda表达式
public class TestSwimming {
public static void main(String[] args) {
goSwimming(new Swimming() {
@Override
public void swim() {
System.out.println("铁汁, 我们去游泳吧");
}
});
/*
理解: 对于Lambda表达式, 对匿名内部类进行了优化
*/
goSwimming(() -> {
System.out.println("铁汁, 我们去游泳吧");
});
}
/**
* 使用接口的方法
*/
public static void goSwimming(Swimming swimming) {
swimming.swim();
}
}
/*
游泳接口
*/
interface Swimming {
void swim();
}
2.2 Lambda表达式的标准格式
- Lambda表达式的使用前提
- 有一个接口
- 接口中有且仅有一个抽象方法
- 组成Lambda表达式的三要素:
- 形式参数,箭头,代码块
- 格式: (形式参数) -> {代码块}
- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
- ->:由英文中画线和大于符号组成,固定写法。代表指向动作
- 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
2.3 Lambda表达式练习1——无参数无返回值
- 编写一个接口(ShowHandler)
- 在该接口中存在一个抽象方法(show),该方法是无参数无返回值
- 在测试类(ShowHandlerDemo)中存在一个方法(useShowHandler)
- 方法的的参数是ShowHandler类型的
- 在方法内部调用了ShowHandler的show方法
public class TestLambda {
/*
Lambda表达式的使用前提
1. 一个接口
2. 接口中有且仅有一个抽象方法
练习1:
1. 编写一个接口(ShowHandler)
2. 在该接口中存在一个抽象方法(show),该方法是无参数无返回值
3. 在测试类(ShowHandlerDemo)中存在一个方法(useShowHandler)
方法的的参数是ShowHandler类型的
在方法内部调用了ShowHandler的show方法
*/
public static void main(String[] args) {
useShowHandler(new ShowHandler() {
@Override
public void show() {
System.out.println("我是匿名内部类中的show方法");
}
});
// Lambda实现
useShowHandler(() -> {
System.out.println("我是Lambda中的show方法");
});
}
public static void useShowHandler(ShowHandler showHandler) {
showHandler.show();
}
}
interface ShowHandler {
void show();
}
2.4 Lambda表达式练习2——有参数无返回值
- 首先存在一个接口(StringHandler)
- 在该接口中存在一个抽象方法(printMessage),该方法是有参数无返回值
- 在测试类(StringHandlerDemo)中存在一个方法(useStringHandler)
- 方法的的参数是StringHandler类型的
- 在方法内部调用了StringHandler的printMessage方法
public class StringHandlerDemo {
/*
1.首先存在一个接口(StringHandler)
2.在该接口中存在一个抽象方法(printMessage),该方法是有参数无返回值
3.在测试类(StringHandlerDemo)中存在一个方法(useStringHandler)
方法的的参数是StringHandler类型的
在方法内部调用了StringHandler的printMessage方法
*/
public static void main(String[] args) {
useStringHandler(new StringHandler() {
@Override
public void printMessage(String msg) {
System.out.println("我是匿名内部类" + msg);
}
});
// Lambda实现
useStringHandler((String msg) -> {
System.out.println("我是Lambda表达式" + msg);
});
}
public static void useStringHandler(StringHandler stringHandler) {
stringHandler.printMessage("itheima");
}
}
interface StringHandler {
void printMessage(String msg);
}
2.5 Lambda表达式练习3——无参数有返回值
- 首先存在一个接口(RandomNumHandler)
- 在该接口中存在一个抽象方法(getNumber),该方法是无参数但是有返回值
- 在测试类(RandomNumHandlerDemo)中存在一个方法(useRandomNumHandler)
- 方法的的参数是RandomNumHandler类型的
- 在方法内部调用了RandomNumHandler的getNumber方法
import java.util.Random;
public class RandomNumHandlerDemo {
/*
1. 首先存在一个接口(RandomNumHandler)
2. 在该接口中存在一个抽象方法(getNumber),该方法是无参数但是有返回值
3. 在测试类(RandomNumHandlerDemo)中存在一个方法(useRandomNumHandler)
方法的的参数是RandomNumHandler类型的
在方法内部调用了RandomNumHandler的getNumber方法
*/
public static void main(String[] args) {
useRandomNumHandler(new RandomNumHandler() {
@Override
public int getNumber() {
Random r = new Random();
int num = r.nextInt(10) + 1;
return num;
}
});
useRandomNumHandler(() -> {
Random r = new Random();
int num = r.nextInt(10) + 1;
return num;
// 注意: 如果lambda所操作的接口中的方法, 有返回值, 一定要通过return语句, 将结果返回
// 否则会出现编译错误
});
}
public static void useRandomNumHandler(RandomNumHandler randomNumHandler) {
int result = randomNumHandler.getNumber();
System.out.println(result);
}
}
interface RandomNumHandler {
int getNumber();
}
2.6 Lambda表达式练习4——有参数有返回值
- 首先存在一个接口(Calculator)
- 在该接口中存在一个抽象方法(calc),该方法是有参数也有返回值
- 在测试类(CalculatorDemo)中存在一个方法(useCalculator)
- 方法的的参数是Calculator类型的
- 在方法内部调用了Calculator的calc方法
public class CalculatorDemo {
/*
1. 首先存在一个接口(Calculator)
2. 在该接口中存在一个抽象方法(calc),该方法是有参数也有返回值
3. 在测试类(CalculatorDemo)中存在一个方法(useCalculator)
方法的的参数是Calculator类型的
在方法内部调用了Calculator的calc方法
*/
public static void main(String[] args) {
useCalculator(new Calculator() {
@Override
public int calc(int a, int b) {
return a + b;
}
});
useCalculator((int a, int b) -> {
return a + b;
});
}
public static void useCalculator(Calculator calculator) {
int result = calculator.calc(10, 20);
System.out.println(result);
}
}
interface Calculator {
int calc(int a, int b);
}
2.7 Lambda表达式的省略模式
- 省略的规则
- 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
public class Test6 {
public static void main(String[] args) {
useInter(new Inter() {
@Override
public double method(double a, double b) {
return a + b;
}
});
/*useInter( (double a, double b) -> {
return a + b;
});*/
useInter((a, b) -> a + b);
}
public static void useInter(Inter inter) {
double result = inter.method(12.3, 22.3);
System.out.println(result);
}
}
interface Inter {
// 用于计算 a + b 的结果并返回
double method(double a, double b);
}
2.8 Lambda表达式和匿名内部类的区别
- Lambda在特定情况下可以代替匿名内部类
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
3 API
3.1 API概述
- 什么是API
- API (Application Programming Interface) :应用程序编程接口
- java中的API
- 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
3.2 如何使用API帮助文档
-
打开帮助文档
-
找到索引选项卡中的输入框
-
在输入框中输入
-
看类在哪个包下
-
看类的描述
-
看构造方法
-
看构造方法
4 常用API
4.1 Math
- Math类概述
- Math 包含执行基本数字运算的方法
- Math中方法的调用方式
- Math类中无构造方法,但内部的方法都是静态的,可以通过 类名.进行调用
- Math类的常用方法
方法名 方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
public static int round(float a) | 按照四舍五入返回最接近参数的int |
public static int max(int a,int b) | 返回两个int值中的较大值 |
public static int min(int a,int b) | 返回两个int值中的较小值 |
public static double pow (double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值,[0.0,1.0) |
public class MathDemo {
public static void main(String[] args) {
// public static int abs(int a) 返回参数的绝对值
int abs = Math.abs(10);
System.out.println(abs);
// public static double ceil(double a) 向上取整
double ceil = Math.ceil(10.1);
System.out.println(ceil);
// public static double floor(double a) 向下取整
double floor = Math.floor(10.9);
System.out.println(floor);
// public static int round(float a) 四舍五入
long round = Math.round(10.1);
System.out.println(round);
//
long round1 = Math.round(1.9);
System.out.println(round1);
// public static int max(int a,int b) 返回两个int值中的较大值
int max = Math.max(10, 20);
System.out.println(max);
// public static int min(int a,int b) 返回两个int值中的较小值
int min = Math.min(10, 20);
System.out.println(min);
// public static double pow(double a,double b)返回a的b次幂的值
double pow = Math.pow(2, 3);
System.out.println(pow);
// public static double random() 返回值为double的正值,[0.0,1.0)
for (int i = 0; i < 10 ; i++) {
double random = Math.random();
System.out.println(random);
}
}
}
4.2 System
- System 不能被实例化
- System类的常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的 Java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |
arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数) | 数组copy |
public class SystemDemo {
public static void main(String[] args) {
// public static void exit(int status) 终止当前运行的 Java 虚拟机,非零表示异常终止
System.out.println(111);
System.exit(0); //当代码执行到这个方法的时候,就表示虚拟机已经停止了
System.out.println(222);
// public static long currentTimeMillis() 返回当前时间(以毫秒为单位)
long start = System.currentTimeMillis();//获取当前时间
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();//获取当前时间
System.out.println(end - start);//472 --- 得到的就是这个for循环运行的时间.
// arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数) 数组copy
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[10];
//需求:我要把arr1中的数据拷贝到arr2中.
System.arraycopy(arr1,0,arr2,0,arr1.length);
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
//我要把arr1最后两个元素,拷贝到arr2的最后两个索引上
System.arraycopy(arr1, 3, arr2, 8, 2);
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
4.3 Object
- Object 类的概述
- Object是类层次结构的根,每个类都可以将 Object 作为父类(超类)
- 所有类都直接或者间接的继承自该类
- 构造方法:
- public Object()
- Object 类的常用方法
方法名 | 说明 |
---|---|
public String toString() | 返回对象的字符串表示形式。建议所有子类重写该方法,自动生成 |
public boolean equals(另一个对象) | 比较对象是否相等。默认比较地址,重写可以比较内容,自动生成 |
4.3.1 Object类的toString方法
- toString方法的作用:
- 以良好的格式,更方便的展示对象中的属性值
- 重写toString方法的方式
- Alt + Insert 选择toString
- 在类的空白区域,右键 -> Generate -> 选择toString
public class Student /*extends Object*/{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo {
public static void main(String[] args) {
Student s = new Student("张三",23);
System.out.println(s);//com.itheima.demo1.Student@1b6d3586
System.out.println(s.toString());
//重写toString之后两次输出都是Student{name='张三', age=23}
}
}
- 总结:
- Object类是所有类的直接或者间接父类
- 直接打印一个对象就是打印这个对象的toString方法的返回值
- Object类的toString方法得到的是对象的地址值
- 我们一般会对toString方法进行重写
4.3.2 Object类的equals方法
- equals方法的作用
- 用于对象之间的比较,返回true和false的结果
- 举例:s1.equals(s2); s1和s2是两个对象
- 重写equals方法的场景
- 不希望比较对象的地址值,想要结合对象属性进行比较的时候。
- 重写equals方法的方式
- alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,finish即可
- 在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上。
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
}
public class Demo {
public static void main(String[] args) {
Student s1 = new Student("zhangsan",23);
Student s2 = new Student("zhangsan",23);
System.out.println(s1 == s2);//地址值不相同,所以是false
//Object类中的equals方法,底层也是用==号比较地址值.
//重写equals方法之后,底层比较的是属性值
System.out.println(s1.equals(s2));//重写equals之前是false,重写之后为true
}
}
4.3.3 Object类的面试题
public class InterviewTest {
public static void main(String[] args) {
String s1 = "abc";
StringBuilder sb = new StringBuilder("abc");
//1.此时调用的是String类中的equals方法.
//保证参数也是字符串,否则不会比较属性值而直接返回false
System.out.println(s1.equals(sb));//false
//StringBuilder类中是没有重写equals方法,用的就是Object类中的.
System.out.println(sb.equals(s1));//false
}
}
4.4 Objects
- 常用方法
方法名 | 说明 |
---|---|
public static String toString(对象) | 返回参数中对象的字符串表示形式。 |
public static String toString(对象, 默认字符串) | 返回对象的字符串表示形式。 |
public static Boolean isNull(对象) | 判断对象是否为空 |
public static Boolean nonNull(对象) | 判断对象是否不为空 |
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.util.Objects;
public class MyObjectsDemo {
public static void main(String[] args) {
// public static String toString(对象) 返回参数中对象的字符串表示形式。
Student s1 = new Student("小罗同学", 50);
String result1 = Objects.toString(s1);
System.out.println(result1);//Student{name='小罗同学', age=50}
System.out.println(s1);//Student{name='小罗同学', age=50}
System.out.println("--------------------");
// public static String toString(对象, 默认字符串) 返回对象的字符串表示形式。如果对象为空,那么返回第二个参数.
Student s2 = new Student("小花同学", 23);
String result2 = Objects.toString(s2, "随便写一个");
System.out.println(result2);//Student{name='小花同学', age=23}
Student s3 = null;
String result3 = Objects.toString(s3, "随便写一个");
System.out.println(result3);//随便写一个
System.out.println("--------------------");
// public static Boolean isNull(对象) 判断对象是否为空
Student s4 = null;
boolean result4 = Objects.isNull(s4);
System.out.println(result4);//true
Student s5 = new Student();
boolean result5 = Objects.isNull(s5);
System.out.println(result5);//false
System.out.println("--------------------");
// public static Boolean nonNull(对象) 判断对象是否不为空
Student s6 = new Student();
boolean result6 = Objects.nonNull(s6);
System.out.println(result6);//true
Student s7 = null;
boolean result7 = Objects.nonNull(s7);
System.out.println(result7);//false
System.out.println("--------------------");
}
}
4.5 BigDecimal
- 作用
- 可以用来进行精确计算
- 构造方法
方法名 | 说明 |
---|---|
BigDecimal(double val) | 参数为double |
BigDecimal(String val) | 参数为String |
import java.math.BigDecimal;
public class MyBigDecimalDemo2 {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal(10.0);
BigDecimal bd2 = new BigDecimal("0.3");
System.out.println(bd1);//10
System.out.println(bd2);//0.3
}
}
- 常用方法——四则运算
方法名 | 说明 |
---|---|
public BigDecimal add(另一个BigDecimal对象) | 加法 |
public BigDecimal subtract (另一个BigDecimal对象) | 减法 |
public BigDecimal multiply (另一个BigDecimal对象) | 乘法 |
public BigDecimal divide (另一个BigDecimal对象) | 除法 |
import java.math.BigDecimal;
public class MyBigDecimalDemo3 {
public static void main(String[] args) {
//BigDecimal bd1 = new BigDecimal(0.1);
//BigDecimal bd2 = new BigDecimal(0.2);
//如果想要进行精确运算,那么请使用字符串的构造
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
//public BigDecimal add(另一个BigDecimal对象) 加法
BigDecimal add = bd1.add(bd2);
System.out.println("和为" + add);
//System.out.println(0.1 + 0.2);
//public BigDecimal subtract (另一个BigDecimal对象) 减法
BigDecimal subtract = bd1.subtract(bd2);
System.out.println("差为" + subtract);
//public BigDecimal multiply (另一个BigDecimal对象) 乘法
BigDecimal multiply = bd1.multiply(bd2);
System.out.println("积为" + multiply);
//public BigDecimal divide (另一个BigDecimal对象) 除法
BigDecimal divide = bd1.divide(bd2);
System.out.println("商为"+divide);
}
}
- 常用方法——除法的特殊方法
方法名 | 说明 |
---|---|
public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) | 除法 |
- 示例:
- BigDecimal divide = bd1.divide(参与运算的对象, 小数点后精确到多少位,舍入模式);
- 参数1: 表示参与运算的BigDecimal 对象。
- 参数2: 表示小数点后面精确到多少位
- 参数3: 舍入模式
- BigDecimal.ROUND_UP 进一法
- BigDecimal.ROUND_FLOOR 去尾法
- BigDecimal.ROUND_HALF_UP 四舍五入法
import java.math.BigDecimal;
public class MyBigDecimalDemo4 {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("0.3");
BigDecimal bd2 = new BigDecimal("4");
BigDecimal divide = bd1.divide(bd2);
System.out.println(divide);//0.075
//参数一:表示参数运算的另一个对象
//参数二:表示小数点后精确到多少位
//参数三:舍入模式
//进一法 BigDecimal.ROUND_UP
//去尾法 BigDecimal.ROUND_FLOOR
//四舍五入 BigDecimal.ROUND_HALF_UP
BigDecimal divide2 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide2);//0.08
}
}
- 总结
- BigDecimal是用来进行精确计算的
- 创建BigDecimal的对象,构造方法使用参数类型为字符串的。
- 四则运算中的除法,如果除不尽请使用divide的三个参数的方法。