面试题(21-30)

char型变量中能不能存储一个中文汉字,为什么?

    可以

    Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编码,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

抽象类和接口有什么异同?

  • 实例化:抽象类和接口都不能被实例化,但可以定义抽象类和接口类型的引用
  • 实现抽象方法:一个类继承或实现了某个抽象类或接口都需要实现其中所有的抽象方法,否则该类仍然需要被声明为抽象类
  • 接口比抽象类更加抽象:抽象类可以定义构造器、抽象方法和具体方法;接口不能定义构造器,接口中的方法全部都是抽象方法(public abstract
  • 类的成员:抽象类的成员可以是private默认protectedpublic的,而接口中的成员全都是public
  • 成员变量:抽象类可以定义成员变量,而接口类中定义的成员变量实际上都是常量(public static final
  • 抽象方法和抽象类的关系:有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同

  • 静态嵌套类是被声明为静态(static)的内部类,可以不依赖于外部类被实例化
  • 内部类需要在外部类实例化后才能实例化

下面的代码哪些地方会产生编译错误?

public class Outer{
  class inner {
  }
  public static foo() {
    new Inner();
  }
  public static void main(String[] args) {
    new Inner();
  }
}

    Java中非静态内部类对象的创建要依赖其外部类对象,上面代码中foo和main方法都是静态方法,静态方法没有this,也就是说没有所谓的外部类对象 ,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:

new Outer().new Inner();

Java中会存在内存泄漏吗,请简单描述

    理论上Java因为有垃圾回收机制(GC)不会存在内存泄漏问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄漏的发生。

    例如hibernate的一级缓存(Session)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不即使关闭(close)或清空(clear)一级缓存就可能导致内存泄漏。下面例子中的代码也会导致内存泄漏:

import java.util.Arrays;
import java.util.EmptyStackException;

public class MyStack<T> {

  private T[] elements;
  private int size = 0;

  private static final int INIT_CAPACITY = 16;

  public MyStack() {
    this.elements = (T[])new Object[INIT_CAPACITY];
  }

  public void push(T ele) {
    ensureCapacity();
    this.elements[size++] = ele;
  }

  public T pop() {
    if (size == 0) {
      throw new EmptyStackException();
      return elements[--size];
    }
  }
  
  private void ensureCapacity() {
    if (this.elements.length == size) {
      this.elements = Arrays.copyOf(elements, 2 * size + 1);
    }
  }
}

    上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄漏的问题,当我们用pop方法弹出栈中的对象是,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄漏是很隐蔽的,这种内存泄漏其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来 了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发DiskPaging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError

抽象方法是否可同时是静态的,是否可同时是本地方法,是否可同时被synchronized修饰?

    都不能。

  • 抽象方法需要子类重写,静态方法无法被重写
  • 本地方法是由本地代码(如C语言)实现的方法,而抽象方法是没有实现的
  • synchronized和方法的实现细节有关,抽象方法不涉及实现细节

阐述静态变量和实例变量的区别

  • 静态变量(类变量)是被static修饰符修饰的变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝
  • 静态变量可以实现让多个对象共享内存
  • 实例变量必须依存于某一个实例,需要先创建对象,然后通过对象才能访问它

是否可以从一个静态方法内部发出对非静态方法的调用

    不可以。静态方法只能访问静态成员,非静态方法的调用需要先创建对象,在调用静态方法时可能对象并没有被初始化。

接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承具体类?

  • 接口可继承接口,而且支持多重继承
  • 抽象类可实现接口,可以继承具体类,也可以继承抽象类

一个.java源文件中是否可以包含多个类?有什么限制?

    可以,但一个源文件中最多只能有一个公开类(public class),而且文件名必须和公开类的类名完全一致。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值