javase面试题-杂项

一: 代码执行顺序

-------father--------
package practice;
public class Father {
	static {
		System.out.println("父类静态代码块");
	}
	public Father() {
		System.out.println("父类构造方法");
	}
	{
		System.out.println("父类初始化代码块");
	}
}
-------son--------
package practice;
public class Son extends Father {
	static {
		System.out.println("子类静态代码块");
	}
	public Son() {
		System.out.println("子类构造方法");
	}
	{
		System.out.println("子类初始化");
	}
	public static void main(String[] args) {
		new Son();
	}
}

解析:父类静态代码块->子类静态代码块->父类初始化代码块->父类构造方法->子类初始化代码块->子类构造
(1)首先初始化父类中的静态成员和静态代码块,按照程序出现的顺序初始化
(2)然后初始化子类中的静态成员和静态代码块,按照程序出现的顺序初始化
(3)其次初始化父类的普通成员和代码块,在执行父类的构造方法
(4)最后初始化子类的普通成员和代码块,在执行子类的构造方法
对象初始时,先给对象的属性赋默认值,然后调用构造方法
二:包装类的缓存设计

-------[-128,127]之间缓存----------
 Integer i1=new Integer(123);
		 Integer i2=new Integer(123);
		 System.out.println(i1==i2);//false
		 Integer i3=Integer.valueOf(123);
		 Integer i4=Integer.valueOf(123);
		 System.out.println(i3==i4);//true
		 Integer i5=Integer.valueOf(256);
		 Integer i6=Integer.valueOf(256);
		 System.out.println(i5==i6);//false

三:重载和重写的区别,重载的方法能否根据返回类型进行区分

不能,因为方法签名不包括返回值列表

方法头指定修饰符(例如static)、返回值类型、方法名、和形式参数。 方法头中定义的变量称为形参 (形式参数,formal
parameter 或 parameter),形参如同占位符。当方法被调用时,传递一个值给形参,此值称为实参(实际参数, actual
parameter 或 argument),形参列表指的是形参的类型、顺序和形参的数目。 方法名和形参列表共同组成方法签名。

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

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

char c='李';
System.out.println(c);//李

五:什么时候用断言(assert)?

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

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

断言可以有两种形式:
  assert Expression1;
  assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

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

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

六:==和equals的区别?
equals 和== 最大的区别是equals是方法,而另一个是运算符。
==:如果比较的是基本数据类型,比较的是数值是否相等

  int test=1;
  double test1=1;
  System.out.println(test==test1);//true

如果比较的是引用数据类型,比较的是对象的地址值是否相等
equals:在 Object 类中,这个方法将判断两个对象是否具有相同的引用。
equals不能用于基本数据类型的变量,如果没有对equals方法进行重写,则判断两个对象是否具有相同的引用。

public boolean equals(Object obj) {
        return (this == obj);
    }

六:java虚拟机在运行java代码时,首先进行的操作是:加载代码
1)编译器把java文件编译成class文件
2)java虚拟机对class文件进行加载,校验和执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值