• Java ——Number & Math 类 装箱 拆箱 代码块


    本节重点思维导图

     当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double

    int a = 5000;
    float b = 13.65f;
    byte c = 0x4a;

    需要使用对象,而不是内置数据类型的情形。Java 为每一个内置数据类型提供了对应的包装类

    所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类

     当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型

     

    public class Test{
     
       public static void main(String args[]){
          Integer x = 5;
          x =  x + 10;
          System.out.println(x); 
       }
    }
    /*当 x 被赋为整型值时,由于x是一个对象,所以编译器要对x进行装箱。然后,为了使x能进行加运算,所以要对x进行拆箱。 */

     Java Math类

    包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

    Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用

    System.out.println("90 度的正弦值:" + Math.sin(Math.PI/2));  
    System.out.println("0度的余弦值:" + Math.cos(0));  
    System.out.println("60度的正切值:" + Math.tan(Math.PI/3));  
    System.out.println("1的反正切值: " + Math.atan(1));  
    System.out.println("π/2的角度值:" + Math.toDegrees(Math.PI/2));  
    System.out.println(Math.PI);  

     Math方法

     

    /**
    * @author Dale
    * java中的自动装箱与拆箱
    * 简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
    */
    public class Number {
        public static void main(String[] args) {
            /**
            Integer i1 = 128;  // 装箱,相当于 Integer.valueOf(128);
            int t = i1; //相当于 i1.intValue() 拆箱
            System.out.println(t);
            */
    
            /**
            对于–128到127(默认是127)之间的值,被装箱后,会被放在内存里进行重用
            但是如果超出了这个值,系统会重新new 一个对象
            */
            Integer i1 = 200;
            Integer i2 = 200;
    
            /**
            注意 == 与 equals的区别
            == 它比较的是对象的地址
            equals 比较的是对象的内容
            */
            if(i1==i2) {
                System.out.println("true");
            } else {
                System.out.println("false");
            }
        }
    }

     int 和 Integer 的区别

    1. int 是基本数据类型,int 变量存储的是数值。Integer 是引用类型,实际是一个对象,Integer 存储的是引用对象的地址。

    2.

    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false

    因为 new 生成的是两个对象,其内存地址不同。

    3.

    int 和 Integer 所占内存比较:

    Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。

    4. 非 new 生成的 Integer 变量与 new Integer() 生成的变量比较,结果为 false。

    /**
     * 比较非new生成的Integer变量与new生成的Integer变量
     */
    public class Test {
        public static void main(String[] args) {
            Integer i= new Integer(200);
            Integer j = 200;
            System.out.print(i == j);
            //输出:false
        }
    }

    因为非 new 生成的 Integer 变量指向的是 java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同。所以输出为 false。

    5. 两个非 new 生成的 Integer 对象进行比较,如果两个变量的值在区间 [-128,127] 之间,比较结果为 true;否则,结果为 false。

    /**
     * 比较两个非new生成的Integer变量
     */
    public class Test {
        public static void main(String[] args) {
            Integer i1 = 127;
            Integer ji = 127;
            System.out.println(i1 == ji);//输出:true
            Integer i2 = 128;
            Integer j2 = 128;
            System.out.println(i2 == j2);//输出:false
        }
    }

    java 在编译 Integer i1 = 127 时,会翻译成 Integer i1 = Integer.valueOf(127)

    6. Integer 变量(无论是否是 new 生成的)与 int 变量比较,只要两个变量的值是相等的,结果都为 true。

    /**
     * 比较Integer变量与int变量
     */
    public class Test {
        public static void main(String[] args) {
            Integer i1 = 200;
            Integer i2 = new Integer(200);
            int j = 200;
            System.out.println(i1 == j);//输出:true
            System.out.println(i2 == j);//输出:true
        }
    }

    包装类 Integer 变量在与基本数据类型 int 变量比较时,Integer 会自动拆包装为 int,然后进行比较,实际上就是两个 int 变量进行比较,值相等,所以为 true。

    分装类深入

    public static void main(String[] args) {
            int a = 88;
            System.out.println(a + 3);
            System.out.println(a - 3);
            System.out.println(a * 3);
            System.out.println(a / 3);
            System.out.println(a % 3);
            System.out.println(a++);
            System.out.println(--a);
            System.out.println(a >> 3);
            
            
            Integer b = 4;
            System.out.println(b.MAX_VALUE);
            System.out.println(Integer.MIN_VALUE);
            
    
            int max = Integer.min(23, -89);
            System.out.println(max);
            String binaryString = Integer.toBinaryString(24);
            System.out.println(binaryString);
            System.out.println(Integer.toHexString(123345));
            
            char aa = Character.toUpperCase('a');
            System.out.println(aa);
        }

    代码块

    所有的Java语句都必须写到代码块中,声明语句除外。

    静态代码块

    static{
    }

    构造代码块

    {
    }

    结论:

    Ø 只要程序启动,就会运行静态代码块中的代码

    Ø 静态代码块只运行一次

    Ø 定义类的对象时,系统会依次调用静态代码块---构造代码块---构造方法

    其中,静态代码块只调用一次,构造代码块和构造方法是每new一次就调用一次

    public class Demo {
    
            public Demo() {
                System.out.println("第三个调用,new一次,调用一次");
            }
    
            {
                System.out.println("第二个调用,new一次,调用一次");
            }
            static {
                System.out.println("第一个调用,且只调用一次");
            }
    
            public static void main(String[] args) {
                new Demo();
                new Demo();
                new Demo();
            }
        }
  • 相关阅读:
    如何判断某个设备文件是否存在
    shell中export理解误区
    linux命令之tail
    国内较快的gnu镜像:北京交通大学镜像
    Cmake的交叉编译
    linux 命令之grep
    makefile之变量赋值
    makefile之VPATH和vpath的使用
    arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
    Jlink 软件断点和硬件断点
  • 原文地址:https://www.cnblogs.com/expedition/p/10851801.html
Copyright © 2020-2023  润新知