Java 面试题 011 - 020

本文深入讲解Java语言的特点,包括面向对象编程、平台无关性、多线程支持等。同时解析了continue、break、return的区别,介绍了泛型的概念及使用方法,并详细阐述了==与equals()的区别、重写equals()时必须重写hashCode()的原因、值传递与引用传递的区别、重载与重写的区别、浅拷贝与深拷贝的区别等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

011、Java 语言有哪些特点?

  1. 面向对象编程,具有封装、继承、多态的特性。
  2. 平台无关性,因为 JVM 的存在,Java 语言可以一次编译、到处运行
  3. 支持多线程和网络编程。
  4. 简单易学。

012、continue、break、和 return 的区别是什么?

  1. continue:跳出这一次循环,继续执行下一次循环。
  2. break:跳出整个循环体,继续执行循环体后面的代码。
  3. return:跳出所在方法,结束该方法的运行,常见用法如下。
    • return;:不返回任何结果,直接结束方法的执行,用于没有返回值的方法
    • return value;:返回特定的值,用于有返回值的方法

013、什么是泛型?

泛型是 JDK 5 引入的一个新特性,提供了编译时类型安全检测机制,该机制允许程序员在编写代码时检测到非法的类型。

泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。

  1. 泛型类

    // 此处 T 可以随便写为任意标识,常见的如 T、E、K、V 等形式的参数常用于表示泛型
    public class Generic<T>{
        private T key;
        
        public Generic(T key) {
            this.key = key;
        }
        
        public T getKey(){
            return key;
        }
    }
    
    // 在实例化泛型类时,必须指定 T 的具体类型,如下
    Generic<String> genericInteger = new Generic<>("Hello World!");
    
  2. 泛型接口

    public interface Generator<T> {
        public T method();
    }
    
    // 实现泛型接口,不指定类型
    class GeneratorImpl<T> implements Generator<T>{
        @Override
        public T method() {
            return null;
        }
    }
    
    // 实现泛型接口,指定类型
    class GeneratorImpl<T> implements Generator<String>{
        @Override
        public String method() {
            return "hello";
        }
    }
    
  3. 泛型方法

    public static <E> void print(E e) {
        System.out.println(e);
        System.out.println(e instanceof String);
    }
    

什么是类型擦除?

Java 的泛型是伪泛型,在编译期间,Java 会将所有的泛型信息都擦掉。

014、== 和 equals() 的区别?

对于基本数据类型变量来说,== 是判断两个变量值是否相等,对于引用类型变量来说,== 是判断两个变量所存储的对象地址是否相等。

equals() 只能用于引用类型变量的比较,一般是用来判断两个引用类型变量所指向的对象是否相等。

equals()Object 类的方法,对于其他类来说,如果没有重写 equals() 方法,那么 equals() 方法和 == 则是等价的;如果重写了 equals() 方法,一般情况下重写逻辑都是用来判断两个对象所存储的内容是否相等。

015、为什么重写 equals() 时必须重写 hashCode()?

在 Java 开发过程中,我们几乎无可避免的要用到通过哈希表实现的 HashMap() 等集合,在使用这些集合时,一定会用到 equals() 和 hashCode() 两个方法,并且这两个方法需要遵守以下约定:

  • equals() 相等的话,hashCode() 一定相等
  • equals() 不相等的话,hashCode() 可能相等也可能不相等
  • hashCode() 相等的话,equals() 可能相等也可能不相等
  • hashCode() 不相等的话,equals() 一定不相等

image-20210115141644701

016、Java 是值传递还是引用传递?

Java 是值传递,无论是基本类型还是引用类型,方法得到的所有参数都是参数本身的一个拷贝,也就是说,方法不能修改任何参数本身的值,但对于引用类型来说,可以修改该引用所指向的对象。

017、重载和重写的区别?

重载指的是同一个方法能够输入数据的不同做出不同的处理。重载发生在同一个类中,重载方法之间要求方法名相同,但参数列表不同,方法返回值和访问修饰符可以相同也可以不相同。

重写指的是子类继承父类的方法,但想要做出有别于父类的处理,就需要重写父类方法。

子类重写父类方法时,有以下几条限制:

  • 两同:方法名、参数列表相同
  • 两小:子类方法返回值类型应该小于等于父类方法,子类方法抛出异常的范围要小于等于父类方法
  • 一大:子类方法访问修饰符的限制要大于等于父类
  • 如果父类方法的修饰符为 private/final/static 的话,则子类不能重写该方法,但是被 static 修饰的方法能够被再次声明
  • 构造方法无法被重写

018、浅拷贝和深拷贝

对基本类型来说,浅拷贝和深拷贝没有区别,都是直接拷贝变量值。

对引用类型来说,浅拷贝也是直接拷贝引用变量的值,但深拷贝会直接创建一个对象,并复制引用变量所指向的对象的所有内容到新对象。

019、构造器是否可以被重写?

不可以,构造器不可以被重写,但可以重载。

020、在 Java 中定义一个不做任何操作且没有参数的构造器的作用?

Java 程序在执行子类构造器之前,如果没有用 super() 显示调用父类特定的构造器,那么则会隐式调用父类的无参构造器,假如此时父类只定义了有参构造器,编译时将会发生错误,因为 Java 程序在父类中找不到对应的无参构造器可执行,解决办法就是在父类中定义一个无参构造器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值