1.不要随意设置随机数种子
如果不设置随机种子,则同一个台机器,每次打印都不一样
但是如果设置,同一台机器,每次打印都一样
Random r = new Random();
for (int i = 0; i <3 ; k++) {
System.out.println("第"+i+"次随机数"+r.nextInt());
}
Random r = new Random(100);
for (int k = 0; k <3 ; k++) {
System.out.println("第"+k+"次随机数"+r.nextInt());
}
原因是:
如果不设置种子,每次都初始化;如果设置,则取种子初始化的随机数,所以不变。
源码如下:
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
2.静态方法不能重写只能隐藏
public class Base {
public static void staticMethond(){
System.out.println("父类静态方法");
}
public void noStaticMethond(){
System.out.println("父类非静态方法");
}
}
public class Sub extends Base {
@Override
public void noStaticMethond() {
System.out.println("子类非静态方法");
}
//不能@Override
public static void staticMethond() {
System.out.println("父类静态方法");
}
}
public class Main {
public static void main(String[] args){
Base base = new Sub();
base.noStaticMethond();
base.staticMethond();
}
}
打印结果:
子类非静态方法
父类静态方法
3.利用构造代码块精简代码
构造代码块在调用构造函数之前会被执行(不论有参构造,无参构造)遇到this不插入
可以使用场景:
1).初始化实例变量
如果每个构造函数都需要初始化变量,可以通过构造代码块来实现。
2).初始化实例环境
如果实例初始化必须在某个场景下,可以在构造代码块中判断