Java基础常见面试题(一)

本文深入解析了Java中的关键概念,包括接口与抽象类的区别、静态方法与实例方法的不同之处、==与equals()方法的作用及区别,以及方法重载与重写的概念与应用。

1. 接口和抽象类的区别是什么?

  1. 设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
  2. 一个类可以实现多个接口,但只能实现一个抽象类。(类只能单继承)。
  3. 除了default默认方法,接口方法中不能有代码的实现 ,抽象类可以有非抽象的方法。(Java 8 开始接口方法可以有默认实现)。
  4. 接口方法默认修饰符是 public,抽象方法可以有 publicprotecteddefault 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
  5. 接口没有构造方法,抽象类可以有。

关于java 8 接口方法的实现,可参考https://blog.youkuaiyun.com/hspingcc/article/details/73332657?spm=1001.2014.3001.5502

2. 静态方法和实例方法有何不同?

  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

  • 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象

3. == 与 equals()方法的作用和区别?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址)。

equals() : 它的作用是判断两个对象内容是否相等(未必是同一个对象)。但它一般有两种使用情况:

  • 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 为一个引用
        String b = new String("ab"); // b为另一个引用,对象的内容一样
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 从常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一对象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

说明:

  • String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值
  • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

4. 方法重载跟方法重写的区别?

  • 重载(overload)就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。发生在编译时期,方法名必须相同,参数类型、个数、顺序,方法返回值和访问修饰符可以不同。

  • 重写(override)就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法

    方法的重写要遵循“两同两小一大”

    • “两同”:即方法名相同、形参列表相同;
    • “两小”:指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
    • “一大”:指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
区别点重载方法重写方法
发生范围同一个类子类
参数列表必须修改一定不能修改
返回类型可修改子类方法返回值类型应比父类方法返回值类型更小或相等
异常可修改子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等
访问修饰符可修改一定不能做更严格的限制(可以降低限制)
发生阶段编译期运行期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值