面试题(31-40)

匿名内部类是否可以继承其他类?是否可以实现接口?

    可以继承其他类或实现其他接口。

Java中的final关键字有哪些用法?

  • 修饰类:表示该类不能被继承
  • 修饰变量:表示变量一次赋值后不能被修改(常量)
  • 修饰方法:表示方法不能被重写

内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

    一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

指出下面程序的运行结果

class A{
  static{
    System.out.println("1");
  }

  public A() {
    System.out.println("a");
  }
}

class B extends A{
  static{
    System.out.println("2");
  }

  public B() {
    System.out.println("b");
  }
}
public class Hello {
  public static void main(String[] args) {
  A ab = new B();
  ab = new B();
  }
}

    执行结果:1a2b2b。

    创建对象时构造器的调用顺序:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。

数据类型之间的转换

  • 字符串转基本数据类型:调用基本数据类型对应的包装类中的方法parseXXX()valueOf()
  • 基本数据类型转字符串
    • 将基本数据类型与空字符串连接
    • 调用String类中的valueOf方法

如何实现字符串的反转及替换?

  • 递归方式
public static String reverse(String str) {
  //收敛条件
  if (Objects.isNull(str) || str.length() <= 1) {
    return str;
  }
  //递归公式
  return reverse(str.substring(1) + str.charAt(0));
}

怎样将GB2312编码的字符串转换为ISO=8859-1编码的字符串?

String s1 = "hello";
String s2 = new String(s1.getBytes("GB2132"),"ISO-8859-1");

什么时候使用断言?

    一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式为false,那么系统会报告一个AssertionError。断言的使用如下面的代码所示:

assert(a > 0);//throw an AssertionError if a<= 0

    断言可以有两种形式:

assert Expression1;
assert Expression1:Expression2;

    Expression1应该总是产生一个布尔值。

    Expression2可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

    要在运行时启用断言,可以在启动JVM时使用-enableassertions或者-ea标记。要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记。要在系统中启用或禁用断言,可使用-esa或者-dsa标记。还可以在包的基础上启用或禁用断言。

断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,可以考虑使用断言来阻止。

ErorrException有什么区别?

  • Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况
  • Exception表示需要捕捉或需要程序进行处理的异常,是一种设计或实现问题。即它表示如果程序正常运行,从不会发生的情况

try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

    会执行,在方法返回调用者前执行。

    在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果再finally中修改了返回值,就会返回修改后的值。

Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

    Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。

    Java的异常处理是通过5个关键字来实现的:trycatchthrowthrowsfinally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常;finally确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值