面试之Java语言基础

1、标识符的命名规则

  标识符只能由数字、字母(a-z、A-Z)、下划线( _ )和$组成,并且第一个字符不能为数字。

2、instanceof关键字的作用

  用法:对象 A instanceof 类B。

  instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。注意:如果对象A为null,则返回false。

3、strictfp关键字的作用

  strictfp可以用来修饰一个类、接口或者方法,在所声明的范围内,所有浮点数的计算都是精确的。当一个类被strictfp修饰时,所有方法默认也被strictfp修饰。

4、什么是不可变类?

  不可变类:当创建了一个类的实例后,就不允许修改它的值了。特别注意:String和包装类(Integer,Float...)都是不可变类。

扩展问题1:new String("abc");创建了几个对象?

  1个或2个对象。如果常量池中原来有“abc”,那么只创建一个对象;如果常量池中原来没有字符串“abc”,那么就会创建2个对象。

扩展问题2:

  String s ="abc";

  String ss ="ab"+"c";

  System.out.pringln(s==ss);

  输出结果为:true

 解析:"ab"+"c"在编译时就被转换为“abc”。

扩展问题3:

  String s="abc";

  char [] ch={'a','b','c'};

  System.out.println(s.equals(ch));

  输出为:false

 解析:S和ch分别为字符串类型和数组类型,所以输出为false。

 5、运算符的优先级

  (++,--)>(*,/,%)>(+,-)>(<<,>>)>(&)>( | )> && > ||

public static void main(String[] args){
byte a=5;
int b=5;
int c=a>>2+b>>2;
System.out.println(c);
}
//输出是0
public static void main(String[] args){
int a=10,b=4,c=5,d=9;
System.out.println(++a*b+c*--d);
}
//输出是84

6、强制类型转换时的规则有哪些?

  1)当对小于int的数据类型(byte,char,short)进行运算时,首先会把这些类型的变量值强制转为int类型,对int类型的值进行运算,最后得到的值也是int类型的。因此如果把2个short类型的值相加,最后得到的结果是int类型,如果需要得到short类型的结果,就必须显式地运算结果转为short类型。

    例:short s1=1;s1=s1+1;

    编译出错。正确的写法是short s1=1;s1=(short)(s1+1);

    例:short s1=1;s1+=1;

    编译通过。

  2)基本数据类型和boolean类型是不能相互转换的。

  3)char类型的数据转为高级类型时,会转换为对应的ASCII码。

    例1:

    int i=1;

    if(i)

     System.out.println(i);

    编译出错。基本数据类型和boolean类型是不能相互转换的。

    例2:

    short i = 128;

    System.out.println((byte)i);

    i对应的二进制为00000000 10000000,由于byte只占一个字节,在强制转换的时候,从前面开始截掉,因此截掉后的值为二进制的10000000,也就是十进制的-128。

7、数组初始化时需要注意的问题

  1)数组被创建后会根据数组存放的数据类型默认初始化为对应的初始值,例如,int类型会初始化为0,对象类型会初始化为null。

  2)二维数组中,每行元素个数可以不同。

8、如何在main()方法执行前输出“hello world”?

  用静态代码块。静态代码块在类加载的初始化阶段就会被调用。

9、Java程序初始化的顺序(对象实例化的过程)

  1)父类的静态变量、弗雷德静态代码块(谁在前,谁先初始化)

  2)子类的静态变量、子类的静态代码块(谁在前,谁先初始化)

  3)父类的非静态变量、父类的非静态代码块(谁在前,谁先初始化)、父类的构造函数

  4)子类的非静态变量、子类的非静态代码块(谁在前,谁先初始化)、子类的构造函数

10、构造函数的特点

  1)构造函数必须和类名一样(但和类名一样的不一定是构造方法,普通方法也可以和类名同名),并且不能有返回值,返回值也不能为void。

  2)构造函数总是伴随着new操作一起调用,并且不能由程序的编写者调用,只能由系统调用。

  3)构造函数不能被继承。

  4)子类可以通过super()来显示调用父类的构造函数。

11、Switch能否用string做参数?

  在Java7之前,switch只能支持byte、short、char、int或者其对应的包装类以及Enum类型。在Java7中,String支持被加上了。

  在使用switch时,需要注意另外一个问题,如果和匹配的case情况中省略了break,那么匹配的case值后的所有情况都会执行,而不管case是否匹配,一直遇到break结束。

int x=2;
switch(x){
case 2:
    System.out.println(x);
case 3: 
    System.out.println(x);
case 4:
    System.out.println(x);
    break;
default:
    System.out.println("dddddd");     
}
输出结果为:
2
2
2

 12、接口和抽象类的区别

1)语法层面上的区别

  a. 抽象类可以提供成员方法的实现细节(注:可以只包含非抽象方法),而接口中只能存在public abstract方法,方法默认是public abstract的,但是,Java8中接口可以有default方法;

  b. 抽象类中的成员变量可以是各种类型的,二接口中的成员变量只能是public static final类型的;

  c. 抽象类可以有静态代码块和静态方法和构造方法;接口中不能含有静态代码块及静态方法以及构造方法。但是,Java8中接口可以有静态方法。

  d. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

2)设计层面上的区别

  a. 抽象层次不同。抽象类是对类的整体抽象,包括属性和行为的抽象。而接口只是对行为的抽象。

  b. 跨域不同。抽象类所体现的是一种继承关系,父类和派生类之间必须存在“is-a”关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,其设计理念是“has-a”的关系(有没有、具备不具备的关系),实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞接口,具备飞的行为,这里我们总不能说鸟和飞机共用一个父类吧!

  c. 设计层次不同。对于抽象类而言,它是自上而下来设计的,我们要先知道子类才能抽象出父类,而接口不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类,什么时候怎么实现它一概不知。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

 

你可能感兴趣的:(面试之Java语言基础)