java面试题集锦(1)

栏目:新闻 来源:齐鲁网 时间:2019-11-13

01:

Path与classPath的区别?

配置环境变量Path是为了让 .Java文件在任意目录下都可以编译.

配置classPath是为了让 .class文件在任意目录下都可以运行.

02:

1.看下面程序是否有问题,如果有问题,指出并说明理由.

byte b1 = 3;

byte b2 = 4;

byte b3 = b1 + b2;

从两方面去回答这个题

b1和b2是两个变量,变量里面存储的值都是变化的,

所以在程序运行中JVM是无法判断里面具体的值

byte类型的变量在进行运算的时候,会自动类型提升为int类型

byte b4 = 3 + 4;

3和4都是常量,java有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了

2.问哪句会报错,为什么?

byte b = 10;

b++;

b = b + 1;

答:第三句会报错,因为b是byte类型的,而1是int类型的,相加结果应该为int类型的.

而第二句不会报错是因为++的过程中系统会执行一个强制类型转换的过程

b++ 即 b = (byte)(b + 1);所以不会报错.

3.看下面程序是否有问题,如果有,请指出并说明理由.

short s = 1;s = s + 1;

short s = 1;s += 1;

答:第一句有问题,s=s+1;中s是short类型的,而1是int类型的,相加结果应该为int类型.

第二句没有问题,因为+=的过程中隐藏了一个强制类型转换的过程

s+=1 即 s=(short)s+1;

注意题:

System.out.println('0'+"aa"+47);//结果是0aa47(只要字符与字符串之间没有可以运算的字符

那么就都是连接.)

System.out.println('0'+47+"aa");//结果是95aa

03:

1.请实现两个整数的交换.(不定义第三方变量)

int x=3;

int y=4;

x = x^y;//3^4

y = x^y;//3^4^4=3

x = x^y;//3^4^3=4

System.out.pritnln("x="+x+",y="+y);

2.最有效率的算出2*8的结果?

2 * 2 ^ 3

System.out.println(2<<3);(意思是把2左移3位)

解:2

00000000 00000000 00000000 00000010(2的原码反码和补码)

(000)00000 00000000 00000000 00000010000(2左移3位后的原反补)

16 (2*8的结果)

3.

byte可以作为switch的表达式吗?//可以

long可以作为switch的表达式吗?//不可以

String可以作为switch的表达式吗?//JDK1.7后可以(JDK1.5之后可以是枚举)

05:

Java中到底是传值还是传址?

答:

1.既是传值,又是传地址.基本类型是传值,引用类型是传址.

2.Java中只有传值,因为地址值也是值(出去面试说这种,支持者是詹姆斯高斯林(Java之父)).

06:

谈谈你对面向对象的理解

答:?????

08:

1,看程序,写结果

class Student {

static {

System.out.println("Student 静态代码块");

}

{

System.out.println("Student 构造代码块");

}

public Student() {

System.out.println("Student 构造方法");

}

}

class Demo2_Student {

static {

System.out.println("Demo2_Student静态代码块");

}

public static void main(String[] args) {

System.out.println("我是main方法");

Student s1 = new Student();

Student s2 = new Student();

}

}

结果是:Demo2_Student静态代码块

我是main方法

Student 静态代码块

Student 构造代码块

Student 构造方法

Student 构造代码块

Student 构造方法

总结:

执行顺序是:(有继承关系)

先执行静态代码块(静态代码块在类中方法外,用static修饰.

随着类加载而执行,并且只执行一次,用于给类进行初始化)

因为加载子类之前,需要先加载父类.

而构造代码块是多个构造方法中重复的代码,被提到类中方法外.所以会在构造方法之前执行.

并且每执行一次构造方法都会先执行一次构造代码块.

最后执行子类中的代码块(先执行子类的构造代码块,因为构造方法是为了给对象进行初始化,是随着对象的创建而调用,所以后执行)

2,方法重写

override和overload的区别?overload能改变返回值类型吗?

overload可以改变返回值类型,只看参数列表.

