java面试题-语法基础

1.面向对象特性:

面向对象编程有三个核心特性:封装、继承和多态。其中封装可以通过访问控制符来实现,例如:

public class MyClass {
  private int myVar;

  public int getMyVar() {
    return myVar;
  }

  public void setMyVar(int value) {
    myVar = value;
  }
}

上面的代码中,myVar 被声明为私有变量,可以通过 getMyVar()setMyVar() 方法来访问和修改。这就实现了封装。

2.a = a + b 与 a += b 的区别:

a = a + ba += b 的结果是相同的,但是在一些情况下会有不同的行为。例如,如果 ab 都是字符串类型,则 a += b 等价于 a = a.concat(b),而 a = a + b 则会创建一个新的字符串对象。

3.3*0.1 == 0.3 将会返回什么? true 还是 false?

由于浮点数在计算机中是以二进制表示的,因此在进行浮点数运算时可能会存在精度误差。因此,3*0.1 的结果可能会略微偏离理论值 0.3。这个表达式的结果应该是 false

4.能在 Switch 中使用 String 吗?

从Java 7开始,可以在 switch 语句中使用字符串,例如:

String str = "hello";
switch (str) {
  case "hello":
    System.out.println("Hello!");
    break;
  case "world":
    System.out.println("World!");
    break;
  default:
    System.out.println("Unknown string!");
    break;
}

5.对equals()和hashCode()的理解:

equals() 方法用于比较两个对象是否相等,而 hashCode() 方法用于获取对象的哈希码。在Java中,如果两个对象相等,则它们的哈希码也必须相等,因此通常需要同时重写 equals()hashCode() 方法。

例如,下面是一个简单的自定义类的示例,它重写了 equals()hashCode() 方法:

public class Person {
  private String name;
  private int age;

  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (this == obj) {
      return true;
    }
    if (obj instanceof Person) {
      Person other = (Person)obj;
      return this.name.equals(other.name) && this.age == other.age;
    }
    return false;
  }

  public int hashCode() {
    int result = 17;
    result = 31 * result + name.hashCode();
    result = 31 * result + age;
    return result;
  }
}

6.final、finalize 和 finally 的不同之处:

  • final:关键字,可以用于修饰类、方法、变量等,表示其值不可改变或其实例不可被继承。

  • finalize():方法,用于在垃圾回收器回收对象之前执行一些必要的清理工作。

  • finally:关键字,用于在 try-catch 语句块中定义必须被执行的代码块,无论异常是否被捕获

7.String、StringBuffer与StringBuilder的区别:

  • String:不可变的字符串对象,每次对其进行修改都会创建一个新的对象。

  • StringBuffer:可变的字符串对象,线程安全,适用于多线程环境。

  • StringBuilder:可变的字符串对象,非线程安全,适用于单线程环境,性能比 StringBuffer 更好。

8.接口与抽象类的区别:

  • 接口可以定义方法、常量和默认方法,而抽象类可以定义方法、变量和构造方法。

  • 类可以实现多个接口,但只能继承一个抽象类。

  • 接口中的方法默认是 public 和 abstract 的,而抽象类中的方法可以有不同的访问控制符和实现。

9.this() & super()在构造方法中的区别:

  • this():调用本类中的另一个构造方法。必须在构造方法的第一行调用。

  • super():调用父类中的构造方法。如果没有显式调用,则会隐式调用父类的默认构造方法。

10.Java移位运算符:

当我们对一个二进制数进行移位操作时,相当于将二进制数的每一位向左或向右移动指定的位数。下面是一些简单的例子:

  1. 左移运算符(<<):将左侧操作数向左移动指定数量的位数,并在右侧用零填充空缺位。

int a = 4;   // 二进制数为 100
int b = a << 2;   // 左移 2 位,得到 10000,即十进制数为 16
  1. 右移运算符(>>):将左侧操作数向右移动指定数量的位数,并在左侧用符号位填充空缺位。

int a = 16;   // 二进制数为 10000
int b = a >> 2;   // 右移 2 位,得到 100,即十进制数为 4
  1. 无符号右移运算符(>>>):无符号右移运算符(>>>):将左侧操作数向右移动指定数量的位数,并在左侧用零填充空缺位

int a = -16;   // 二进制数为 11111111111111111111111111110000
int b = a >>> 2;   // 无符号右移 2 位,得到 00111111111111111111111111111100,即十进制数为 1073741820

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值