每日一点Java基础小知识 — day7
欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,欢迎大家的点赞关注喔
-
1静态代码块 2构造代码块 3构造方法的执行顺序是:1>2>3
- 静态代码块:是在类的加载过程的第三步初始化的时候进行的,主要目的是给类变量赋予初始值
- 构造代码块:是独立的,必须依附载体才能运行,Java会把构造代码块放到每种构造方法的前面,用于实例化一些共有的实例变量,减少代码量
- 构造方法:用于实例化变量
1是类级别的,2、3是实例级别的,自然1要优先23
对子类的主动使用会导致对其父类的主动使用,所以尽管实例化的是子类,但也会导致父类的初始化和实例化,且优于子类执行
-
关于throw和throws:
- throws出现在方法头,throw出现在方法体
- throws表示出现异常的一种可能性,并不一定会发生异常;throw则是抛出了异常,执行throw则一定抛出了某种异常
- 两者都是消极的异常处理方式,只是抛出或者可能抛出异常,是不会由函数处理,真正的处理异常由它的上层调用处理
-
线程执行效率和线程优先级无关,但是高优先级线程会抢占低优先级线程资源,使得自己优先执行完毕
-
inputstream的:
close()
方法用来关闭流skip()
用来跳过一些字节mark()
用来标记流reset()
复位流
-
Thread.sleep()
和Object.wait()
,都可以抛出InterruptedException
。这个异常是不能忽略的,因为它是一个检查异常(checked exception)- checked exception:指的是编译时异常,该类异常需要本函数必须处理的,用try和catch处理,或者用throws抛出异常,然后交给调用者去处理异常
- runtime exception:指的是运行时异常,该类异常不必须本函数必须处理,当然也可以处理
Thread.sleep()抛出的InterruptException属于checked exception;IllegalArgumentException属于Runtime exception
-
关于
String.split()
方法://String split 这个方法默认返回一个数组,如果没有找到分隔符,会把整个字符串当成一个长度为1的字符串数组 private static void testStringSplit(){ String str = "12,3"; String str2 = "123"; System.out.print(str.split(",").length); // 2 System.out.print(str2.split(",").length); // 1 } }
-
牛客原题:
Boolean flag = false; if (flag = true) { System.out.println("true"); } else { System.out.println("false"); } // 最终输出结果为:true
Boolean修饰的变量为包装类型,初始化值为false,进行赋值时会先调用
Boolean.valueOf(boolean b)
方法自动装箱,然后在if条件表达式中再自动拆箱为基本数据类型,因此赋值后flag值为true,输出文本true。 如果使用==比较,则输出文本false。if的语句比较,除boolean外的其他类型都不能使用赋值语句,否则会提示无法转成布尔值 -
关于后台线程与前台线程:
- 后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程
- 前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程
-
通过阅读源码可以知道,string与stringbuffer都是通过字符数组实现的。其中string的字符数组是final修饰的,所以字符数组不可以修改。stringbuffer的字符数组没有final修饰,所以字符数组可以修改。string与stringbuffer都是final修饰,只是限制他们所存储的引用地址不可修改。至于地址所指内容能不能修改,则需要看字符数组可不可以修改
-
Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节
-
不同的编码之间是可以转换的,通常流程如下:将字符串S以其自身编码方式分解为字节数组,再将字节数组以你想要输出的编码方式重新编码为字符串。例:
String newUTF8Str = new String(oldGBKStr.getBytes("GBK"), "UTF8");
-
Java虚拟机中通常使用UTF-16的方式保存一个字符char类型
-
ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的
-
super()
必须在第一行的原因是:子类是有可能访问父类对象的,比如在构造函数中使用父类对象的成员函数和变量,在成员初始化使用了父类,在代码块中使用了父类等等,所以为保证在子类可以访问父类对象之前,一定要完成对父类对象的初始化 -
this()
必须在第一行的原因是:我们假设这样一种情况,类B是类A的子类, 如果this()
可以在构造函数的任意行使用,那么当程序运行到构造函数 B() 的第一行,发现没有调用this()
和super()
,那么就会自动在第一行补齐super()
来完成对父类对象的初始化,然后返回子类的构造函数继续执行, 当运行到构造函数 B() 的this();
时, 调用B类对象的构造函数,还会对父类对象再次初始化,这就造成了资源的浪费,以及某些意想不到的错误super()
和this()
必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中 -
无论是
this()
还是super()
指的都是对象,而static环境中是无法使用非静态变量的,因此这两个关键字都不可以在static环境中使用