在Java编程中,“上级命令”通常指调用上级类(父类)方法、实现接口方法、处理命令行参数或通过设计模式封装的请求执行逻辑,这些场景体现了Java中层级调用、接口约束和命令解核的核心机制,以下是具体实现方式和注意事项。

调用父类方法(super关键字)
当子类需要复用父类的逻辑或调用父类被重写的方法时,使用super关键字实现“上级命令”。
调用父类构造方法
子类构造方法中必须通过super()调用父类构造方法(若父类无无参构造,则必须显式调用),且必须位于子类构造方法的第一行。
class Parent {
Parent() { System.out.println("Parent构造方法"); }
}
class Child extends Parent {
Child() { super(); // 必须调用父类构造方法
System.out.println("Child构造方法");
}
}
调用父类成员方法
子类重写父类方法后,若需执行父类的原始逻辑,可通过super.methodName()调用。
class Animal {
void eat() { System.out.println("Animal吃食物"); }
}
class Dog extends Animal {
@Override
void eat() {
super.eat(); // 调用父类eat()
System.out.println("Dog吃骨头");
}
}
调用父类成员变量
若子类隐藏了父类的成员变量(同名),可通过super.variableName访问父类变量。

class Parent {
int value = 10;
}
class Child extends Parent {
int value = 20;
void print() {
System.out.println("子类value: " + value);
System.out.println("父类value: " + super.value);
}
}
实现接口方法(implements关键字)
接口中的方法可视为“上级命令”,实现类必须重写所有抽象方法(除非是默认方法或静态方法),否则编译报错。
示例:Runnable接口
interface Runnable {
void run(); // 抽象方法,实现类必须重写
}
class MyThread implements Runnable {
@Override
public void run() {
System.out.println("线程执行任务");
}
}
// 使用时通过Thread调用
public class Test {
public static void main(String[] args) {
Runnable r = new MyThread();
Thread t = new Thread(r);
t.start();
}
}
命令行参数处理(main方法的args)
Java程序的入口main方法接收String[] args参数,用于接收命令行输入的“上级命令”,参数按空格分割为数组。
示例:计算命令行参数的和
public class ArgsDemo {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("请输入参数");
return;
}
int sum = 0;
for (String arg : args) {
try {
sum += Integer.parseInt(arg); // 将字符串转为整数
} catch (NumberFormatException e) {
System.out.println("参数" + arg + "不是有效数字");
}
}
System.out.println("参数和为: " + sum);
}
}
// 执行方式:java ArgsDemo 10 20 30
命令模式(Command Pattern)
将请求封装成命令对象,调用者通过调用命令对象的execute()方法执行请求,实现请求与执行者的解耦,适用于需要“撤销/重做”或“队列执行”的场景。
核心角色与示例
// 接收者:执行具体操作
class Light {
void on() { System.out.println("灯打开"); }
void off() { System.out.println("灯关闭"); }
}
// 命令接口
interface Command {
void execute();
}
// 具体命令:打开灯
class LightOnCommand implements Command {
private Light light;
LightOnCommand(Light light) { this.light = light; }
@Override
public void execute() { light.on(); }
}
// 调用者:触发命令
class RemoteControl {
private Command command;
void setCommand(Command command) { this.command = command; }
void pressButton() { command.execute(); }
}
// 使用
public class CommandDemo {
public static void main(String[] args) {
Light light = new Light();
Command onCommand = new LightOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(onCommand);
remote.pressButton(); // 输出:灯打开
}
}
不同场景“上级命令”总结
| 场景 | 关键字/语法 | 示例说明 | 注意事项 |
|---|---|---|---|
| 调用父类构造方法 | super() | 子类构造方法第一行调用父类构造 | 父类无无参构造时必须显式调用 |
| 调用父类成员方法 | super.methodName() | 子类重写方法后调用父类原始逻辑 | 不能调用父类private方法 |
| 实现接口方法 | implements | 重写接口所有抽象方法 | 默认方法(default)可选择重写 |
| 命令行参数处理 | main方法的args | 接收字符串数组,需手动类型转换 | 参数长度需校验,避免空指针异常 |
| 命令模式 | Command接口 | 封装请求对象,调用者调用execute() | 需定义接收者、命令、调用者角色 |
相关问答FAQs
Q1:Java中调用父类构造方法时,super()必须放在构造方法第一行吗?
A:是的,根据Java语法规则,子类构造方法中若调用父类构造方法,必须使用super()且必须位于构造方法的第一行,这是因为子类对象初始化前,必须先完成父类的初始化,否则会编译报错,若未显式调用super(),编译器会自动添加父类的无参构造super(),但若父类没有无参构造,则必须手动显式调用。

Q2:命令模式中的“上级命令”和普通方法调用有什么区别?
A:普通方法调用是直接调用对象的方法,调用者和执行者紧耦合;而命令模式将请求封装成命令对象,调用者通过调用命令对象的execute()方法间接执行请求,解耦了调用者和执行者,普通调用是remote.pressButton()直接触发灯的on()方法,而命令模式中,pressButton()调用的是Command对象的execute(),具体执行逻辑由LightOnCommand封装,调用者无需知道灯的具体实现,便于扩展(如新增LightOffCommand)和灵活管理(如命令队列、撤销操作)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/15770.html