第四种,还可以把数组形式换成可变参数的形式:
public static void main(String...args) { }第五种,在 main() 方法上添加另外一个修饰符 strictfp,用于强调在处理浮点数时的兼容性:
public strictfp static void main(String[] args) { }也可以在 main() 方法上添加 final 关键字或者 synchronized 关键字。
第六种,还可以为 args 参数添加 final 关键字:
public static void main(final String[] args) { }第七种,最复杂的一种,所有可以添加的关键字统统添加上:
final static synchronized strictfp void main(final String[] args) { }当然了,并不需要为了装逼特意把 main() 方法写成上面提到的这些形式,使用 IDE 提供的默认形式就可以了。
18、Java 的重写(Override)和重载(Overload)有什么区别?先来看一段重写的代码吧。
class LaoWang{public void write() {
System.out.println("老王写了一本《基督山伯爵》");
}
}
public class XiaoWang extends LaoWang {
@Override
public void write() {
System.out.println("小王写了一本《茶花女》");
}
}
重写的两个方法名相同,方法参数的个数也相同;不过一个方法在父类中,另外一个在子类中。就好像父类 LaoWang 有一个 write() 方法(无参),方法体是写一本《基督山伯爵》;子类 XiaoWang 重写了父类的 write() 方法(无参),但方法体是写一本《茶花女》。
来写一段测试代码。
public class OverridingTest {public static void main(String[] args) {
LaoWang wang = new XiaoWang();
wang.write();
}
}
大家猜结果是什么?
小王写了一本《茶花女》在上面的代码中,们声明了一个类型为 LaoWang 的变量 wang。在编译期间,编译器会检查 LaoWang 类是否包含了 write() 方法,发现 LaoWang 类有,于是编译通过。在运行期间,new 了一个 XiaoWang 对象,并将其赋值给 wang,此时 Java 虚拟机知道 wang 引用的是 XiaoWang 对象,所以调用的是子类 XiaoWang 中的 write() 方法而不是父类 LaoWang 中的 write() 方法,因此输出结果为“小王写了一本《茶花女》”。
再来看一段重载的代码吧。
class LaoWang{public void read() {
System.out.println("老王读了一本《Web全栈开发进阶之路》");
}
public void read(String bookname) {
System.out.println("老王读了一本《" + bookname + "》");
}
}
重载的两个方法名相同,但方法参数的个数不同,另外也不涉及到继承,两个方法在同一个类中。就好像类 LaoWang 有两个方法,名字都是 read(),但一个有参数(书名),另外一个没有(只能读写死的一本书)。
来写一段测试代码。
public class OverloadingTest {public static void main(String[] args) {
LaoWang wang = new LaoWang();
wang.read();
wang.read("金瓶");
}
}
这结果就不用猜了。变量 wang 的类型为 LaoWang,wang.read() 调用的是无参的 read() 方法,因此先输出“老王读了一本《Web全栈开发进阶之路》”;wang.read("金瓶") 调用的是有参的 read(bookname) 方法,因此后输出“老王读了一本《金瓶》”。在编译期间,编译器就知道这两个 read() 方法时不同的,因为它们的方法签名(=方法名称+方法参数)不同。
简单的来总结一下: