面向对象有哪些特征?
封装、抽象、继承、多态
1.封装
封装就是指隐藏对象的属性和实现细节,将对象的数据、属性、行为、方法等组合到一个单一的单元中,并通过访问修饰符控制成员属性的访问和修改权限,再通过特定公开的方法(比如:getter和setter方法)暴露外面访问。
比如以下代码:
public class User{ //使用private修饰字段,实现封装 private String name = "***"; //提供公共的访问方法(getter) public String getName(){ return name; } //提供公共的修改方法(setter) public void setName(){ this.name = name; } }name属性被private封装起来,外面只能通过对象的getName方法才能访问,通过对象的setName方法才能进行修改。
2.抽象
抽象就是对同一个目标的共有的属性、特征、方法、功能、行为等进行抽取并归纳总结,它是一种将复杂现实简化为模型的过程,它关注的是对象的行为,而不用关注具体的实现细节。
在面向对象编程中,抽象主要通过抽象类和接口来实现的:
- 抽象类是不能被实例化的,他会包含一些抽象方法方法和具体实现的方法。
- 接口则是一种特殊的抽象类型,一般仅包含抽象方法的声明,在Java8+中可以包含默认方法和静态方法实现。
抽象可以在不知道具体实现的情况下编程,提高了代码的灵活性和扩展性。
比如下面的代码:
/** *抽象类:动物 */ public abstract class Animal{ //抽象方法,由子类实现 abstract void eat(); //具体方法可以复用 public void sleep(){ System.out.println("动物在睡觉"); } } /** *接口:可飞的 */ public interface Flyable{ void fly(); } /** *具体类:狗,继承动物,不实现接口 */ public class Bird extends Animal{ @Override void eat(){ System.out.println("狗吃骨头"); } } /** *具体类:鸟,继承动物,实现接口 */ public class Bird extends Animal implements Flyable{ @Override void eat(){ System.out.println("鸟吃虫子"); } @Override public void fly(){ System.out.println("鸟在飞"); } }通过抽象类和接口结合,可以实现灵活多变的类层级结构,同时解耦业务逻辑,是架构设计中非常常见的做法。
3.继承
继承是一种实现代码重用的机制,允许一个类继承另一个类的成员和方法,使得子类也能具有父类相同的行为。
继承是通过extends关键字实现的:
/** *父类:动物 */ public abstract class Animal{ //抽象方法,由子类实现 abstract void eat(); //具体方法可以复用 public void sleep(){ System.out.println("动物在睡觉"); } } /** *子类:狗,继承动物 */ public class Bird extends Animal{ @Override void eat(){ system.out.println("狗吃骨头"); } }Java类之间只能实现单继承,接口之间可以实现多继承。
4.多态
多态即【多种形态】,指同一个行为在不同的情况下多种不同的表现形式或形态,主要体现为同一个接口或父类的引用指向不同的实现对象,并能够在运行时动态决定调用的具体实现,这使得程序有更好的灵活性和可扩展性。
比如下面的代码:
public class Test{ public static void main(String[] args){ //父类引用指向子类对象(向上转型) Animal animal = new Dog(); //调用的是子类的重写方法,体现多态行为 animal.eat();//输出:狗吃骨头 } }通过父类引用变量指向子类时,当调用父类的方法时,它实际上会根据实际对象的类型,去调用子类中的方法,所以输出的是狗吃骨头,而不是动物吃饭。