一、哪句是编译失败的呢?为什么呢?
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可以改变返回值类型,只看参数列表。
方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的。
方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
子类对象调用方法的时候:先找子类本身,再找父类
在这里插入图片描述