目錄
Hello!大家好哇!我是灰小猿!
最近在學習C#和Java的抽象類和接口時搞得頭疼,今天在這裏和大家分享一下Java和C#中的抽象類到底是怎麼樣的存在,是否真的像名稱那樣“抽象”?
接下來,我們通過抽象類在Java和C#中的應用對比分析一下!
什麼是抽象類?
首先,什麼是抽象類?
其實在進行開發時,我們可以假定抽象類是一種對內容的約束,打個比方來說,平行四邊形類應該具有的特徵和屬性是:對邊平行且相等,具有面積和周長;等邊三角形類應該具有的特徵和屬性是:三條邊長度相等,具有面積和周長,這些描述視乎都是合乎情理的。
那麼我們對比一下其實就可以得到一個圖形類的特徵屬性:具有面積和周長。所以我們就可以將該圖形類定義爲一個抽象類,所有繼承該圖形類的對象都應該具有它的特徵屬性,即具有面積和周長,這就可以說給了某些繼承這個圖形類的對象一個約束條件,就是必須面積和周長才能繼承該類。
如何定義抽象類?
在解決實際問題時,一般將父類定義爲抽象類,並且在Java和C#中抽象類具有以下公共特徵:
以下是抽象類在Java和C#中的實現代碼,該代碼在Java和C#中通用:
abstract class Test
{
//使用abstract關鍵字實現抽象類的創建
}
什麼是抽象方法?
我們知道在類中是具有方法的,那麼顧名思義,在抽象類中也是具有方法的,並且在抽象類中定義的方法可以是抽象方法,注意:可以是抽象方法,也就是說在抽象類中定義的方法,可以是抽象的,也可以是普通的。
如上面的圖形類,其中每個圖形都具有的屬性是面積和周長。那麼我們就可以將計算面積和周長的方法定義爲抽象方法。也就是說,當其他類繼承該抽象類時,必須要實現面積和周長的方法。
如何定義抽象方法?
使用關鍵字abstract定義的類成爲抽象類,使用該關鍵字定義的方法成爲抽象方法。抽象方法具有以下特徵:
以下是在一個抽象類中定義抽象方法的代碼,在Java和C#中通用:
//定義圖形類爲抽象類,在抽象類中定義抽象方法求周長
abstract class ShapeArea
{
public abstract Perimeter();
}
抽象類和抽象方法的實現
我們在上面說道一般將父類定義爲抽象類,因此想要實現抽象類及其其中的抽象方法,就必須繼承或派生自該抽象類。
注意啦:在C#中繼承抽象類使用“:”
而在Java中繼承抽象類則需要使用“extends”關鍵字。
同時,在繼承了抽象類之後,若該抽象類中存在抽象方法,則需要使用關鍵字override對該方法進行重寫。同時這也是實現抽象方法的一種方式。
下面分別是在Java和C#中實現抽象方法的案例分析,使用圓形類繼承圖形抽象類實現求面積:
在Java中:
定義抽象類:
package exeicise1;
//定義圖形抽象類
public abstract class ShapeArea {
abstract void Area(); //定義抽象方法
}
定義圓形類繼承抽象類:
package exeicise1;
//定義圓形類繼承抽象類
public class Circle extends ShapeArea{
public double r;
public double s;
//對抽象方法重寫
public void Area() {
s = 3.14 * r* 2;
System.out.println("面積是:" + s);
}
}
在主方法中調用圓形類輸出方法:
package exeicise1;
public class Testmain {
public static void main(String[] args) {
Circle circle = new Circle(); //定義對象接收圓形類
circle.r = 2;
circle.Area();
}
}
結果爲:
在C#中:
定義圖形類:
using System;
using System.Collections.Generic;
using System.Text;
namespace Texta
{
//定義抽象類
abstract class ShapeArea
{
public abstract void Area(); //定義抽象方法
}
}
定義圓形類並繼承抽象類:
using System;
using System.Collections.Generic;
using System.Reflection.PortableExecutable;
using System.Security;
using System.Text;
//using ShapeArea;
namespace Texta
{
//定義圓形類繼承抽象類
class Circle : ShapeArea
{
public double r;
public double s;
//對抽象方法重寫並實現
public override void Area()
{
s = 3.14 * r * r;
Console.WriteLine("面積是:" + s);
}
}
}
在主方法調用圓形類實現:
using System;
using System.Reflection.PortableExecutable;
namespace gyg_2_3
{
class Program
{
static void Main(string[] args)
{
Circle circle = new Circle();
circle.r = 2;
circle.Area();
}
}
}
運行結果如下:
小夥伴對比就會發現其實在Java和C#中抽象類的定義和實現是基本相同的。實現接口類的主要目的就是爲了制定一種對具有相同屬性的程序的約束。
覺得有用記得點贊關注喲!
同時有不足的地方還希望能與小夥伴一起交流!
大灰狼期待與你一同進步!