1.继承的基础概念
继承是面向对象编程中的一个核心概念,它允许我们定义一个基础类(也称为父类或基类),然后创建新的类(子类或派生类)来继承这个基础类的属性和方法。这样,子类就可以重用、扩展或修改从父类继承的行为。在Java中,继承通过extends关键字实现。
例子:
如果我们有一个Animal类,它可以有声音属性和移动方法,那么我们可以创建一个Dog类来继承Animal类,并添加特定于狗的行为,如woff方法。这样,Dog类就拥有了Animal类的所有属性和方法,并且还可以有自己的独特功能。
这里是一个简单的例子:
// 父类
public class Animal {
protected String sound;
public Animal(String sound) {
this.sound = sound;
}
public void move() {
System.out.println("This animal moves.");
}
public void makeSound() {
System.out.println(sound);
}
}
// 子类
public class Dog extends Animal {
// 使用super关键字调用父类的构造函数
public Dog(String sound) {
super(sound);
}
// 子类可以覆盖父类的方法
@Override
public void makeSound() {
// 覆盖父类的方法以改变行为
System.out.println("The dog barks: " + sound);
}
// 子类也可以添加新的方法
public void woof() {
System.out.println("Woof!");
}
}
在这个例子中,Dog类继承了Animal类,并重写了makeSound方法来改变其行为,同时添加了一个新的woff方法。这种设计使得代码更加模块化,易于维护和扩展。
2.抽象类和接口
抽象类和接口都是Java中用于实现抽象的机制,但它们之间有一些关键的区别:
1.定义:1.抽象类是一个不能被实例化的类,通常用作其他类的基类。它可以用abstract关键字声明。
2.接口是一种完全抽象的结构,包含一组方法名,但没有实现,用interface关键字声明。
3.成员:1.抽象类可以包含具体的方法实现,也可以包含字段和静态方法。
2.接口只能包含抽象方法(没有方法体)和默认方法、静态方法以及常量。
3.多重继承:1.Java不支持多个类继承,即一个类只能继承自一个抽象类。
2.一个类可以实现多个接口。
3.访问修饰符:1.抽象类的方法可以有不同的访问权限(private, default,protected ,public)。
2.接口中的所有方法默认都是public的,而且必须是抽象的。
3.构造器:1.抽象类可以有构造器,用于初始化其字段。
2.接口中不能有构造器。
3.变量:1.抽象类可以有实例变量和静态变量。
2.接口只能有常量,它们默认是public static final的。
3.继承关系:1.抽象类可以有具体的子类,这些子类必须实现抽象类中的所有抽象方法,除非子类也是抽象的。
2.实现接口的类必须提供接口中所有声明的方法的具体实现。
3.用途:1.抽象类通常用于“is-a”关系,当你需要共享代码并且知道一些具体信息时。
2.接口用于“like-a”关系,当不同的类执行相同的功能但方式不同,或者当你想要确保某些类提供一组特定的方法时。
实例:
抽象类:
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating.");
}
// 抽象方法,需要在子类中实现
public abstract void makeSound();
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " says Woof!");
}
}
接口:
public interface Drawable {
void draw(); // 抽象方法
default void color() { // 默认方法
System.out.println("Default coloring");
}
static void allDrawables() { // 静态方法
System.out.println("Drawing all drawable objects");
}
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
// 可以重写Drawable接口的color方法
@Override
public void color() {
System.out.println("Coloring the circle");
}
}
在这两个例子中,Animal是一个抽象类,它有一个具体的eat方法和一个抽象makeSound方法。Dog类继承自Animal并实现了makeSound方法。而Drawable是一个接口,它有一个抽象方法draw和一个默认方法color,以及一个静态方法allDrawables。Circle类实现了Drawable接口并提供了draw方法的具体实现。