最详细的 Java 基础面试题汇总( 五 )


17. 接口和抽象类的区别是什么?

  1. 接口的方法默认是 public , 所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现) , 而抽象类可以有非抽象的方法 。
  2. 接口中除了 static、final 变量 , 不能有其他变量 , 而抽象类中则不一定 。
  3. 一个类可以实现多个接口 , 但只能实现一个抽象类 。 接口自己本身可以通过 extends 关键字扩展多个接口 。
  4. 接口方法默认修饰符是 public , 抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!) 。
  5. 从设计层面来说 , 抽象是对类的抽象 , 是一种模板设计 , 而接口是对行为的抽象 , 是一种行为的规范 。

备注:
在 JDK8 中 , 接口也可以定义静态方法 , 可以直接用接口名调用 。 实现类和实现是不可以调用的 。 如果同时实现两个接口 , 接口中定义了一样的默认方法 , 则必须重写 , 不然会报错 。

总结一下 jdk7~jdk9 Java 中接口概念的变化(相关阅读):
  1. 在 jdk 7 或更早版本中 , 接口里面只能有常量变量和抽象方法 。 这些接口方法必须由选择实现接口的类实现 。
  2. jdk8 的时候接口可以有默认方法和静态方法功能 。
  3. Jdk 9 在接口中引入了私有方法和私有静态方法 。
18. 成员变量与局部变量的区别有哪些?
  1. 从语法形式上看:成员变量是属于类的 , 而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰 , 而局部变量不能被访问控制修饰符及 static 所修饰;但是 , 成员变量和局部变量都能被 final 所修饰 。
  2. 从变量在内存中的存储方式来看:如果成员变量是使用static修饰的 , 那么这个成员变量是属于类的 , 如果没有使用static修饰 , 这个成员变量是属于实例的 。 而对象存在于堆内存 , 局部变量则存在于栈内存 。
  3. 从变量在内存中的生存时间上看:成员变量是对象的一部分 , 它随着对象的创建而存在 , 而局部变量随着方法的调用而自动消失 。
  4. 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值) , 而局部变量则不会自动赋值 。
19. 创建一个对象用什么运算符?对象实体与对象引用有何不同?new 运算符 , new 创建对象实例(对象实例在堆内存中) , 对象引用指向对象实例(对象引用存放在栈内存中) 。 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球 , 也可以系一个气球);一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球) 。
20. 什么是方法的返回值?返回值在类的方法里的作用是什么?方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果) 。 返回值的作用:接收出结果 , 使得它可以用于其他的操作!
21. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法 , 该程序能正确执行吗? 为什么?主要作用是完成对类对象的初始化工作 。 可以执行 。 因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法 。
22. 构造方法有哪些特性?
  1. 名字与类名相同 。
  2. 没有返回值 , 但不能用 void 声明构造函数 。
  3. 生成类的对象时自动执行 , 无需调用 。
23. 静态方法和实例方法有何不同
  1. 在外部调用静态方法时 , 可以使用"类名.方法名"的方式 , 也可以使用"对象名.方法名"的方式 。 而实例方法只有后面这种方式 。 也就是说 , 调用静态方法可以无需创建对象 。
  2. 静态方法在访问本类的成员时 , 只允许访问静态成员(即静态成员变量和静态方法) , 而不允许访问实例成员变量和实例方法;实例方法则无此限制 。