基本功
-
面向对象的特征
-
封装(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
类在内部缓存了从-128
到127
的整数对象。这意味着在这个范围内的Integer
对象在自动装箱时会被重用,从而避免频繁创建和销毁对象。
-
自动装箱和拆箱:
-
Java 5 引入了自动装箱(Autoboxing)和拆箱(Unboxing)机制,允许在int和Integer之间自动转换。例如:
int a = 5; Integer b = a; // 自动装箱 int c = b; // 自动拆箱
-
-
-
重载和重写的区别
-
重载与重写的区别
特性 重载(Overload) 重写(Override) 定义 同一个类中,方法名相同但参数列表不同 子类中重新定义父类的方法 发生位置 同一个类中 父子类之间 方法名 必须相同 必须相同 参数列表 必须不同(类型、个数、顺序) 必须相同 返回值类型 可以不同 必须相同 访问修饰符 可以不同 子类方法的访问权限不能比父类更严格 异常抛出 可以不同 子类方法抛出的异常不能比父类更宽泛 作用 提供方法的多态性 实现多态性,重新定义父类的行为 -
总结
- 重载:在同一个类中,方法名相同但参数列表不同,用于提供方法的多态性。
- 重写:在子类中重新定义父类的方法,用于实现多态性,重新定义父类的行为。
-
-
抽象类和接口有什么区别
-
说说反射的用途及实现
-
反射是 Java 提供的一种强大机制,允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法和构造器。反射的核心是通过
Class
类来获取类的元数据,并基于这些元数据进行动态操作。 -
反射的用途
-
反射的实现
反射的核心类是
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;
-
通过构造器创建对象:
Constructor<?> constructor = clazz.getConstructor(); Object obj = constructor.newInstance();
-
获取方法:
Method method = clazz.getMethod("methodName", parameterTypes);
-
调用方法:
Object result = method.invoke(obj, args);
4. 获取字段并访问
-
获取字段:
Field field = clazz.getField("fieldName");
-
-