1.接口和抽象的区别
抽象类可以有构造方法 接口不行
抽象类可以有普通成员变量 接口没有
抽象类可以有非抽象的方法 接口必须全部抽象
抽象类的访问类型都可以 接口只能是 public abstract
一个类可以实现多个接口 但只能继承一个抽象类
2.Super面试题
题一
import java.util.Date;
public class Test extends Date{
public static void main(String[] args) {
new Test().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}
返回的结果是 Test
因为super.getClass().getName() 调用了父类的 getClass() 方法, 返回当前类
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName()
题二
public abstract class Car {
String name = "Car";
public String getName(){
return name;
}
public abstract void demarre();
}
public class B extends Car{
String name = "B";
public String getName(){
return name;
}
public void demarre() {
System.out.println(getName() + " demarre");
}
}
public class C extends B{
String name = "C";
public String getName(){
return name;
}
public void demarreWithSuper() {
System.out.println(super.getName() + " demarre");
}
public void demarreNoSuper() {
System.out.println(getName() + " demarre");
}
}
public class D extends B{
public String getName(){
return name;
}
public void demarreNoSuper() {
System.out.println(getName() + " demarre");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.demarre();
Car bCar = new B();
bCar.demarre();
C c = new C();
c.demarre(); // c 里并没有定义这个函数
c.demarreWithSuper();
c.demarreNoSuper();
D d = new D();
d.demarre();
transfer(c); // TransferC
transfer((B)c); // TransferB
transfer(d); // TransferB
}
public static void transfer(B b){
System.out.println("TransferB");
b.demarre();
}
public static void transfer(C c){
System.out.println("TransferC");
c.demarre();
}
}
}
输出是 B demarre B demarre C demarre B demarre C demarre B demarre TransferC C demarre TransferB C demarre TransferB B demarre
3.Static 关键字
Static 关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例的情况下直接被访问。
声明为 static 的方法有以下几条限制:
- 仅能调用其他的 static 方法。
- 只能访问 static 变量。
- 不能以任何方式引用 this 或 super。
- 不能被覆盖。
是否可以 override 一个 static 的方法?
不能被覆盖. 因为方法覆盖是基于运行时动态绑定的, 而 static 方法是编译时静态绑定的。
4.equals() 与 hashcode()
-
equals
- 默认的方法是
public boolean equals(Object obj) {
return (this == obj);
}
默认情况下比较的还是对象的地址. 所以如果把对象放入Set中等操作,就需要重写eqaul方法了,重写之后的 equals() 比较的就是对象的内容了。
5.== 和 equal 的区别
暂时未写,需整理。