JAVA面试百解(基础篇-基本功)

基本功

  • 面向对象的特征
    • 封装(Encapsulation)

      封装是面向对象编程中的一个基本概念,它通过将对象的数据(属性)和操作数据的方法(方法)捆绑在一起,形成一个类。这样可以隐藏对象的细节,只暴露必要的接口,从而减少了外部对对象内部细节的直接访问,提高了数据的安全性。

      实现方式:
      • 使用访问修饰符(如private)来隐藏对象的属性。
      • 提供公共的方法(通常是public)来访问或修改这些属性。
    • 继承(Inheritance)

      继承允许我们基于已有的类创建新的类,新类称为子类(派生类),而原有的类称为父类(基类)。子类继承父类的属性和方法,并且可以添加新的属性和方法,或者重写父类的方法。

      实现方式:
      • 使用extends关键字来创建一个子类。
      • 子类可以重写(Override)父类的方法。
      • 子类可以访问父类的非私有成员。
    • 多态(Polymorphism)

      多态性允许我们使用统一的接口引用不同类的对象,这些对象可以在运行时表现出不同的行为。这主要通过方法重载和方法重写实现。多态性增加了程序的灵活性和可扩展性。

      实现方式:
      • 方法重载:在同一个类中可以有多个同名方法,只要它们的参数列表不同即可。
      • 方法重写:子类可以重写父类的方法,使得不同的子类可以有不同的行为。
      • 使用接口和抽象类来实现多态。
  • final, finally, finalize 的区别
    • final:用于修饰类、方法或变量,表示不可更改。
    • finally:用于异常处理,确保代码执行。
    • finalize:用于对象清理,垃圾回收前调用。
  • int 和 Integer 有什么区别
    • 内存使用
      • int 存储在栈内存中,因为它是一个基本数据类型。
      • Integer 是一个对象,存储在堆内存中。
    • 默认值

      • int 的默认值是 0
      • Integer 的默认值是 null,因为它是对象类型。
      • int 不能为 null,而 Integer 可以为 null。这使得 Integer 在处理可能为空的值时更加灵活。
    • 缓存机制:
      • Integer 类在内部缓存了从 -128127 的整数对象。这意味着在这个范围内的 Integer 对象在自动装箱时会被重用,从而避免频繁创建和销毁对象。
    • 自动装箱和拆箱:
      • Java 5 引入了自动装箱(Autoboxing)和拆箱(Unboxing)机制,允许在int和Integer之间自动转换。例如:

        int a = 5;
        Integer b = a; // 自动装箱
        int c = b;     // 自动拆箱
        
  • 重载和重写的区别
    • 重载与重写的区别
      特性 重载(Overload) 重写(Override)
      定义 同一个类中,方法名相同但参数列表不同 子类中重新定义父类的方法
      发生位置 同一个类中 父子类之间
      方法名 必须相同 必须相同
      参数列表 必须不同(类型、个数、顺序) 必须相同
      返回值类型 可以不同 必须相同
      访问修饰符 可以不同 子类方法的访问权限不能比父类更严格
      异常抛出 可以不同 子类方法抛出的异常不能比父类更宽泛
      作用 提供方法的多态性 实现多态性,重新定义父类的行为
    • 总结
      • 重载:在同一个类中,方法名相同但参数列表不同,用于提供方法的多态性。
      • 重写:在子类中重新定义父类的方法,用于实现多态性,重新定义父类的行为。
  • 抽象类和接口有什么区别
    • 总结对比表
      特性 抽象类 (Abstract Class) 接口 (Interface)
      关键字 abstract class interface
      方法实现 可以有抽象方法和具体方法 Java 8 之前只能有抽象方法,之后可以有默认方法和静态方法
      成员变量 可以是普通变量 只能是 public static final 常量
      构造器 可以有构造器 不能有构造器
      继承 单继承(一个类只能继承一个抽象类) 多实现(一个类可以实现多个接口)
      设计目的 表示“是什么”,强调代码复用 表示“能做什么”,强调行为规范
      使用场景 共享代码和状态 定义行为和契约
  • 说说反射的用途及实现
    • 反射是 Java 提供的一种强大机制,允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法和构造器。反射的核心是通过 Class 类来获取类的元数据,并基于这些元数据进行动态操作。

    • 反射的用途
      1. 动态加载类
        • 在运行时根据条件加载不同的类,而不是在编译时固定。
      2. 动态调用方法
        • 在运行时调用对象的方法,即使该方法在编译时未知。
      3. 访问私有成员
        • 通过反射可以访问类的私有属性、方法和构造器(需要调用 setAccessible(true))。
      4. 框架开发
        • 许多框架(如 Spring、Hibernate)利用反射实现依赖注入、对象关系映射等功能。
      5. 通用工具
        • 编写通用的工具类,例如序列化、反序列化、对象拷贝等。
      6. 调试和测试
        • 在调试或测试时,动态检查对象的状态和行为。
    • 反射的实现

      反射的核心类是 java.lang.Class,通过它获取类的元数据。以下是反射的常见操作:

      1. 获取 Class 对象
      • 通过 Class.forName() 方法:

        Class<?> clazz = Class.forName("java.lang.String");
        
      • 通过对象的 getClass() 方法:

        String str = "Hello";
        Class<?> clazz = str.getClass();
        
      • 通过类字面常量:

        Class<?> clazz = String.class;
        
      1. 创建对象
      • 通过构造器创建对象:

        Constructor<?> constructor = clazz.getConstructor();
        Object obj = constructor.newInstance();
        
      1. 获取方法并调用
      • 获取方法:

        Method method = clazz.getMethod("methodName", parameterTypes);
        
      • 调用方法:

        Object result = method.invoke(obj, args);
        
      4. 获取字段并访问
      • 获取字段:

        Field field = clazz.getField("fieldName");
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值