Java基础 专题
专题目录
您的位置:java > Java基础专题 > Java抽象类
Java抽象类
作者:--    发布时间:2019-11-20

在java中用abstract关键字声明的类称为抽象类。 它可以有抽象和非抽象方法(带主体的方法)。

在学习java抽象类之前,先来了解java中的抽象。

java中的抽象

抽象是隐藏实现细节并仅向用户显示功能的过程。

另一种方式,它只向用户显示重要的事情,并隐藏内部详细信息,例如:发送短信,只需输入文本并发送消息。您也不需要知道有关邮件传递的内部处理过程。

抽象可以让你专注于对象做什么(实现的功能),而不是它如何做。

实现抽象的方法

在java中有两种实现抽象的方法,它们分别是:

  1. 抽象类(部分)
  2. 接口 (完全)

1. java中的抽象类

使用 abstract关键字声明的类被称为抽象类。需要扩展和实现它的方法。 它不能被实例化。

抽象类示例

abstract class a{}

抽象方法

一个被声明为 abstract 而没有实现的方法称为抽象方法。

抽象方法示例

abstract void printstatus();//no body and abstract

具有抽象方法的抽象类的示例

在这个例子中,bike是一个抽象类,只包含一个抽象方法:run()。 它由 honda 类提供实现。

abstract class bike {
    abstract void run();
}

class honda4 extends bike {
    void run() {// run 方法的实现
        system.out.println("running safely..");
    }

    public static void main(string args[]) {
        bike obj = new honda4();
        obj.run();
    }
}

上面示例中的代码执行结果如下 -

running safely..

理解抽象类的真实应用场景

在这个例子中,shape是一个抽象类,它的实现分别由rectanglecircle类提供。 大多数情况下,我们不知道实现类(即对最终用户隐藏),实现类的对象由工厂方法提供。
工厂方法是用于返回类的实例的方法。 稍后我们将在下一节中了解和学习工厂方法
在这个例子中,创建rectangle类的实例,rectangle类的draw()方法将被调用。创建一个类文件:testabstraction1.java ,它的代码如下所示 -

abstract class shape {
    abstract void draw();
}

// in real scenario, implementation is provided by others i.e. unknown by end
// user
class rectangle extends shape {
    void draw() {
        system.out.println("drawing rectangle");
    }
}

class circle1 extends shape {
    void draw() {
        system.out.println("drawing circle");
    }
}

// in real scenario, method is called by programmer or user
class testabstraction1 {
    public static void main(string args[]) {
        shape s = new circle1();// in real scenario, object is provided through
                                // method e.g. getshape() method
        s.draw();
    }
}

上面代码执行结果如下 -

drawing circle

在java中抽象类的另一个例子

创建一个java文件:testbank.java,代码如下所示 -

abstract class bank {
    abstract int getrateofinterest();
}

class sbi extends bank {
    int getrateofinterest() {
        return 7;
    }
}

class pnb extends bank {
    int getrateofinterest() {
        return 8;
    }
}

class testbank {
    public static void main(string args[]) {
        bank b;
        b = new sbi();
        system.out.println("rate of interest is: " + b.getrateofinterest() + " %");
        b = new pnb();
        system.out.println("rate of interest is: " + b.getrateofinterest() + " %");
    }
}

上面代码执行结果如下 -

rate of interest is: 7 %
rate of interest is: 8 %

具有构造函数,数据成员,方法等的抽象类

抽象类可以有数据成员,抽象方法,方法体,构造函数甚至main()方法。创建一个java文件:testabstraction2.java,代码如下所示 -

//example of abstract class that have method body  
abstract class bike {
    bike() {
        system.out.println("bike is created");
    }

    abstract void run();

    void changegear() {
        system.out.println("gear changed");
    }
}

class honda extends bike {
    void run() {
        system.out.println("running safely..");
    }
}

class testabstraction2 {
    public static void main(string args[]) {
        bike obj = new honda();
        obj.run();
        obj.changegear();
    }
}

上面代码执行结果如下 -

bike is created
running safely..
gear changed

规则:如果在类中有任何抽象方法,那个类必须声明为抽象的。

class bike12{  
    abstract void run();  
}

上面的 bike12 是无法编译通过的。

规则:如果你扩展任何具有抽象方法的抽象类,必须提供方法的实现或使这个类抽象化。

抽象类的另一个真实场景

抽象类也可以用于提供接口的一些实现。 在这种情况下,终端用户可能不会被强制覆盖接口的所有方法。

注意:如果您是初学者到java,请跳过此示例先学习接口(interface)

interface a {
    void a();

    void b();

    void c();

    void d();
}

abstract class b implements a {
    public void c() {
        system.out.println("i am c");
    }
}

class m extends b {
    public void a() {
        system.out.println("i am a");
    }

    public void b() {
        system.out.println("i am b");
    }

    public void d() {
        system.out.println("i am d");
    }
}

class test5 {
    public static void main(string args[]) {
        a a = new m();
        a.a();
        a.b();
        a.c();
        a.d();
    }
}

上面代码执行结果如下 -

i am a
i am b
i am c
i am d

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册