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 + b 和 a += b 的结果是相同的,但是在一些情况下会有不同的行为。例如,如果 a 和 b 都是字符串类型,则 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移位运算符:
当我们对一个二进制数进行移位操作时,相当于将二进制数的每一位向左或向右移动指定的位数。下面是一些简单的例子:
左移运算符(<<):将左侧操作数向左移动指定数量的位数,并在右侧用零填充空缺位。
int a = 4; // 二进制数为 100
int b = a << 2; // 左移 2 位,得到 10000,即十进制数为 16
右移运算符(>>):将左侧操作数向右移动指定数量的位数,并在左侧用符号位填充空缺位。
int a = 16; // 二进制数为 10000
int b = a >> 2; // 右移 2 位,得到 100,即十进制数为 4
无符号右移运算符(>>>):无符号右移运算符(>>>):将左侧操作数向右移动指定数量的位数,并在左侧用零填充空缺位
int a = -16; // 二进制数为 11111111111111111111111111110000
int b = a >>> 2; // 无符号右移 2 位,得到 00111111111111111111111111111100,即十进制数为 1073741820