同C++有所不同的是JAVA并不支持隐式向下转型,因为这会使得精确度降低,而JAVA中不同数据类型精度由小到大排列如下:char-->byte --> short --> int --> long --> float --> double。 但如果我们偏要向下转型会发生什么事呢
java
byte a=100;
byte c=400;//Incompatible types. Found: 'int', required: 'byte'
a+=c;
c=50;
byte d=a+c;//Incompatible types. Found: 'int', required: 'byte'
我们可以发现:当a的值在-128-127之间的时候,并不会报错,而到了400时则会。但这里d没有超过啊为了避免出现二义性,该程序不予以计算,就出现了上述结果啦~。 而在这里有些不同的是a+=c,程序并不会报错,这是因为+=隐式的将加操作的结果类型强制转换为持有结果的类型。如果两个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。
对float也是如此 必须要在小数后加个f。如果我们要将较高的int强制转化为byte时,高位的字节会丢失。如果数值过大超出int型怎么办?答案就是在整数常量后面+ l 或者L将其转换为 long常量,那么对于超级大的数字比如:1234456749143769471835, 超过long的取值范围了怎么办?答案就是调用 BigInteger BigDecimal 两个函数去解决。
而对于字符来说则有些特殊将一个字符常量赋给字符变量时,那么无论如何赋值,一旦打印结果一定是字符,字符变量在参与运算时,是以编号身份参加的,那么如何查看'我'这个字符的编码呢?直接输出 System.out.println('我'+0);
java
class test02{
public static void main(String[] args){
System.out.println('我'+0); //25105
char c= 25105;
System.out.println(c); //我
System.out.println((char)8888888); //?
}
接下来就是JAVA中的关键字:
1、final
数据:声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
-
arduino
对于基本类型,final 使数值不变;
-
arduino
对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
2、方法
-
- private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。 3、类
-
声明类不允许被继承
2、static
-
1. 静态变量
-
静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
-
实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。
-
2. 静态方法
静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。
-3. 静态语句块
静态语句块在类初始化时运行一次。
-4. 静态内部类
非静态内部类依赖于外部类的实例,而静态内部类不需要。
-5. 静态导包
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
-6. 初始化顺序 存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)
顺便一提,在运行时多态的优先级为:在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。