[Java-基础] 面向对象
2026年3月14日大约 5 分钟
[Java-基础] 面向对象
扩展学习
怎么理解面向对象?
面向对象就是将现实的事物抽象成对象。
- 类:类是抽象的出来的模板。定义它的属性和方法。
- 对象:具体的实例。
- 设计思想:以对象为中心,强调对象之间的交互来完成任务。
面向对象的核心在于:封装、继承、多态。
说一下面向对象的三大特性
- 封装:通过合理隐藏、合理暴露,增强代码安全性和可维护性。
- 继承:子类自动拥有父类的属性和方法,增强代码复用性。
- 多态:同一个方法,有不同的表现形式。多态可以分为编译时多态(方法重载)和运行时多态(方法重写)。
多态体现在哪几个方面
- 方法重载:同一个类中,方法名相同,参数不同,编译时确定调用哪个方法。
- 方法重写:子类重写父类的方法,运行时根据对象的实际类型确定调用哪个方法。
- 接口和实现:不同类可以实现同一个接口,表现出不同的行为。
- 父类引用指向子类对象:如 Parent p = new Child()。可以在不修改现有代码的情况下,增加新的子类来实现新的功能。
多态解决了什么问题?
多态解决了代码耦合度高和扩展性差的问题。
- 可以面向接口编程,降低各模块之间的依赖。
- 通过父类引用指向子类对象,可以在不修改现有代码的情况下,增加新的子类来实现新的功能,增强了代码的扩展性。
面向对象的设计原则有哪些?
- 开闭原则:软件实体应该对扩展开放,对修改封闭。
- 里氏替换原则:子类重写父类实现的时候,不能违背父类的原有行为。
- 依赖倒置原则:所有的调用都应该通过接口去调,不应该直接调用具体的实现。
- 单一职责原则:一个类只负责一个职责。
- 接口隔离原则:客户端不应该依赖它不需要的接口。
- 最小知识原则:一个对象应该对其他对象有尽可能少的了解。
实际上要根据业务复杂度权衡,是否要遵循这些原则,避免过度设计。
重载和重写的区别是什么?
重载是在同一个类中定义多个同名方法;重写是子类重新定义父类的方法。
抽象类和普通类的区别是什么?
- 实例化:抽象类不能实例化,普通类可以实例化。
- 方法定义:普通类不能包含抽象方法,抽象类可以包含普通方法和抽象方法。
Java抽象类和接口的区别是什么?
- 抽象类只能单继承,接口可以多实现。
- 抽象类有构造方法,接口没有构造方法。
- 抽象类可以有成员变量,接口只能有常量。
- 方法实现:抽象类可以有方法的实现,接口默认是不能实现方法的(Java 8 之后接口可以有默认方法实现)。
抽象类能加final修饰吗?
不能。因为抽象类需要被继承,而final修饰的类不能被继承。
接口里面可以定义哪些方法?
- 抽象方法:没有方法体的方法,必须由实现类来实现。
- 默认方法:Java 8 之后引入的,允许在接口中提供具体实现。
- 静态方法:Java 8 之后引入的,属于接口本身,无需实例化即可调用。
- 私有方法:Java 9 之后引入的,供接口内部使用,不能被实现类调用。
抽象类可以被实例化吗?
不能,继承抽象类并实现其抽象方法的子类可以被实例化。
接口可以包含构造函数吗?
不能,接口不能包含构造函数,因为接口不能被实例化。
解释Java中的静态变量和静态方法
都由static关键字修饰。
静态变量
静态变量属于类本身,在内存中只有一份。所有对象共享同一个静态变量。静态变量在类加载时初始化,可以通过类名直接访问。
静态方法
- 静态方法也属于类本身,可以通过类名直接调用,无需实例化。
- 静态方法只能调用静态变量和静态方法,不能直接访问非静态成员。
- 静态方法不能被重写,但可以被隐藏。
- 隐藏就是在子类定义方法名和参数都相同的静态方法,让父类的静态方法被隐藏。
- 静态方法不能使用
this关键字,因为它不属于任何实例。
使用场景
- 静态变量:需要共享的资源如,常量、计数器。
- 静态方法:工具类方法、工厂方法等。
非静态内部类和静态内部类的区别?
- 依赖关系不同:非静态内部类依赖于外部类的实例来创建;静态内部类不依赖于外部类的实例,可以直接创建。
- 访问权限不同:非静态内部类可以访问外部类的所有成员;静态内部类只能访问外部类的静态成员。
- 定义限制不同:非静态内部类不能定义静态成员;静态内部类可以定义静态成员。
- 在实际使用中,为了避免内存泄露,我会使用静态内部类。
非静态内部类可以直接访问外部方法,编译器是怎么做到的
是因为编译器在生成字节码时,会为非静态内部类维护一个指向外部类实例的引用。
通过这个引用访问外部类的成员变量和方法。