方法重写:子类中出现了和父类中方法声明一模一样的方法,与返回值类型有关.返回值是一致的(或是子父类)

方法重载:本类中出现方法名相同,参数列表不同,与返回值无关的方法.

子类对象调用方法的时候:先找子类本身,再找父类.(看子类中有没有要调用的方法,如果没有再找父类)

09:

1,面试题:

抽象类与接口的区别:

(1).

接口中的成员变量默认用public static final修饰,只能是常量.

接口中的成员方法默认用public abstract修饰,只能是抽象方法.

抽象类中的成员变量可以是常量,也可以是变量.

(2).

抽象类中有成员变量,有构造方法,有成员方法;

但接口中有成员变量,成员方法,但没有构造方法.

(3).

抽象类只能单继承;但接口可以多实现.

抽象类里可以有抽象方法也可以没有,但如果一个类中有抽象方法,那么这个类就必须定义为抽象类.

2,面试题:

一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

答:可以.这么做的目的只有一个,就是不想让其他的类创建对象,要交给子类完成

3,面试题:

abstract不能和哪些关键字共存

A:static:

被static修饰的可以通过类名去调用,但通过类名调用抽象类没有什么意义,因为抽象类里的方法没有方法体.

B:final:

被final修饰的方法不能被重写,被abstract修饰的方法强制子类重写.

C:private:

被private修饰的方法只能在本类中被访问,被abstract要求子类进行重写.

10:

1,package,import,class有没有顺序关系?

答:有顺序.package语句必须放在程序的第一条可执行语句.

import放在类定义之前,package之后.

之后才是定义class.

2,匿名内部类面试题:

按照要求,补齐代码

interface Inter { void show(); }

