31 道 Java 核心面试题,统统打包给你( 四 )

  • static关键字表示该变量或方法是静态变量或静态方法 , 可以直接通过类访问 , 不需要实例化对象来访问 。
  • void关键字用于指定方法没有返回值 。
  • 另外 , main 关键字为方法的名字 , Java 虚拟机在执行程序时会寻找这个标识符;args 为 main 方法的参数名 , 它的类型为一个 String 数组 , 也就是说 , 在使用 java 命令执行程序的时候 , 可以给 main 方法传递字符串数组作为参数 。
     java HelloWorld 沉默王二 沉默王三
    javac命令用来编译程序 , java 命令用来执行程序 , HelloWorld 为这段程序的类名 , 沉默王二和沉默王三为字符串数组 , 中间通过空格隔开 , 然后就可以在 main方法中通过 args[0] 和 args[1] 获取传递的参数值了 。
     public class HelloWorld {
    public static void main(String[] args) {
    if ("沉默王二".equals(args[0])) {
    }
    if ("沉默王三".equals(args[1])) {
    }
    }
    }
    main 方法的写法并不是唯一的 , 还有其他几种变体 , 尽管它们可能并不常见 , 可以简单来了解一下 。
    第二种 , 把方括号 往 args 靠近而不是String 靠近:
     public static void main(String []args) { }
    第三种 , 把方括号 放在 args 的右侧:
     public static void main(String args[]) { }
    第四种 , 还可以把数组形式换成可变参数的形式:
     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 , 但一个有参数(书名) , 另外一个没有(只能读写死的一本书) 。


    推荐阅读