Java核心概念解析:构造器、继承与多态机制
构造方法详解
在Java中,每个类都会默认拥有一个无参构造方法,除非显式定义其他构造函数。当创建对象时,通过new关键字调用构造器完成实例初始化。
public class Person {
String name;
int age;
// 无参构造
public Person() {
System.out.println("执行Person的默认构造");
}
// 带参数的构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
- 若定义了有参构造,则必须手动写出无参构造,否则无法使用无参方式实例化。
- IDEA中可通过Alt+Insert快速生成构造方法。
继承机制与super关键字
Java支持单继承,所有类都直接或间接继承自Object类。子类通过extends关键字继承父类成员,并可使用super访问父类内容。
public class Person {
protected String name = "张三";
public Person() {
System.out.println("Person类初始化");
}
public void show() {
System.out.println("这是Person的方法");
}
}
public class Student extends Person {
private String name = "李四";
public Student() {
super(); // 必须位于构造方法首行
System.out.println("Student类初始化");
}
public void testShow() {
show(); // 调用当前类重写后的方法
this.show(); // 明确调用本类方法
super.show(); // 调用父类原始方法
}
public void testName(String name) {
System.out.println(name); // 局部变量
System.out.println(this.name); // 子类字段
System.out.println(super.name); // 父类字段
}
}
super()用于调用父类构造函数,且必须出现在子类构造方法的第一条语句。super只能在子类中使用,而this可用于任意类。super和this不能同时作为构造调用出现在同一方法中。
方法重写(Override)规则
当子类对从父类继承来的方法不满意时,可以进行重写。需满足以下条件:
- 方法名和参数列表完全一致;
- 访问修饰符不能比父类更严格(如父类为protected,子类可用public,但不能用private);
- 抛出异常类型范围不可扩大;
- 静态方法、final方法以及private方法无法被重写。
重写的核心在于行为改变,而非签名变化。
多态性的实现原理
多态指同一操作作用于不同对象时,可能表现出不同的行为。其成立前提包括:
- 存在继承关系;
- 子类重写了父类方法;
- 父类引用指向子类实例。
Person p1 = new Student(); // 合法:向上转型
p1.show(); // 实际执行Student中的show方法
// 属性无多态性
System.out.println(p1.name); // 输出"张三",取的是引用类型的属性
注意:对象能调用哪些方法由其声明类型决定,但实际执行的方法体取决于运行时真实类型。
接口的设计与应用
接口是一种规范契约,强调"做什么"而非"如何做"。接口特点如下:
- 仅包含抽象方法和公共静态常量;
- 不能被直接实例化;
- 没有构造函数;
- 一个类可通过
implements实现多个接口,从而模拟多重继承。
public interface UserService {
int DEFAULT_AGE = 99; // 公共常量,默认public static final
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
public interface TimeService {
void timer();
}
public class UserServiceImpl implements UserService, TimeService {
@Override
public void add(String name) { }
@Override
public void delete(String name) { }
@Override
public void update(String name) { }
@Override
public void query(String name) { }
@Override
public void timer() { }
}
接口增强了程序的扩展性和解耦能力,是构建松散耦合系统的重要工具。