class Outer { //补齐代码 }

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

要求在控制台输出”HelloWorld”

分析:这是链式编程的形式.method方法用Outer调用,说明此方法是用静态修饰的方法

后面跟着再次调用了一个方法,说明前面返回的是一个对象,而show方法又是接口Inter的抽象方法,所以返回的对象是Inter接口的,代码如下:

interface Inter { void show(); }

class Outer {

public static Inter method() {

Inter i = new Inter() {

public void show() {

System.out.println("helloworld");

}

}

/*return new Inter() {

public void show() {

System.out.println("helloworld");

}

};*/ //返回匿名对象的子类对象,并调用方法

}

}

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

3,内部类分为:

成员内部类

静态成员内部类

局部内部类:局部内部类访问局部变量必须用final修饰

匿名内部类:是怎样使用的?

A:当做参数传递

????B:存在一个接口或者类(具体类,抽象类都可)中,通过实现接口,重写方法实现匿名内部类的调用.

4,内部类是如何调用外部类成员的,包括私有:

直接调用:内部类.this.属性

11:

面试题:==号和equals的区别:

答:==号是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,

基本数据类型比较的是值,引用数据类型比较的是地址值.

equals方法是一个方法,只能比较引用数据类型,所有对象都会继承Object

类中的方法,如果没有重写Object类中的equals方法,equals方法和==

号比较引用数据类型没有区别,重写后的equals方法比较的是对象中的属性.

12:

String类的面试题:

1.判断定义为String类型的s1和s2是否相等

String s1 = "abc";

String s2 = "abc";

System.out.println(s1 == s2); //true

System.out.println(s1.equals(s2));//true

2.下面这句话在内存中创建了几个对象?

String s1 = new String("abc"); //创建了两个对象

3.判断定义为String类型的s1和s2是否相等

String s1 = new String("abc");

String s2 = "abc";

System.out.println(s1 == s2); //false

System.out.println(s1.equals(s2));//true

4.判断定义为String类型的s1和s2是否相等

String s1 = "a" + "b" + "c";

String s2 = "abc";

System.out.println(s1 == s2); //true

System.out.println(s1.equals(s2));//true

5.判断定义为String类型的s1和s2是否相等

String s1 = "ab";

String s2 = "abc";

String s3 = s1 + "c";

System.out.println(s3 == s2); //false

System.out.println(s3.equals(s2));//true

13:

面试题1,String类型和int类型的相互转型:

int--String:

A: + "";(和双引号进行拼接)

B:public static String valueOf(int i)

C:int--Integer--String(Integer类的toString()方法)

D:public static String toString(int i)(Integer类的静态方法)

String--int:

A:String--Integer--int(Integer类的parseInt()方法)

B:public static int parseInt(String s)

面试题2,StringBuffer类型和String类型的相互转换:

A:String -- StringBuffer

a:通过构造方法

b:通过append()方法

B:StringBuffer -- String

a:通过构造方法

b:通过toString()方法

c:通过subString(0,length);

面试题3,String,StringBuffer,StringBuilder的区别:

A:StringBuffer和StringBuilder的区别

a:StringBuffer是jdk1.0版本的,是线程安全的,效率低

b:StringBuilder是jdk1.5版本的,是线程不安全的,效率高

B:String和StringBuffer,StringBuilder的区别:

a:String是一个不可变的字符序列

b:StringBuffer,StringBuilder是可变的字符序列

面试题4,

Integer面试题:

看程序写结果

Integer i1 = new Integer(97);

Integer i2 = new Integer(97);

System.out.println(i1 == i2); //false

System.out.println(i1.equals(i2));//true

System.out.println("-----------");

Integer i3 = new Integer(197);

Integer i4 = new Integer(197);

System.out.println(i3 == i4); //false

System.out.println(i3.equals(i4));//true

System.out.println("-----------");

Integer i5 = 97;

Integer i6 = 97;

System.out.println(i5 == i6); //true

System.out.println(i5.equals(i6));//true

System.out.println("-----------");

Integer i7 = 197;

Integer i8 = 197;

System.out.println(i7 == i8); //false(对象存储在常量池中,但是超过了byte数据的范围)

System.out.println(i7.equals(i8));//true

面试题5,

为什么已经有int类型,还会有Integer类型?

答:因为他是int类型的装箱,更符合现在的面向对象的思想.

Integer能够调用方法来对数据进行相关操作.

15:

面试题:List有三个儿子:ArrayList,Vector,LinkedList.他们的区别,以及什么时候使用谁?

ArrayList和Vector的区别:

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高.

共同点:底层都是数组结构的

ArrayList和LinkedList的区别:

ArrayList底层是数组结构,查询修改快,增删慢.

LinkedList底层是链表结构的,查询修改慢,增删快.

共同点:都是线程不安全的.

查询多时用ArrayList,增删多时用LinkedList,都多用ArrayList,需要线程安全时用Vector.

16:

三种迭代的方法能否执行删除?

for循环:能删除,但需要索引 --(减减)

迭代器:可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常.

增强for循环:不可以删除.

18:

面试题:HashMap和Hashtable的区别:

Hashtable是JDK1.0版本出现的,是线程安全的(同步),效率低;

HashMap是JDK1.2版本出现的,是线程不安全的,效率高.

Hashtable不可以存储null键和null值;

HashMap可以存储null键和null值.

19:

1,面试题:

final,finally和finalize的区别

三者没有什么关系,只是长得像而已.

final:(最终的)

可以修饰类,不能被继承

可以修饰方法,不能被重写

可以修饰变量,只能被赋值一次.(常量)

finally:

在try catch中使用,不能单独存在.是用来释放资源的.

finalize:

是一个方法. 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

2,面试题:

如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。

答:会执行finally的代码.在return后执行.

具体的说:当执行到try catch中的return语句时,会找语句中是否有finally语句,

如果有就将finally的语句执行完,再彻底返回.但这之前,return已经执行了.

要注意的是:finally中不能写return语句,等同于犯罪.因为一旦finally中有return语句,那么try catch中的return语句就没有什么意义了.

3,面试题:

编译期异常和运行期异常的区别?

编译期异常:当程序发生错误时,如果不处理,编译就不会通过

运行期异常:一般是程序员犯的错误的体现,需要重新修改代码.

相关文章
评论
新版评论功能开发中
头条推荐
最新资讯