【java】java面试题与题解

1.下列代码的输出是什么

public static void main(String[] args) {
	int a;
	a = 6;
	System.out.print(a);
	System.out.print(a++);
	System.out.print(a);
}

答案:667

解析:a++运算首先将a进行对应操作(即输出),然后将a的值+1。所以输出仍为6,但a的值变为7。

2.String s = new String("xyz");创建了几个StringObject

答案:两个

解析:在执行这行代码时,首先会检查字符串常量池中是否已经存在"xyz"这个字符串。如果有,则指向字符串所在地址,如果没有,则创建字符串常量,并放入字符串常量池中。当遇到new关键字,还会在堆内存中创建一个新的String对象。

3.下列代码的输出是什么

public static void main(String[] args) {
	StringBuffer a = new  StringBuffer("A");
	StringBuffer b = new  StringBuffer("B");
	change(a, b);
	System.out.println(a+","+b);
}
	
public static void change(StringBuffer x,StringBuffer y) {
	x.append(y);
	y = x;
}

答案:AB,B

解析:首先main方法入栈,a,b在堆内存当中开辟两块内存空间。然后change方法入栈,x指向栈内存当中a的地址,y指向栈内存当中b的地址。append()方法将"B"添加到"A"所在的堆内存当中,y=x使得y指向x所指向的位置(并不改变b的指向)。

4.下列说法正确的是

A:final可以用来修饰类、方法、变量

B:finally是java代码保证重点代码一定要执行的一种机制

C:变量被final修饰后不能再指向其他对象,但可以重写

D:finalize设计目的是保证对象在被垃圾收集完成特定资源回收

答案:ABD

解析:final修饰类不能被继承,修饰方法不能被重写,修饰变量不能改变其值。

5.局部内部类可以用那些修饰符修饰

A:public

B:private

C:abstract

D:final

答案:CD

解析:局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用static修饰。

6.执行下列代码会发生什么

public class Main {
  static {
	  int x = 5; 
  }
  static int x,y;   
  public static void main(String[] args) {
        x--;   
        myMethod();
        System.out.println(x+y+ ++x);
  }
  public static void myMethod() {
	  y = x++ + ++x;
  }
}

答案:输出3
解析:  static{}是一个代码块,代码块中的变量属于局部变量。static修饰的代码块在main方法之前执行,首先代码块入栈,表达完之后立刻出栈。static修饰的xy存储在方法区当中,默认值为0。然后main方法入栈,首先执行x--(x = -1)。然后myMethod方法入栈,首先x++(先赋值再递增,x=0),然后++x(先递增再赋值,x=1),y = -1 + 1 = 0。最后输出1 + 0 + 2 = 3。

7.下面哪些赋值语句是正确的

A:long text = 012;

B:float t = -412;

C:int other = (int) true;

D:double d = 0x12345678;

E:byte b = 128;

答案:ABD

解析:八进制的数据由0开头;在java中,布尔类型不能直接转化为整数类型;0x开头的是十六进制,由十五个字符表示,分别为123456789ABCDEF;byte类型的数据范围是[-128,127]。

8.以下代码的执行结果是什么

class Base {
	public Base(String s) {
		System.out.println("B");
	}
}
public class Dervid extends Base {
	public Dervid(String s) {
		System.out.println("D");
	}
	public static void main(String[] args) {
		System.out.println("C");
	}
}

答案:编译错误

解析:程序先加载,后创建对象。加载顺序:首先加载父类,然后才加载子类。创建顺序:先创建父类对象,再创建子类对象。子类当中有构造器,父类当中也有,并且子类需要给父类传递参数。在构造器当中是必须传值的。继承的本质:代码的复用。子类是可以使用父类都方法和变量的,如果子类先创建对象,那么其他程序就无法在第一时间获取到父类的方法和变量了。当父类需要传值时,可以使用super关键字给父类传值。

9.关于java继承的特点,下列说法正确的是

A:使类的定义复杂化

B:java只支持单继承,不可多继承,但可以通过实现接口来达到多继承的目的

C:子类继承父类的所有成员变量和方法,包括父类的构造方法

D:不可以多层继承,既一个类不可以继承一个类的子类

答案:B

解析:接口的目的就是弥补单继承的缺陷,使java达到多继承的效果。子类不能继承所有成员变量和方法(只能继承非private修饰的,而且需要判断子类和父类是否同包)。并且子类不能继承父类的构造器,继承的本质是代码的复用,子类根本调用不到父类的构造器。java确实不可多层继承,java也确实不可以继承一个类的子类,但二者不能用一方解释另一方。

10.关于final关键字,下列说法正确的是

A:如果修饰局部变量必须初始化

B:如果修饰类,则该类只能被一个子类继承

C:如果修饰方法,则该方法不能在子类当中重写

D:如果修饰方法,则该方法所在的类不能被继承

答案:C

解析:初始化(赋值)。修饰一个局部变量完全可以不赋值,但是它不能被使用,只有赋值之后才可以使用它;修饰一个全局变量必须赋值。final修饰类不能被继承,修饰方法不能被重写,修饰变量不能改变其值。对于全局变量,我们可以在任何方法当中对他进行使用。只有在方法入栈的时候,局部变量才有自己的内存空间。而全局变量在创建的时候就在堆内存当中有自己的内存空间。

