21xrx.com
2025-04-26 08:11:26 Saturday
文章检索 我的文章 写文章
Java面试题详解:6道经典面试题及代码分析
2023-06-16 06:12:18 深夜i     11     0
静态变量 实例变量 static 对象 共享 内存

面试是每个Java程序员必须面对的过程,而对于面试官而言,他们通常会通过一些经典的面试题来考察应聘者的知识深度和技术水平。本文将介绍6道经典Java面试题,并配有详细的代码分析。

1. Java中的静态变量和实例变量有什么区别?

静态变量指使用static关键字修饰的成员变量,其所属类的所有对象共享同一份内存;而实例变量则是指每个对象都有自己的一份内存,它们互不干扰。

示例代码:

public class Demo {
  static int staticVar = 1;
  int instanceVar = 2;
  public static void main(String[] args) {
    Demo demo1 = new Demo();
    Demo demo2 = new Demo();
    demo1.instanceVar = 3;
    System.out.println("demo1的实例变量:" + demo1.instanceVar);//输出3
    System.out.println("demo2的实例变量:" + demo2.instanceVar);//输出2
    staticVar = 4;
    System.out.println("demo1的静态变量:" + demo1.staticVar);//输出4
    System.out.println("demo2的静态变量:" + demo2.staticVar);//输出4
  }
}

2. Java中的final关键字有什么作用?

final关键字可以用来修饰成员变量、局部变量和方法,其作用主要有三种:不可修改、不可继承、不可重写。

示例代码:

public class Demo {
  final int finalVar = 1;
  public final void finalMethod() {
    System.out.println("final方法");
  }
}
public class SubDemo extends Demo
  //以上均会编译报错

关键词:final、修饰、变量、方法、不可修改、不可继承、不可重写

3. 请简述Java中的String、StringBuffer和StringBuilder的区别?

String类是不可变的,即一旦创建就不能更改;StringBuffer是可变的,可以更改其长度和内容;StringBuilder也是可变的,它是线程不安全的,但其处理速度比StringBuffer更快。

示例代码:

String str = "hello";
str = str + " world";//新创建了一个字符串对象
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");//对现有的对象进行修改,避免了新对象的创建
StringBuilder sb2 = new StringBuilder("hello");
sb2.append(" world");//与StringBuffer相似,但是不保证线程安全

关键词:String、StringBuffer、StringBuilder、不可变、可变、线程安全、速度

4. Java中的重载和重写的区别是什么?

重载是指在一个类中可以有多个同名的方法,但它们的参数类型、个数或顺序必须不同;重写是指在子类中重新定义(覆盖)其父类的方法(方法名、返回值类型、参数列表都相同)。

示例代码:

public class Demo {
  public void test() {
    System.out.println("无参方法");
  }
  public void test(int i) {
    System.out.println("有参方法");
  }
  public static void main(String[] args) {
    Demo demo = new Demo();
    demo.test();//输出:无参方法
    demo.test(1);//输出:有参方法
  }
}
public class SubDemo extends Demo {
  public void test() {
    System.out.println("子类重写了test方法");
  }
  public static void main(String[] args) {
    SubDemo subDemo = new SubDemo();
    subDemo.test();//输出:子类重写了test方法
  }
}

关键词:重载、重写、参数、顺序、覆盖、返回值

5. 如何保证线程安全?

Java中有多种方式可用于保证线程安全,如使用同步锁、volatile关键字、Atomic类、Concurrent包中的工具等。

示例代码:

public class Demo {
  private int count = 0;
  public synchronized void addCount() {
    this.count++;
  }
  public static void main(String[] args) throws InterruptedException {
    Demo demo = new Demo();
    for (int i = 0; i < 10; i++) {
      new Thread(() -> {
        for (int j = 0; j < 1000; j++) {
          demo.addCount();
        }
      }).start();
    }
    Thread.sleep(5000);
    System.out.println("count的值为:" + demo.count);//输出:count的值为:10000
  }
}

关键词:线程安全、同步锁、volatile、Atomic、Concurrent

6. Java中的反射机制是什么?

反射是指在运行时动态获取和操作类、对象、方法等信息的机制,它可以使代码更加灵活和通用,但同时也增加了安全风险,应适度使用。

示例代码:

public class Demo {
  public void test() {
    System.out.println("test方法");
  }
}
public class ReflectDemo {
  public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("Demo");
    Method method = clazz.getMethod("test");
    method.invoke(clazz.newInstance());//输出:test方法
  }
}

关键词:反射、运行时、类、对象、方法、灵活、通用、安全风险

以上就是6道经典的Java面试题及代码分析,希望对你有所帮助!

关键词:Java面试题、代码分析、静态变量、实例变量、final关键字、String、StringBuffer、StringBuilder、重载、重写、线程安全、反射机制。

  
  

评论区