java基础面试题(二)

  1. Java有哪些操作字符串的类?它们之间有什么区别?
    答:String,StringBuffer和StringBuilder几个类都是可以操作字符串的。String类用的是final修饰符修饰,声明的是不可变对象,所以每次操作生成的都是新对象。StringBuffer和StringBuilder都是可以在原有的字符串基础上做修改的类,不会像String一样每次都生成新对象,所以如果涉及到大量字符串的修改,建议用StringBuffer和StringBuilder类。而StringBuffer和StringBuilder类的区别在于,StringBuffer是线程安全的,StringBuilder不是线程安全的,所以涉及到多线程修改字符串内容,建议用StringBuffer,不然都用StringBuilder,因为StringBuilder类的性能比StringBuffer类高。

  2. 用最有效率的方法算出 2 乘以 8 等于几?
    答:2<<3。这是用位运算的的方式,因为位运算cpu是直接支持的,效率是最高的,同时要是用了位运算的方法做计算,计算的作用建议写上注释,不然位运算确实不容易理解。

  3. 当使用 final 关键字修饰一个变量时,是引用变量不能变,还是引用对象不能变?
    答:引用变量不能变,引用对象的内容是可以变的。
    这个问题需要个例子理解一下:
    在这里插入图片描述
    可以看到当为引用变量stringBuilder再赋值时,编译报错。
    在这里插入图片描述
    而修改引用变量stringBuilder所指向的对象的内容时,是可以的。

  4. 如何将字符串反转?
    答:使用StringBuffer类或者StringBuilder类的reverse方法。

  5. 静态变量和实例变量有什么区别?
    答:静态变量用static修饰符修饰,而实例变量不需要。静态变量属于类,也可以叫做类变量,在类加载时就会被分配内存空间,完成初始化。而实例变量是属于对象的,只有对象被实例化了,实例变量才会被分配内存空间,才能够使用。所以静态变量我们可以用类名直接调用,而成员变量则需要实例化出变量后才能调用。
    通过以下代码直观的感受一下:

public class TestMain {
    public static int staticVar = 0;
    public int instanceVar = 0;

    public TestMain() {
        staticVar++;
        instanceVar++;
        System.out.println("staticVar=" + staticVar);
        System.out.println("instanceVar=" + instanceVar);
    }

    public static void main(String[] args) throws Exception {
        TestMain testMain = new TestMain();
        TestMain testMain1 = new TestMain();
        TestMain testMain2 = new TestMain();
    }
}

运行结果如下:
在这里插入图片描述
测试main函数里,我们实例化了3个TestMain对象,可以看到静态变量staticVar值递增为3,而成员变量的值还是1,这就可以很直观的感受到什么是类变量以及成员变量了。

  1. Math提供了哪几种取整的方法?怎么用?
    答:Math提供了3种取整的方法:ceil,floor,round
    ceil表示向上取整,效果如下:
public class TestMain {
    public static void main(String[] args) throws Exception {
        double var = 9.5;
        System.out.println(Math.ceil(var));
        var = -9.5;
        System.out.println(Math.ceil(var));
    }
}

运行结果如下:
在这里插入图片描述
floor表示向下取整,看下效果:

 public class TestMain {
    public static void main(String[] args) throws Exception {
        double var = 9.5;
        System.out.println(Math.floor(var));
        var = -9.5;
        System.out.println(Math.floor(var));
    }
}

运行结果如下:
在这里插入图片描述
round表示四舍五入后再向下取整,看下效果:

public class TestMain {
    public static void main(String[] args) throws Exception {
        double var = 9.3;
        System.out.println(Math.round(var));
        var = -9.7;
        System.out.println(Math.round(var));
    }
}

运行结果如下:
在这里插入图片描述

  1. Overload(重载) 和 Override(重写) 区别?
    答:重载表示一个类中可以有很多方法名称相同,但是参数类型,参数数目可以不同。
    重写就是子类中的某个方法与父类的某个方法的方法名和参数等等全都一样,然后子类实例调用这个方法时就是调用自己类的这个方法,等于覆盖了父类的那个相同名称的方法。

  2. Overload(重载) 的方法可以改变返回值的类型么?
    答:看情况,如果几个方法的名称相同,但是参数列表不同,那么返回值的类型可以不同。但是如果参数列表是完全一样的,那么返回值类型就不能不同,因为在参数列表是一样的情况下,java无法做到根据返回类型来反向判断具体调用的是哪个方法。

  3. 构造器 Constructor 是否可被Override(重写)?
    答:不行,重写要有父类子类的关系,而Constructor是不能被继承的,所以不能被重写。

  4. 面对对象的4大特性?
    答:抽象,封装,继承,多态

发布了156 篇原创文章 · 获赞 138 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104133892