Java面试错题之牛客网(20191017-1)

1.Finally块
public boolean returnTest()
{
    try
    {
        return true;
    }
    catch (Exception e)
    {
 
    }
    finally
    {
        return false;
    }
}

解析:finally其实是仅在return 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return)语句,那么finally就会在这个return 语句前执行。finally在catch中的return之前执行但是如果catch中有返回值而finally中也有返回值的话finally中的返回值会替换catch中的返回值,因为catch中的返回值是存放在一个临时区中。
如果catch块有异常向外抛出,执行顺序呢:我执行我的,你抛你得异常,我finally我的语句,我俩互不干涉,你别管我啥时执行,但我一定会执行。
关于finally,您只需记着一点:除非调用system.exit()让程序退出(也就是将调用这个程序的进程断开了、退出了这个程序)就不会执行或断电等因素致使程序停止进程终止,否则,无论任何因素,finally块都一定会执行。

1.finally代码块的语句在return之前一定会得到执行
2.如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存,之后执行finally代码块,最后将保存的返回值返回,finally代码块虽然对返回值进行修改也不影响返回值,因为要返回的值在执行finally代码块之前已经保存了,最终返回的是保存的旧值(值传递)。
3.如果try块和finally块都有返回语句,那么虽然try块中返回值在执行finally代码块之前被保存了,但是最终执行的是finally代码块的return语句,try块中的return语句不再执行。
4.catch块和try块类似,会在执行finally代码块执行前保存返回值的结果,finally语句中有return语句则执行finally的return语句,没有则执行catch块中的return语句,返回之前的保存值。

public class Num {
    public int x;
}
public class Test{
    static Num num = new Num();//num.x=0(默认)
    public static void main(String[] args) {
        System.out.println(new Test().test().x);//此处打印结果为2
        System.out.println(new Test().test1());//此处打印结果为1
    }
    static Num test(){
        num.x=1;//num.x=1;
        try {
            return num;//先将num保存起来,finally块执行完后,再将其返回,由于num为引用类型,即此处保存为地址,引用传递改变对象本身;
                        //而值传递实际是传递副本,改变的只是副本,而与此处保存的值无关,
                        //因此待finally执行完后返回值不会受到影响
        } finally{
            ++num.x;//num.x=2,此处修改调用的是num本身,因此num.x发生改变(引用传递)
        }
    }
    static int test1(){
        num.x=1;//num.x=1;
        try {
            return num.x;//值传递实际是传递副本,改变的只是副本,而与此处保存的值无关,
                        //因此待finally执行完后返回值不会受到影响    
        } finally{
            ++num.x;//num.x=2,此处修改是num.x的副本,因此num.x本身并没有改变(值传递)
        }
    }
}
2.变量自增
int a =100,b=50,c=a---b,d=a---b;
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);

解析:

int a = 3;
a = a++

在内存中a=a++的运算是这样的,在a做加法运算之前,先开辟一片临时区域保存a的值,然后a再做自加运算,a做完自加运算之后,载把临时区域的值赋值给等号左边的变量即a,a=a++相当于:

   temp=a;//temp=3

   a=a+1;//a=4

   a=temp;//a=3

  所以a最后的值是3
3.重载和重写

方法重载的要求
1. 函数名要一致。
2. 形参列表不一致(形参的个数或形参 的类型不一致)
3. 与返回值类型无关。

方法重写要注意的事项:
1.方法重写时, 方法名与形参列表必须一致。
2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。
4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。
Exception(最坏)
RuntimeException(小坏)
修饰符可以被访问的权限
structs和mvc结构
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值