11.下列说法正确的是

A:在类方法当中可以用this来调用本类的方法

B:在类方法当中调用本类的类方法可以直接调用

C:在类方法当中只调用本类的方法

D:在类方法中绝对不能调用实例方法 (new 对象)

答案:B

解析:this代表当前对象,类方法是属于类的,有类不一定有对象。static修饰的方法是属于类的,因此this不能出现在static修饰的方法当中。

12.关于java异常处理机制的叙述有哪些是正确的

A:catch部分捕捉到异常情况时,才会执行finally部分

B:当try区段的程序发生异常的时候,才会执行catch区段的程序

C:在try区段不论程序是否发生异常,都会执行fianlly部分

D:以上都是

答案:BC

解析:当try区段的程序发生异常的时候,才会执行catch区段的程序。在try区段不论程序是否发生异常,都会执行fianlly部分

13.下列说法正确的是

A:在类当中定义的变量称为类的成员变量,在别的类当中可以直接使用

B:局部变量的作用范围仅仅在定义它的方法内,或者在定义它的控制流块中

C:使用别的类的方法只需要引用方法名即可

D:只要没有定义不带参数的构造函数,JVM都会为类生成一个默认的构造函数

答案:B
解析:类的成员变量能否在其他类中直接使用取决于变量的访问修饰符。

14.下列说法错误的是

A:Float是一个类

B:Float在java.lang包中

C:Float a = 1.0 是正确的赋值方法

D:Float a = new Float(1.0)是正确的赋值方法

答案:C

解析:Float是一个包装类,给Float类型的变量赋值需要在堆内存当中new一块内存空间。

15.java 反射机制主要提供了以下哪些功能

A:在运行时判断一个对象所属的类

B:在运行时构造一个类的对象

C:在运行时判断一个类所具有的成员变量和方法

D:在运行时调用一个对象的方法

答案:ABCD

解析:反射可以通过对象名获取类名,反射的作用是获取类信息。同时,反射还可以创建对象、调用方法。

16.下列说法错误的是

A:数组是一种对象

B:数组属于原生类

C:int num = []{1,2,3,4}

D:数组的大小可以任意改变

答案:BCD
解析:整形数组的定义方式:int[] arr = new int[3];  int[] arr = new int[]{0,1,2};  int[] arr = {0,1,2};。数组的大小是固定的。

17.下列代码的运行结果是什么

public class Main {
	public static void main(String[] args) {
		String s;
		System.out.println("hello" + s);
	}
}

答案:编译报错
解析:我们看三者的区别

String s = null;  //s 有指向,指向空

String s = "";  //s 有指向,指向堆内存当中的一块内存空间,只不过空间中什么都没有。

String s;  //s 没有指向

 

18.下列代码的运行结果是什么

public class Main {
		private String name;
		private int age;
		public Student(String name,int age) {
			this.name = name;
			this.age = age;
		}
		@Override
		public String toString() {
			return "Student [name=" + name + ", age=" + age + "]";
		}
		public static void change(Student s1, Student s2){
			Student temp = new Student("王五",20);
			temp.name = s1.name;
			s1.name = s2.name;
			s2.name = temp.name;
		}
		public static void main(String[] args) {
			Student zhangsan = new Student("张三", 18);
			Student lisi = new Student("李四", 20);
			Student.change(zhangsan, lisi);
			System.out.print(zhangsan.toString());
			System.out.print(lisi.toString());
		}
}

答案:Student [name=李四, age=18]Student [name=张三, age=20]

​​​​​​​

19.下列选项哪些是正确的

A:所有的java异常错误都是java.lang.Exception 包括java.lang.RuntimeException

B:通过try catch finally语句finally无论发生什么异常都会得到执行

C:Java中所有数据都是对象

D:Java语言是跨平台的,无论通过那个版本编写的java程序,都能在所在的java平台当中运行

答案:B
解析:异常错误包括异常(Exception)和错误(Error)。java当中并非所有数据都是对象,例如:基本数据类型int,因为java是面向对象的,有些时候我们用包装类代替基本数据类型,如用Integer代替int。

20.以下代码的运行结果是什么

class Two{
	Byte x;
}
public class Student {
	public static void main(String[] args) {
		Student student = new Student();
		student.start();
	}
	void start() {
		Two two = new Two();
		System.out.print(two.x +"  ");
		Two two2 = fix(two);
		System.out.println(two.x + " "+two2.x);
	}
	Two fix(Two tt) {
		tt.x = 42;
		return tt;
	}
}

答案:null 42 42
解析:第一步main方法入栈,定义一个student在栈内存中。然后start方法入栈,并在栈内存当中new了一个two对象。x是Byte类型的,Byte是一个包装类,x的默认值是null。two2调用了fix方法,fix方法入栈,two2和two指向相同的地址(tt)。tt.x = 42,此时x的值被修改为42。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值