assert的作用
对某个式子进行检查,如果返回false,系统需要提供报警信息,并退出(通常在开发与测试时使用,发布后关闭)。
static关键字
1、static成员变量
虽然java里面没有全局的概念,但是可以利用static来达到全局的效果。
静态成员变量所在的类只要被加载,就可以使用这个静态变量,并且他只有一个内存地址(也就是说不管创建几个对象,静态变量都只有一个)。使用方法:类.静态变量或者实例对象.静态变量。(这两种都是引用)
2、static方法
静态方法是类的方法,无需创建对象就可以使用。
静态方法中不能使用this和super,也不能调用非静态方法,只能访问所属类的静态成员变量和成员方法。
可用于实现单例模式。实现原理是将类的构造函数声明为private,使得外部无法创建类的对象,然后声明一个静态方法,在静态方法里面调用类的构造函数,返回类的对象,这样直接调用静态方法就可以获得类的对象。
这里创建单例的方法为public static的,本质上相当于全局的。
3、static代码块
主要用来初始化静态变量,以及输出一些初始化信息。
4、static内部类
只有内部类才能被定义为static。
volatile作用
这是一个类型修饰符,用来修饰被不同线程访问和修改的变量。如果不使用这个修饰符,那么变量可能被放到缓存中,导致不同线程使用的变量的值不一样,但是如果使用这个修饰符,系统不会将变量放到缓存中,而是直接从内存读取,因此不用担心不同线程读取的值不一样。
但是,volatile会降低程序运行效率,尽量不要使用。
instanceof
用来判断左边的对象是否属于右边的类的实例,并返回boolean。
如果是返回ture,否则返回false
strictfp
全称是strict float point:精确浮点;用来确保浮点数运算的准确性。
可以给类,接口,方法在声明的时候添加strictfp,这样可以使程序严格按照IEEE的标准来进行浮点运算,否则JVM在不同的平台或者厂商的虚拟机上进行浮点运算时,结果可能不精确,可能产生不同的结果。
如果我们给类修饰为strictfp,那么类里面的所有的方法都会自动被strictfp修饰。
数据类型
原始类型:
除了上面这8种基本的数据类型以外,其他的数据类型都是引用类型(类,接口,数组)。
数据类型的取值范围是固定的,不会随着硬件环境或者操作系统而改变。
这里原始类型和封装类型存在不同,原始类型指的是上面这几个,参数传递时是按值传递,但是封装类型(比如String)是按引用传递。他们的初始值不一样,按值传递初始值如上,引用传递的初始值为null(此时变量没有分配内存)。
这里需要注意两点,分别是对于float和long类型的初始化:
对float类型初始化的时候,由于直接写的小数类型是double的,因此我们需要进行类型转换,方式有如下两种:
float f=1.0f或者F;
float f=(float)1.0;
而对long初始化时,由于直接写的整数类型是int的,因此为了防止数字超出int范围需要这样:
long l=26767676127898L;
不可变类
指的是创建了一个类的对象之后,就不允许修改它的值(成员变量)。
此外,java中所有基本类型的包装类都是不可变类(Integer,Float),以及String类。
如何创建不可变类:
1、所有类的成员变量被private修饰;
2、只提供构造函数,不提供修改成员变量的函数;
3、为保证方法不被子类覆盖,将方法定义为final或者干脆将类定义为final;
4、为了保证类的成员变量是不可变换的,防止引用传递导致改变,我们使用clone方法修改成员。
以下为重点:
按引用传递,实际上传递的是一个指针,也就是内容的内存地址。
如果我们在函数的形参为引用传递,在函数内部修改的形参的值,那么传递的地址不会变,变的只是地址指向的内存里面的值。所以ss1.append("*")这句话会修改指向的字符串的值。但是ss2=ss1这句话,直接传递了地址,这是不会修改原来ss2指向的内存的值的,因此不会修改ss2。总而言之,即使是按引用传递,在执行ss2=ss1的时候,也不会修改原来的值,按引用传递,实际上是传递的指针,只有修改指向的内存的值,才可以实现修改数据。
数据类型转换
1、自动转换
低级到高级:byte 、short、char、int、long、float、double
遵循的原则是:转化成数据容量最大的类型,从低级到高级
注:char转化为高级的时候,会转化为对应的acsii码,byte+short+short在计算式会自动转化为int(比如两个short类型相加,结果为int)。除了+=这个运算为特殊情况,这个运算不需要进行类型变换。
即short s1=1;s1=(short)s1+1 或者 short s1=1; s1+=1;
注:基本数据类型和boolean不能相互转换
2、强制类型转换
从高级转化为低级
各种取整函数
下面几个方法都是Math类的静态方法:Math.round(*),,,
round:”环绕“-四舍五入
相当于在原来的数上面增加0.5然后向下取整。最好不要按照”四舍五入“来记忆,还是用加0.5来计算,比如-11.5就返回-11,而不是-12。
ceil:“天花板”-向上取整
Math.ceil(a) 也就是取大于a的最小整数,返回值为double类。
floor:”地板“-向下取整
Math.floor(a)也就是取小于a的最大整数。返回值为double类。