java面试题系列之JavaSE语法篇(三)

    科技2026-01-06  9

    1、抽象方法是否可以是静态(static)的,是否可以是本地方法(native),是否可以是synchronized?

    都不能。

    静态方法不能被重写,因为重写实现的是运行时的多态,是依赖于对象的,而静态方法是依赖于类的;我们的抽象方法需要被重写,故抽象方法不能是

    静态的。

    本地方法是由本地代码(如C)实现的,而抽象方法是没有实现的,相互矛盾。

    synchronized和方法的实现细节相关,而抽象方法不涉及实现细节,相互矛盾。

    2、阐述静态变量和实例变量的区别

    静态变量:是被static修饰的变量,又被称为类变量,它属于一个类,不属于任何一个对象,不管创建多少个对象,静态变量在内存中有且仅有一个拷贝。实例变量:依赖于某一个实例对象而存在,必须通过实例对象才能对它进行访问。

    区别:

    静态变量随着字节码的加载而加载,而实例变量随着实例的创建而创建静态变量属于一个类,而实例变量属于一个对象静态变量直接通过类名进行引用,而实例变量通过对象进行引用

    3、==和equals的区别

    区别:

    ==是运算符,而equals是方法==在比较基本数据类型时比较的是值,而对于引用数据类型则比较的是地址值equals用于比较两个对象的内容是否相等,如果没有重写equals方法,则比较的是地址值

    4、break和continue的异同

    相同点:

    ​ 二者都是用于控制循环语句的执行

    不同点:

    break用于完全结束循环,执行循环体之后的代码continue用于跳过本轮循环,进入下一轮循环

    5、String s = “Hello”;s = s + " world!";这两行代码执行后,原始的 String 对象

    中的内容到底变了没有?

    ​ 没有。因为String被设计为一个不可变类,也就是说它的对象都是不可变对象,那为什么输出的s会是Hello World!,因为在内存中创建了

    一个新的内容为"Hello World!"的String对象,而我们的s则指向了这个新的String对象。由此可见,如果我们经常进行“修改”的话,必将造成很大的

    内存消耗,所以如果要经常修改字符串,建议使用StringBuffer。

    ​ 除此之外,如果我们一定要使用String的话,建议使用下面的方式创建:

    String s="abc";

    ​ 而不建议使用下面的方式:

    String s=new String("abc");

    因为String是不可变对象,并且在new的时候需要消耗内存。

    Processed: 0.019, SQL: 10