Math
概述
- 软件包是java.lang 所以使用它不需要导包
- public final class Math 表示Math是最终类,不能被继承
- 任何类都直接或间接继承于Object类
- Math类包含执行基本数字运算的方法
- Math类中没有构造方法,且成员变量和成员方法都是用static修饰的(也就是静态的),可以直接使用类名进行访问。
常用方法(9)
方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小整数,显示为double类型,xxx.0 |
public static double floor(double a) | 返回小于或等于参数的最小整数,显示为double类型,xxx.0 |
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 static double sqrt(double a) | 返回double值的正确舍入的正平方根 |
案例:
// 126-test6
public class MathDemo {
public static void main(String[] args) {
System.out.println(Math.abs(88));//88
System.out.println(Math.abs(-88));//88
System.out.println("-------------");
System.out.println(Math.ceil(12.33));//13.0
System.out.println(Math.ceil(12.55));//13.0
System.out.println("--------------");
System.out.println(Math.floor(12.33));//12.0
System.out.println(Math.floor(12.55));//12.0
System.out.println("--------------");
System.out.println(Math.min(5, 10));//5
System.out.println(Math.max(5, 10));//10
System.out.println("---------------");
System.out.println(Math.round(12.55));//13
System.out.println(Math.round(12.33));//12
System.out.println(Math.round(-1.5));//-1
System.out.println(Math.round(-1.2));//-1
System.out.println(Math.round(-1.8));//-2
System.out.println("----------------");
System.out.println(Math.pow(2.0, 3.0));//8.0
System.out.println(Math.random());
}
}
分析:
- 关于Math.round(负数)的情况,在数轴上0.5是向右取整,也就是向大的方向,所以1.5 =》 2.0 ,-1.5 =》-1.0
-1.2 =》 -1.0,-1.8 =》-2
Math.round()的底层算法是:Math.floor(x+0.5),也就是执行x+0.5后再向下取整。-1.5+0.5=-1 向下取整就是-1
System
概念
- 软件包是java.lang,说明不用导包
- public final class System 说明System是最终类,不能被继承
- System类包含几个有用的类字段和方法,并且不能被实例化,也就是不能通过System类创建对象
- System类中的所有成员都被static修饰,可以直接通过 System.成员访问
常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位)= 当前时间与1970年之间的毫秒值 |
案例:
System.out.println("开始");
// 调用exit方法,不会输出结束两个字,因为运行exit之后,java虚拟机就关了
System.exit(0);
System.out.println("结束");
// 不调用exit方法,则输出 开始、结束字样。
//System.currentTimeMillis() 的应用
System.out.println(System.currentTimeMillis());
// 看现在时间距离1970年有多少
System.out.println(System.currentTimeMillis()*1.0 / 1000/60/60/24/365);
//计算一段程序耗时多长时间
long start = System.currentTimeMillis();
for(int i = 0; i<10000;i++){
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("耗时: " + (end-start) + "毫秒");//386 视频中是87
Object
概述
- 软件包 java.lang,所以使用不用导包
- public class Object 可以被继承
- 类Object 是类层次结构的根,每个类都有Objcet作为父类(超类),所有对象(包括数组)都实现了这个类的方法。
- 有无参构造方法Object()。子类访问父类的构造方法,默认第一行是super(),是一个空参的,默认访问父类的无参构造方法。原因是:它们的顶级父类Object类只有无参构造方法。
常用方法
方法名 | 说明 |
---|---|
public String toString() | 返回对象的字符串表示形式; 建议所有子类重写该方法,自动生成,快捷键是alt + insert |
public boolean equals(Object obj) | 比较对象是否相等; 默认比较地址,重写可以比较内容,自动生成alt + insert |
toString方法
①看方法的源码,选中方法,按下ctrl + B
②System.out.println(对象名) ;
对象名.toString
这种方式输出的内容不是能看的懂的内容,建议在创建类的时候,直接重写toString方法
toString方法的重写 快捷键 = alt + insert
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
s.setName("汪苏泷");
s.setAge(33);
System.out.println(s);//com.itheima130.test2.Student@1b6d3586
//说明println方法底层调用的还是toString方法。
System.out.println(s.toString());//com.itheima130.test2.Student@1b6d3586
//上述两者输出内容一致
// 此时输出s的内容是看不懂的内容。一般的方式是重写toString方法,在Student类中
//在Student类中重写toString方法后,输出内容为Student{name='汪苏泷', age=33}
//输出内容是这个 具体的原因是:
/*
public void println(Object x) {
//传入的对象名s 则表示x = s
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
public static String valueOf(Object obj) {//obj = s
return (obj == null) ? "null" : obj.toString();
//判断obj 也就是 s 是不是等于null 因为s是new Student出来的结果,所以不能是null,则表达式的结果是obj.toString
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//案例输出是:com.itheima130.test2.Student@1b6d3586
}
}*/
}
}
equals方法
equals ①基本数据类型比较,看值是否相等;②引用数据类型,比较对象地址是否相等。要想比较对象的值,需要重写equals方法。
案例:
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("汪苏泷");
s1.setAge(33);
Student s2 = new Student();
s2.setName("汪苏泷");
s2.setAge(33);
//比较两个对象内容是否相同
System.out.println(s1 == s2);//false
//原因:类创建对象,对象名在栈内存中表示是堆内存中对象存储区域的地址,对象不同,则对应的地址就不同,所以s1和s2不一样
System.out.println(s1.equals(s2));//false
//原因:
/* public boolean equals(Object obj) {
//解释:方法中的this ==》 表示调用的对象 案例中是s1
传入的对象obj ==》 s2
return (this == obj);
比较的还是两个对象的地址
}
*/
//要想实现比较对象的内容是否相等 重写equals方法即可
//自动生成即可 alt + insert
//修改之后 可以实现对象内容是否相等的比较
}
}
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
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 boolean equals(Object o) {
// 执行s1.equals(s2)
// 那么方法中的this==》s1;o ==》 s2
// 判断this 和 o 的地址是否相同,相同则返回true
if (this == o) return true;
// 逻辑或 (前)判断o是否为null
// (后)getClass拿的是对象的字节码文件,简单来说就是判断这两个对象是否来自同一个类
if (o == null || getClass() != o.getClass()) return false;
//向下转型,将对象o强制转换为Student类型
Student student = (Student) o;
// 比较年龄是否相同,age表示的this.age ==》 s1.age 而student.age ==》 s2.age 不相等则返回false
if (age != student.age) return false;
//比较名字是否相同,name表示是this.name 先判断是否为null,不为null再使用【字符串1.equals(字符串2)】比较name字符串是否相等
return name != null ? name.equals(student.name) : student.name == null;
}
}