目标:复习 OOP 的基本概念并通过实际场景加深理解。
理论知识:
面向对象(Object-Oriented Programming, OOP)是Java编程的核心思想,它是一种以对象为中心的编程范式。面向对象通过将现实世界的事物抽象为程序中的对象,强调数据和行为的封装、复用及灵活性。
-
OOP 的三大特性
-
封装:通过访问修饰符保护数据,提供公开方法访问。
-
继承:子类继承父类的属性和方法,代码复用。
-
多态:运行时多态(方法重写)和编译时多态(方法重载)。
-
// 定义一个类
public class Animal {
private String name; // 封装属性
public Animal(String name) {
this.name = name;
}
public void speak() { // 方法
System.out.println(name + " is making a sound.");
}
}
// 子类继承父类
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void speak() { // 多态:重写父类方法
System.out.println("Dog is barking!");
}
}
// 使用
public class Main {
public static void main(String[] args) {
Animal animal = new Animal("Generic Animal");
animal.speak();
Animal dog = new Dog("Buddy");
dog.speak(); // 多态
}
}
-
this
和super
的用法-
this
关键字
-
- 引用当前对象的属性:在方法或构造方法中,
this
可以用来区分成员变量和局部变量,当它们同名时:
public class Person {
private String name;
public Person(String name) {
this.name = name; // this.name 表示成员变量,name 表示构造方法的参数
}
public void display() {
System.out.println("Name: " + this.name); // 显式使用 this 引用成员变量
}
}
- 调用当前类的其他方法:
this
可以用来调用当前类的另一个方法:
public void setName(String name) {
this.name = name;
}
public void printInfo() {
this.display(); // 调用当前类的 display 方法
}
- 调用当前类的构造方法:在构造方法中,可以使用
this
调用当前类的其他构造方法。注意:调用构造方法的this
必须是构造方法的第一行代码。
public Person() {
this("Default Name"); // 调用有参构造方法
}
public Person(String name) {
this.name = name;
}
-
super
关键字 -
访问父类的成员变量:当子类与父类有同名成员变量时,可以用
super
访问父类的成员变量:
class Animal {
String name = "Animal";
}
class Dog extends Animal {
String name = "Dog";
public void printName() {
System.out.println("Child class name: " + this.name); // 子类的 name
System.out.println("Parent class name: " + super.name); // 父类的 name
}
}
-
调用父类的方法:当子类重写了父类的方法时,可以通过
super
调用父类的版本:
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
public void makeSound() {
super.sound(); // 调用父类的 sound 方法
}
}
-
调用父类的构造方法:在子类的构造方法中,可以使用
super
调用父类的构造方法。注意:调用父类构造方法的super
必须是构造方法的第一行代码。
class Animal {
public Animal(String name) {
System.out.println("Animal constructor: " + name);
}
}
class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父类构造方法
System.out.println("Dog constructor: " + name);
}
}
this
与 super
的区别
特性 | this | super |
作用范围 | 当前类 | 父类 |
访问成员 | 访问当前类的成员 | 访问父类的成员 |
调用构造方法 | 调用当前类的构造方法 | 调用父类的构造方法 |
访问方法和变量的权限 | 仅限当前类中的方法和变量 | 访问父类中被子类继承的方法和变量 |
class Animal {
String name = "Animal";
public Animal(String name) {
System.out.println("Animal Constructor: " + name);
}
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
String name = "Dog";
public Dog(String name) {
super(name); // 调用父类构造方法
System.out.println("Dog Constructor: " + this.name);
}
@Override
public void sound() {
System.out.println("Dog barks");
}
public void display() {
System.out.println("Name: " + this.name); // 当前类的 name
System.out.println("Parent Name: " + super.name); // 父类的 name
super.sound(); // 调用父类的方法
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.display();
}
}
总结:this
和 super
是Java中用于引用当前类和父类的重要关键字。this
代表当前对象,用于访问当前类的属性、方法或调用本类的构造方法;super
代表父类对象,用于访问父类的属性、方法或调用父类的构造方法。两者在多态、继承和构造方法中常用,帮助开发者更好地组织和管理类之间的关系。