参考文档1

int类型溢出

  1. PS D:\Document\Java20210111\code\day02> javac .\IdentifierTest.java
  2. .\IdentifierTest.java:4: 错误: 整数太大
  3. int 学号 = 17180210019;
  4. ^

image.png

从这两个报错中能看出,Java整型默认是int类型,如果超过int类型就要显示地在数的末尾加L或l表示这是一个long类型的整数

编码错误

image.png

命令行默认编码是GBK,而要编译的源文件编码格式为UTF-8,所以会出错

关于三元运算符

image.png

  1. Object o1 = true ? new Integer(1) : new Double(2.0);
  2. System.out.println(o1);//1.0 结果是1.0说明了三元运算符自动类型转换这件事。
  3. /*
  4. 三元运算符要求冒号前后两者类型能够统一,
  5. 统一有两种情况:
  6. 要么都是基本数据类型,能够进行自动类型转换
  7. 要么都是引用数据类型,但必须满足子父类关系
  8. 上述语句Integer和Double类显然不是子父类关系,就会进行自动拆箱变成基本数据类型再进行自动类型转换
  9. 得到的结果再自动装箱赋给o1.
  10. */
  11. Object o2;
  12. if (true)
  13. o2 = new Integer(1);
  14. else
  15. o2 = new Double(2.0);
  16. System.out.println(o2);//1 这就毫无悬念

变量自增又赋给自己

屏幕截图 2021-01-15 221057.jpg

结果i=1;为什么呢? 先赋值,把i原来的值重新赋值给i,不变,然后i自增,但是这个自增后的值没有在放回变量i的位置

数组打印

image.png

这里字符型数组打印出了字符串,很神奇。 其实是方法重载的问题,除了char型外其他基本数据类型数组作为println的参数传进去都是调用println(Object[])方法,而char[]传进去调用的是println(char[])

包装类

  1. public void method1() {
  2. Integer i = new Integer(1);
  3. Integer j = new Integer(1);
  4. System.out.println(i == j); //flase
  5. Integer m = 1;
  6. Integer n = 1;
  7. System.out.println(m == n);//true
  8. Integer x = 128;
  9. Integer y = 128;
  10. System.out.println(x == y);//false
  11. }

同样的操作,第7行结果是true而第10行结果是false,为什么呢? 因为Integer类内有个内部静态类IntegerCache,其中缓存了从-128至127的Integer类型数组,当自动装箱的int值在这个范围内时直接指向该数组中对应的包装类对象,而不是在堆中新开辟。 这有点类似于String类直接赋值,但又不太一样

父类与接口属性重名

问题如下:C类继承B实现A,A和B中都有名叫x的属性,问题来了,在C中用x会出现摸棱两可的情况。怎么解决呢?

  1. interface A {
  2. int x = 0;
  3. }
  4. class B {
  5. int x = 1;
  6. }
  7. class C extends B implements A {
  8. public void pX() {
  9. // System.out.println(x);//The field x is ambiguous
  10. }
  1. class C extends B implements A {
  2. public void pX() {
  3. // System.out.println(x);//The field x is ambiguous
  4. System.out.println(super.x); //1
  5. System.out.println(A.x); //0
  6. }

方法重载

  1. package zdkk.test;
  2. /**
  3. * @author: zdkk
  4. * @data: 2021/3/25
  5. * @time: 14:59
  6. * @package: zdkk.test
  7. 1.8
  8. */
  9. class MethodReloadDemo
  10. {
  11. public static void print(int n)
  12. {
  13. System.out.println(n);
  14. }
  15. public static void print(short n)
  16. {
  17. System.out.println(n);
  18. }
  19. public static void print(Integer n)
  20. {
  21. System.out.println(n);
  22. }
  23. public static void print(String s)
  24. {
  25. System.out.println(s);
  26. }
  27. public static void main(String[] args)
  28. {
  29. MethodReloadDemo.print(1);
  30. MethodReloadDemo.print((byte)1);
  31. MethodReloadDemo.print("1");
  32. // MethodReloadDemo.print(null); //error
  33. }
  34. }

在第一种情况下,1 是 int。我们有个完全匹配的方法带 int。此时会调用第一个 void print(int n)
在第二种情况下,我们没有带 byte 的方法。但有两个方法分别带 short 和 int。在类型拓宽规则基础上,byte 会首先拓宽为 short,然后拓宽为 int。因此,判定会调用 void print(short n)
在第三种情况下,我们有一个完全匹配的方法带 String。此时会调用 void print(String s)
第四种情况是模棱两可的。null 没有特定类型。编译程序将拒绝编译这个代码。在这种情况下,我们要编写 Cat.print((Integer)null) 来调用第三个方法,并且用 Cat.print((String)null) 来调用第四个方法。

  1. package zdkk.test;
  2. /**
  3. * @author: zdkk
  4. * @data: 2021/3/25
  5. * @time: 15:05
  6. * @package: zdkk.test
  7. 1.8
  8. */
  9. public class MethodReloadDemo2 {
  10. public static void print(Object o)
  11. {
  12. System.out.println(o);
  13. }
  14. public static void print(String s)
  15. {
  16. System.out.println(s);
  17. }
  18. public static void main(String[] args)
  19. {
  20. MethodReloadDemo2.print(1); //调用print(Object o)
  21. MethodReloadDemo2.print(null); //调用print(String s)
  22. MethodReloadDemo2.print((Object) null); //调用print(Object o)
  23. }
  24. }