什么是抽象?

Java语言中,用abstract关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。

abstract class Shapes { //基本形状类,抽象类
public abstract void draw(); //绘图方法,抽象方法
}

class Circle extends Shapes { //圆形类继承于基本形状类
public void draw() { //实现抽象父类的抽象绘图方法
System.out.println(“绘制了一个圆形。”);
}
}

class Square extends Shapes { //正方形类继承与基本形状类
public void draw() { //实现抽象父类的抽象绘图方法
System.out.println(“绘制了一个正方形。”);
}
}

public class abstractDemo { //该类用于容纳main方法
public static void main(String[] args) {
Shapes obj;
obj = new Circle(); //父类的引用指向子类的实例
obj.draw(); //调用绘图方法
obj = new Square(); //父类的引用指向子类的实例
obj.draw(); //调用绘图方法
}

抽象的特点
抽象类不可以直接实例化,只可以用来继承;
抽象类的派生子类应该提供对其所有抽象方法的具体实现;
可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型;
如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化;
抽象类中也可以包含有非抽象的方法;
构造方法和静态方法不可以修饰为abstract。

### 作用及定义 在C#中,**抽象类**(Abstract Class)是设计为被继承的类,它不能直接创建实例。抽象类使用 `abstract` 修饰符声明,并且可以包含**抽象方法**(Abstract Method)或普通方法[^2]。抽象方法是没有实现的方法,只有方法的定义而没有具体实现,它必须在子类中被实现。抽象方法使用 `abstract` 关键字声明,并且只能定义在抽象类中[^1]。 ### 使用场景 抽象类的主要用途是为派生类提供一个统一的接口,并且可以包含一些共享的实现逻辑。这使得它与接口不同,因为接口不能包含方法的具体实现。抽象类适用于需要在多个派生类之间共享部分实现,但又要求每个派生类实现特定功能的情况[^4]。 例如,一个抽象类可以定义一个方法 `CalculateArea()`,但具体的实现(如计算矩形面积或圆形面积)由派生类完成。这种设计减少了代码重复,并确保了接口的一致性。 ### 抽象类与抽象方法的关系 抽象类可以包含抽象方法和非抽象方法的任意组合。如果一个类包含至少一个抽象方法,则该类必须声明为抽象类。抽象方法的实现推迟到派生类中进行,这为多态性提供了基础[^2]。 ### 抽象方法与虚方法的区别 在C#中,**虚方法**(Virtual Method)和**抽象方法**都支持多态性,但它们有关键区别: - 虚方法具有实现,并且可以在派生类中被重写(使用 `override` 关键字)。包含虚方法的类可以实例化。 - 抽象方法没有实现,必须在派生类中实现。包含抽象方法的类必须是抽象类,并且不能被实例化[^3]。 例如,虚方法适用于希望提供默认实现,但允许子类修改或扩展的情况。而抽象方法适用于强制派生类提供自定义实现的情况。 ### 示例代码 以下是一个包含抽象类和抽象方法的示例: ```csharp // 定义一个抽象类 abstract class Shape { // 定义一个抽象方法 public abstract double CalculateArea(); // 非抽象方法 public void DisplayMessage() { Console.WriteLine("This is a shape."); } } // 派生类实现抽象方法 class Rectangle : Shape { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } // 实现抽象方法 public override double CalculateArea() { return width * height; } } ``` 在上述代码中,`Shape` 是一个抽象类,它包含一个抽象方法 `CalculateArea()` 和一个非抽象方法 `DisplayMessage()`。`Rectangle` 类继承 `Shape` 并实现了 `CalculateArea()` 方法。 ### 总结 - 抽象类不能被实例化,只能作为基类。 - 抽象方法没有实现,必须在派生类中实现。 - 抽象类适用于提供共享逻辑和强制接口定义的场景。 - 抽象方法与虚方法在多态性上有不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值