java笔试题

一、哪句是编译失败的呢?为什么呢?  
     byte b1=3,b2=4,b;
     b=b1+b2;
     b=3+4;

答:1.第二句错了。因为byte与byte(或short,char)进行运算的时候会提升为int(因为整数默认的类型为int),两个int类型相加的结果也是int类型,不能直接赋值给byte类型变量,需要强转。

二、
System.out.println('a');  //结果: 97
System.out.println((char)('a'+1)); //结果: b
System.out.println("hello"+'a'+1); 		// helloa1
System.out.println('a'+1+"hello"); 		// 98hello
System.out.println("5+5="+5+5); 		// 5+5=55
System.out.println(5+5+"=5+5"); 		// 10=5+5
System.out.println(" 5 + 5 = " + (5 + 5)); // 5 + 5 = 10 小括号改变运算优先级
三、
int a = 3;
int b;
//b = a++;	//当++在变量后面的时候,会先将变量中的值取出做赋值操作,然后再自身加1
b = ++a;	//当++在变量前面的时候,会先自身加1,然后在将结果赋值
System.out.println("a = " + a);
System.out.println("b = " + b);

答:a=4,b=4

四、请分别计算出a,b,c的值
int a = 10;
int b = 10;
int c = 10;

a = b++;					//a = 10 ,b = 11
c = --a;					//a = 9, c = 9			
b = ++a;					//a = 10, b = 10
a = c--;					//a = 9, c = 9			
		
System.out.println("a = " + a + ",b = " + b + ",c = " + c);

答:a=9,b=10,c=9

五、
 int x = 4;
//		  4	 +	6  + 60
int y = (x++)+(++x)+(x*10);
System.out.println("x = " + x + ",y = " +  y);//x=6,y=70
六、问哪句会报错,为什么(考点:++--运算符隐含了强制类型转换)
byte b = 10;
b = b + 1;	
b++;				

答:第2句会报错:因为当byte与int进行混合运算的时候,会提升为int类型,两个int相加的结果还是int,赋值给byte会损失精度
第3句不会报错:因为b = (byte)(b + 1) // ++、–运算符隐含了强制类型转换

七、两个代码哪个有问题(考点:扩展的赋值运算符:+=,-=,*=,/=,%= 隐含了强制类型转换)
1.short s=1;s = s+1;
2.short s=1;s+=1;

答:第一个有问题,第二个没有问题:
1.short s=1;s = s+1; //当short与int进行运算的时候,会提升为int类型,两个int类型相加的结果也是int类型

2.short s=1;s+=1; //s = (short)(s + 1); += 隐含了强制类型转换

八、写出下列程序执行的结果
int a = 3;
int b = 4;
System.out.print((a++ == 3)&&(b++ == 4));

答:true

九、实现两个整数x,y变量的交换
		int x = 10;
		int y = 5;
方式一:需要第三方变量,开发推荐用这种
		int temp;
		temp = x;
		x = y;
		y = temp;
		
方式二:不需要定义第三方变量,有弊端,有可能会超出int的取值范围
		x = x + y;			    //10 + 5 = 15
		y = x - y;				//15 - 5 = 10
		x = x - y;				//15 - 10 = 5

方式三:不需要第三方变量,通过^来做
		x = x ^ y;				// 10 ^ 5 
		y = x ^ y;				// 10 ^ 5 ^ 5	y = 10
		x = x ^ y;				// 10 ^ 5 ^ 10  x = 5
十、最有效率的算出2 * 8的结果

答:2 << 3

十一、只用三元运算符求三个值的最大值

答:int max = (((a > b) ? a : b) > c) ? ((a > b) ? a : b) : c;

十二、看程序写结果(考察case穿透)
int x = 2;
int y = 3;
switch(x){
	default:
		y++;
	case 3:
		y++;
	case 4:
		y++;
}
System.out.println("y="+y)

答:y=6

十三、写出多种求0到n的和的方法
方法一:
public int add (int n ){
    int sum = 0;
    for (int i = 0; i<=n ; i++){
        sum += i;
    }
    return sum;
}
方法二:
public static int add2(int n){
    if (n == 0){
        return 0;
    }
    return add4(n-1) + n;
}
方法三:
public static int add3(int n){
 	return n*(n + 1)/2;
}
十四、已知函数 : void show(int a, int b, float c){ },
哪个答案和show不是函数重载? B

A.void show(int a,float c,int b){ }  //参数类型顺序不同
B,void show(int x,int y,float z){ }  
C.int show(int a, float c, int b){return a;}  //参数类型顺序不同,与返回值无关
D.int show(int a, float c ){return a;}   //参数个数不同
十五、看程序,才结果
class Test3_Array {
	public static void main(String[] args) {
		//基本数据类型
        int a = 10;
		int b = 20;
		System.out.println("a:"+a+",b:"+b);			//a = 10,b = 20
		change(a,b);
		System.out.println("a:"+a+",b:"+b);			//?
          
       // 引用数据类型
		int[] arr = {1,2,3,4,5};
		change2(arr);
		System.out.println(arr[1]);
	}

    // 基本数据类型值传递
	public static void change(int a,int b) {		//a = 10, b= 20
		System.out.println("a:"+a+",b:"+b);			//a = 10,b = 20
		a = b;										//a = 20
		b = a + b;									//b = 40
		System.out.println("a:"+a+",b:"+b);			//a = 20, b = 40
	}

    // 引用数据类型值传递
	public static void change2(int[] arr) {			//1,4,3,8,5
		for(int x=0; x<arr.length; x++) {
			if(arr[x]%2==0) {
				arr[x]*=2;
			}
		}
	}
}

答:
a:10,b:20
a:10,b:20
a:20,b:40
a:10,b:20
4

十六:看代码写结果
class Fu{
	public int num = 10;
	public Fu(){
		System.out.println("fu");
	}
}
class Zi extends Fu{
	public int num = 20;
	public Zi(){
		//super();
		System.out.println("zi");
	}
	public void show(){
		int num = 30;
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(super.num);
	}
}
class Test1_Extends {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

运行结果:
fu
zi
30
20
10

十七:看代码写结果
class Test2_Extends {
	public static void main(String[] args) {
		Zi z = new Zi();
	}
	/*
	1.jvm调用了main方法,main进栈,因为子要使用父类的东西,所以父类要先加载
	2.遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象,
当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,
当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
	第一个输出,静态代码块Fu,第二个输出静态代码块Zi
	3.走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,
所以先走的父类构造,但是在执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的,
所以第三个输出构造代码块Fu,第四个输出构造方法Fu
	4.Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
	*/
}
class Fu {
	static {
		System.out.println("静态代码块Fu");
	}
	{
		System.out.println("构造代码块Fu");
	}
	public Fu() {
		System.out.println("构造方法Fu");
	}
}
class Zi extends Fu {
	static {
		System.out.println("静态代码块Zi");
	}
	{
		System.out.println("构造代码块Zi");
	}
	public Zi() {
		System.out.println("构造方法Zi");
	}
}

运行结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu

十八:看代码写结果
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 构造方法

方法重写(Override)和方法重载(Overload)的区别?Overload能改变返回值类型吗?

答:
Overload可以改变返回值类型,只看参数列表。
方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的。
方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。

子类对象调用方法的时候:先找子类本身,再找父类
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值