javaMath-System-Object(toString-equals)

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 + BSystem.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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值