黑马程序员——java面试题之基础语法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

类型转化

		float f1 = (float)12.345;
		float f2 = 12.345f;
		
		f1其实是通过一个double类型转换过来的。
		而f2本身就是一个float类型。
/*
	面试题:
		byte b1=3,b2=4,b;
		b=b1+b2;
		b=3+4;
		哪句是编译失败的呢?为什么呢?
		b = b1 + b2;是有问题的。
		因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。
		常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。
*/
class DataTypeDemo6 {
	public static void main(String[] args) {
		//定义了三个byte类型的变量,b1,b2,b3
		//b1的值是3,b2的值是4,b没有值
		byte b1 = 3,b2 = 4,b;
		
		//b = b1 + b2; //这个是类型提升,所有有问题
		
		b = 3 + 4; //常量,先把结果计算出来,然后看是否在byte的范围内,如果在就不报错。
	}
}
/*
	byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
	
	练习:byte b = (byte)300;
*/
class DataTypeDemo7 {
	public static void main(String[] args) {
		//因为byte的范围是:-128到127。
		//而130不在此范围内,所以报错。
		//byte b = 130; 
		
		//我们可以使用强制类型转换
		byte b = (byte) 130;
		
		//结果是多少呢?
		System.out.println(b);//-126
	}
}
/*
	分析过程:
		我们要想知道结果是什么,就应该知道是如何进行计算的。
		而我们又知道计算机中数据的运算都是补码进行的。
		而要得到补码,首先要计算出数据的二进制。
		
		A:获取130这个数据的二进制。
			00000000 00000000 00000000 10000010
			这是130的原码,也是反码,还是补码。
		B:做截取操作,截成byte类型的了。
			10000010 
			这个结果是补码。
		C:已知补码求原码。
					符号位		数值位
			补码:	1			0000010
			
			反码:	1			0000001
			
			原码:	1			1111110
*/
class DataTypeDemo8 {
	public static void main(String[] args) {
		//直接输出一个字符
		System.out.println('a'); //a
		//输出一个字符和一个整数做加法
		System.out.println('a'+1); //98
	}
}
class DataTypeDemo9 {
	public static void main(String[] args) {
		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
	}
}

算术运算

class OperatorTest {
	public static void main(String[] args) {
		int a = 10;
		int b = 10;
		int c = 10;

		a = b++; //a=10,b=11,c=10
		c = --a; //a=9,b=11,c=9
		b = ++a; //a=10,b=10,c=9
		a = c--; //a=9,b=10,c=8
		
		System.out.println("a:"+a);
		System.out.println("b:"+b);
		System.out.println("c:"+c);
		System.out.println("--------------");
		
		int x = 4;
		int y = (x++)+(++x)+(x*10);
		//4+6+60
		//x=5,6
		
		System.out.println("x:"+x);
		System.out.println("y:"+y);
	}
}
赋值运算
/*
	面试题:
		short s=1;s = s+1; 
		
		short s=1;s+=1;
		上面两个代码有没有问题,如果有,那里有问题。
		
		为什么第二个木有问题呢?
			扩展的赋值运算符其实隐含了一个强制类型转换。
			
			s += 1;
			不是等价于 s = s + 1;
			而是等价于 s = (s的数据类型)(s + 1);
*/
class OperatorTest {
	public static void main(String[] args) {
		//short s = 1;
		//s = s + 1;
		//System.out.println(s);
		
		short s = 1;
		s += 1; //好像是 s = s + 1;
		System.out.println(s);
	}
}
位运算符

/*
	<<:左移	左边最高位丢弃,右边补齐0
	>>:右移	最高位是0,左边补齐0;最高为是1,左边补齐1
	>>>:无符号右移 无论最高位是0还是1,左边补齐0
	
	面试题:
		请用最有效率的方式写出计算2乘以8的结果?
			2 * 8
			
			2 << 3

*/
class OperatorDemo3 {
	public static void main(String[] args) {
		//<< 把<<左边的数据乘以2的移动次幂
		System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
	
		//>> 把>>左边的数据除以2的移动次幂
		System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
		System.out.println(24 >>> 2);
		
		System.out.println(-24 >> 2); 
		System.out.println(-24 >>> 2);
	}
}
/*
	计算出3的二进制:11
		00000000 00000000 00000000 00000011
	(00)000000 00000000 00000000 0000001100
		
	>>的移动:	
	计算出24的二进制:11000
		原码:10000000 00000000 00000000 00011000
		反码:11111111 11111111 11111111 11100111
		补码:11111111 11111111 11111111 11101000
		
		11111111 11111111 11111111 11101000
		1111111111 11111111 11111111 111010(00) 补码
		
		补码:1111111111 11111111 11111111 111010
		反码:1111111111 11111111 11111111 111001
		原码:1000000000 00000000 00000000 000110
		
		结果:-6
		
	>>>的移动:
		计算出24的二进制:11000
		原码:10000000 00000000 00000000 00011000
		反码:11111111 11111111 11111111 11100111
		补码:11111111 11111111 11111111 11101000
		
		11111111 11111111 11111111 11101000
		0011111111 11111111 11111111 111010(00)
		
		结果:
*/
循环语句标签的使用

/*
	控制跳转语句:
		break:中断
		continue:继续
		return:返回
	
	break:中断的意思
	使用场景:
		A:switch语句中
		B:循环语句中。
			(循环语句中加入了if判断的情况)
		注意:离开上面的两个场景,无意义。
		
	如何使用呢?
		A:跳出单层循环
		B:跳出多层循环
			要想实现这个效果,就必须知道一个东西。带标签的语句。
			格式:
				标签名: 语句
*/
class BreakDemo {
	public static void main(String[] args) {
		//在 switch 或 loop 外部中断
		//break;
		
		//跳出单层循环
		for(int x=0; x<10; x++) {
			if(x == 3) {
				break;
			}
			System.out.println("HelloWorld");
		}
		
		System.out.println("over");
		System.out.println("-------------");
		
		wc:for(int x=0; x<3; x++) {
			nc:for(int y=0; y<4; y++) {
				if(y == 2) {
					//break nc;
					break wc;
				}
				System.out.print("*");
			}
			System.out.println();
		}
	}
}
数组

/*
	数组操作的两个常见小问题:
		ArrayIndexOutOfBoundsException:数组索引越界异常
			原因:你访问了不存在的索引。
		
		NullPointerException:空指针异常
			原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
			
*/
参数传递

/*
	思考题:看程序写结果,然后分析为什么是这个样子的。并画图讲解。最后总结Java中参数传递规律。
	
	Java中的参数传递问题:
		基本类型:形式参数的改变对实际参数没有影响。
		引用类型:形式参数的改变直接影响实际参数。
*/
class ArgsDemo {
	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); //???	a:10,b:20

		int[] arr = {1,2,3,4,5}; 
		change(arr);
		System.out.println(arr[1]); //???	4
	}

	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 change(int[] arr) { //arr={1,2,3,4,5};
		for(int x=0; x


你可能感兴趣的:(java基础,经典案例)