1、封装
封装就是把客观事物封装成抽象的类,并规定类中的变量和方法只让可信的类或对象操作。
(1)将客观事物封装成抽象的类,类中的变量和方法只能通过类名或对象名加“.”的方式来访问。 (2)将类的某些变量和方法隐藏在类内部,不允许用户直接访问,或者留下少量的方法供外部访问。
步骤与示例:
-
私有化属性:使用
private
修饰符隐藏属性。 -
提供公共方法:通过
getter
和setter
方法访问或修改属性,可添加逻辑验证数据有效性。
public class Person {
// 私有属性
private String name;
private int age;
// 公共的getter和setter
public String getName() {
return name;
}
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0 && age <= 150) { // 验证年龄合法性
this.age = age;
}
}
}
关键点:
-
外部类必须通过
getName()
和setName()
等方法操作数据。 -
在
setter
中可添加校验逻辑(如年龄非负),防止非法数据。
2、继承
(1)extends关键字
语法格式
[类修饰符] class <子类名> extends <父类名> {
…… // 类实体
}
注意:
Java仅支持单继承,即一个类只能有一个父类。同时,类的继承不改变类成员的访问权限,也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的特性,且子类不能继承父类的构造方法。
(2)方法重写
方法重写(override)又称为方法覆盖,它在子类中创建一个与父类具有相同名称、相同返回值类型、相同参数列表的方法,只是方法体不同,以实现不同于父类的功能。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要重写方法。
注意:
- 方法的访问控制权限只能从小的范围修改到大的范围(private < friendly< protected < public)。
- 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的异常。例如,父类的一个方法声明了一个检査异常IOException,在重写这个方法时不能抛出Exception,因为Exception是IOException的父类,只能拋出IOException的子类异常。
- 不能重写构造方法。
- 子类和父类在同一个包中时,子类可以重写父类的所有成员方法,除了声明为static、private和final的方法;子类和父类不在同一个包中时,子类只能重写父类的声明为public和protected的非final方法。
(3)super关键字
super关键字是一个引用变量,用于引用直接父类对象。
用法:
(1)调用直接父类的构造方法。由于子类不能继承父类的构造方法,因此,要调用父类的构造方法时,必须在子类构造方法体的第一行使用super关键字。该方法会调用父类相应的构造方法来完成子类对象的初始化工作。
例如:
super(); // 调用直接父类的无参构造方法
super(param); // 调用直接父类的有参构造方法,可有多个参数
// 实参列表必须与父类构造方法对应
(2)调用直接父类的成员方法和成员变量。子类重写了父类的方法后,可以通过“super.方法名”调用父类原有的成员方法。如果子类定义了和父类同名的成员变量,此时父类的成员变量被隐藏,可以通过“super.变量名”调用父类原有的成员变量。
步骤与示例:
-
定义父类:创建基类,包含通用属性和方法。
-
子类继承:使用
extends
关键字继承父类,可添加新特性或重写方法。
// 父类
public class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
public void sleep() {
System.out.println("Animal is sleeping.");
}
}
// 子类继承父类
public class Dog extends Animal {
// 新增方法
public void bark() {
System.out.println("Dog is barking.");
}
// 重写父类方法
@Override
public void eat() {
System.out.println("Dog is eating bones.");
}
}
关键点:
-
子类自动获得父类的非私有(
public
,protected
)方法和属性。 -
使用
@Override
注解重写父类方法,定制子类行为。 -
单继承限制:Java不支持多继承,一个子类只能有一个父类。
三、封装与继承的协作
-
访问权限控制:
-
父类的
private
属性对子类不可见,需通过protected
或public
方法间接访问。 -
protected
允许子类访问,同时对外部类隐藏。
-
public class Vehicle {
private int speed; // 私有属性,子类不可直接访问
protected void setSpeed(int speed) { // 子类可通过此方法修改speed
if (speed >= 0) {
this.speed = speed;
}
}
public int getSpeed() {
return speed;
}
}
public class Car extends Vehicle {
public void accelerate() {
setSpeed(getSpeed() + 10); // 通过父类方法访问私有属性
}
}
四、常见问题解答
-
子类能否继承父类的私有属性?
子类拥有父类的私有属性,但无法直接访问,必须通过父类提供的public
或protected
方法操作。 -
何时使用继承?
当存在“is-a”关系时(如Dog
是Animal
)。若为“has-a”关系(如Car
有Engine
),应使用组合。 -
super关键字的作用
-
调用父类方法:
super.parentMethod();
-
调用父类构造函数:子类构造函数首行需用
super(args);
。
-