18.1.1 面向对象三大特性详解与应用
1. 封装(Encapsulation)
1.1 基本概念
封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
1.2 实现方式
- 使用private修饰符隐藏属性
- 提供public的getter和setter方法
- 对方法参数进行有效性检查
1.3 代码示例
public class Student { // 私有属性,外部无法直接访问 private String name; private int age; private double score; // 构造方法 public Student(String name, int age, double score) { this.name = name; setAge(age); // 使用setter方法进行参数校验 setScore(score); } // getter方法 public String getName() { return name; } public int getAge() { return age; } public double getScore() { return score; } // setter方法,包含参数校验 public void setName(String name) { if (name != null && !name.trim().isEmpty()) { this.name = name; } else { throw new IllegalArgumentException("姓名不能为空"); } } public void setAge(int age) { if (age >= 0 && age <= 150) { this.age = age; } else { throw new IllegalArgumentException("年龄必须在0-150之间"); } } public void setScore(double score) { if (score >= 0 && score <= 100) { this.score = score; } else { throw new IllegalArgumentException("成绩必须在0-100之间"); } } }
1.4 面试常见问题
Q: 为什么要使用封装?A:
- 数据安全性:防止外部代码随意修改对象内部状态
- 代码维护性:内部实现变化不影响外部调用
- 数据完整性:通过setter方法进行数据校验
- 访问控制:可以控制哪些属性和方法对外可见
2. 继承(Inheritance)
2.1 基本概念
继承是面向对象编程中的一种机制,允许一个类(子类)获得另一个类(父类)的属性和方法。Java使用extends关键字实现继承。
2.2 继承特点
- Java只支持单继承,一个类只能继承一个父类
- 子类可以访问父类的非私有成员
- 子类可以重写父类的方法
- 使用super关键字调用父类的构造方法和方法
2.3 代码示例
// 父类 public class Animal { protected String name; protected int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void eat() { System.out.println(name + "正在吃东西"); } public void sleep() { System.out.println(name + "正在睡觉"); } public void makeSound() { System.out.println(name + "发出声音"); } } // 子类 public class Dog extends Animal { private String breed; // 品种 public Dog(String name, int age, String breed) { super(name, age); // 调用父类构造方法 this.breed = breed; } // 重写父类方法 @Override public void makeSound() { System.out.println(name + "汪汪叫"); } // 子类特有方法 public void wagTail() { System.out.println(name + "摇尾巴"); } public void fetch() { System.out.println(name + "去捡球"); } } // 另一个子类 public class Cat extends Animal { private boolean isIndoor; public Cat(String name, int age, boolean isIndoor) { super(name, age); this.isIndoor = isIndoor; } @Override public void makeSound() { System.out.println(name + "喵喵叫"); } public void climb() { System.out.println(name + "爬树"); } }
2.4 面试常见问题
Q: Java为什么不支持多继承?A:
- 避免钻石问题:如果一个类继承两个父类,而这两个父类又继承同一个祖先类,会产生歧义
- 简化语言设计:单继承使语言更简洁,降低复杂性
- 接口弥补:Java通过接口实现多重继承的效果
Q: 继承和组合的区别?A:
- 继承:is-a关系,强耦合,子类依赖父类
- 组合:has-a关系,弱耦合,更灵活
3. 多态(Polymorphism)
3.1 基本概念
多态是指同一个接口,使用不同的实例而执行不同的操作。在Java中,多态主要通过方法重写和接口实现来体现。
3.2 多态实现条件
- 继承关系(或接口实现)
- 方法重写
- 父类引用指向子类对象
3.3 代码示例
// 使用上面定义的Animal、Dog、Cat类 public class Polymo
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经