首页 > 编程知识 正文

java框架,JAVA 抽象类

时间:2023-05-03 16:42:20 阅读:154088 作者:528

一、抽象类的基本概念

普通类是直接生成实例化对象的完整功能类,可以包含构造方法、普通方法、静态方法、常量和变量等。 抽象类是将抽象方法添加到普通类的结构中。

那么什么是抽象的方法呢? 所有常规方法上面都有“{}”。 它表示方法本身,而具有方法本身的方法总是直接用于对象。 以及抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰

以及拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。

gddsb :定义抽象类

abstract class A{//抽象类public void fun ()//常规方法System.out.println (方法主体所在的方法) ); }public abstract void print (); //抽象方法,没有方法主体,用abstract关键字限定} 二、抽象类的使用

让我们先看看gddsb。

gddsb :直接实例化抽象类的对象

package com.wz.abstractdemo; abstract class A{//抽象类public void fun ()//常规方法System.out.println (方法主体所在的方法) ); }public abstract void print (); //抽象方法,没有方法主体,用abstract关键字限定(publicclasstestdemo ) publicstaticvoidmain (string [ ] args ) a=newa ); }运行:

exceptioninthread ' main ' Java.lang.error 3360 unresolvedcompilationproblem 3360 cannotinstantiatethetypeaatcom.wz.abstabstabled 某个类被实例化后,该对象可以调用或忽略类内的属性,但抽象类中存在抽象方法,抽象方法中没有方法体,没有方法体就不能调用。 既然不能进行方法调用,如何生成实例化的对象呢?

抽象类的使用原则如下。

)1)抽象方法必须是公共或受保护的,默认为公共。 如果为private,则不被子类继承,因为子类无法实现方法。

)2)抽象类不能直接实例化,需要依赖子类采用上转换方式处理

)3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类

)4)子类,)如果不是抽象类,就必须描述抽象类内的所有抽象方法(如果没有实现父类的抽象方法,子类也必须定义为abstract类。 );

gddsb :

package com.wz.abstractdemo; abstract class A{//抽象类public void fun ()//常规方法System.out.println (方法主体所在的方法) ); }public abstract void print (); //抽象方法,没有方法主体,有abstract关键字进行限定}//继承classbextendsa//b类的是抽象类的子类,是普通类@ override public void prodsa } public class test demo { publicstaticvoidmain (string [ ] args ) {A a=new B ); //上面写着a.print (转换//子类的超额方法) }执行结果:

hello世界! 现在可以清楚地看到:

(1)抽象类继承子类中有明确的方法间谍记述要求,而普通类可以选择性地决定是否需要间谍记述;

)2)抽象类实际上只是抽象方法比普通类多,其他构成要素与普通类完全相同

)3)一般类的对象可以直接实例化,但抽象类的对象可以在上传后得到。

一个类的子类可以继承任何一般类,但根据开发的实际要求,一般类应该继承抽象类而不是继承另一个一般类。

A是抽象的,无法直接进行实例化操作

)1)抽象类有构建方法吗?

因为抽象类中存在一些属性,所以抽象类中一定存在结构方法,其存在目的是属性的初始化。

此外,如果实例化了子类对象,则仍然满足先执行父类结构,然后执行子类结构的顺序。

gddsb如下所示。

package com.wz.abstractdemo; abstract class A{//抽象类public A () {定义{Syste

m.out.println("*****A类构造方法*****");}public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰}//单继承class B extends A{//B类是抽象类的子类,是一个普通类public B(){System.out.println("*****B类构造方法*****");}@Overridepublic void print() {//强制要求覆写System.out.println("Hello World !");}}public class TestDemo {public static void main(String[] args) {A a = new B();//向上转型}}

执行结果:

*****A类构造方法**********B类构造方法*****

(2)抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类;

(3)抽象类能否使用static声明?
先看一个关于外部抽象类的gddsb:

package com.wz.abstractdemo;static abstract class A{//定义一个抽象类public abstract void print();}class B extends A{public void print(){System.out.println("**********");}}public class TestDemo {public static void main(String[] args) {A a = new B();//向上转型a.print();}}

执行结果

Exception in thread "main" java.lang.Error: Unresolved compilation problem: Illegal modifier for the class A; only public, abstract & final are permittedat com.wz.abstractdemo.A.<init>(TestDemo.java:3)at com.wz.abstractdemo.B.<init>(TestDemo.java:9)at com.wz.abstractdemo.TestDemo.main(TestDemo.java:18)

再看一个关于内部抽象类:

package com.wz.abstractdemo;abstract class A{//定义一个抽象类static abstract class B{//static定义的内部类属于外部类public abstract void print();}}class C extends A.B{public void print(){System.out.println("**********");}}public class TestDemo {public static void main(String[] args) {A.B ab = new C();//向上转型ab.print();}}

执行结果:

**********

由此可见,外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。

(4)可以直接调用抽象类中用static声明的方法么?
任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。
gddsb如下:

package com.wz.abstractdemo;abstract class A{//定义一个抽象类public static void print(){System.out.println("Hello World !");}}public class TestDemo {public static void main(String[] args) {A.print();}}

运行结果:

Hello World !

(5)有时候由于抽象类中只需要一个特定的系统子类操作,所以可以忽略掉外部子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。
gddsb如下:

package com.wz.abstractdemo;abstract class A{//定义一个抽象类public abstract void print();private static class B extends A{//内部抽象类子类public void print(){//覆写抽象类的方法System.out.println("Hello World !");}}//这个方法不受实例化对象的控制public static A getInstance(){return new B();}}public class TestDemo {public static void main(String[] args) {//此时取得抽象类对象的时候完全不需要知道B类这个子类的存在A a = A.getInstance();a.print();}}

运行结果:

Hello World !

四、抽象类的应用——模板设计模式

例如,现在有三类事物:
(1)机器人:充电,工作;
(2)人:吃饭,工作,睡觉;
(3)猪:进食,睡觉。
现要求实现一个程序,可以实现三种不同事物的行为。

先定义一个抽象行为类:

package com.wz.abstractdemo;public abstract class Action{public static final int EAT = 1 ;public static final int SLEEP = 3 ;public static final int WORK = 5 ;public abstract void eat();public abstract void sleep();public abstract void work();public void commond(int flags){ switch(flags){case EAT:this.eat();break;case SLEEP:this.sleep();break;case WORK:this.work();break;case EAT + SLEEP:this.eat();this.sleep();break;case SLEEP + WORK:this.sleep();this.work();break;default:break;}}}

定义一个机器人的类:

package com.wz.abstractdemo;public class Robot extends Action{@Overridepublic void eat() {System.out.println("机器人充电");}@Overridepublic void sleep() {}@Overridepublic void work() {System.out.println("机器人工作");}}

定义一个人的类:

package com.wz.abstractdemo;public class Human extends Action{@Overridepublic void eat() {System.out.println("人吃饭");}@Overridepublic void sleep() {System.out.println("人睡觉");}@Overridepublic void work() {System.out.println("人工作");}}

定义一个猪的类:

package com.wz.abstractdemo;public class Pig extends Action{@Overridepublic void eat() {System.out.println("猪进食");}@Overridepublic void sleep() {System.out.println("猪睡觉");}@Overridepublic void work() {}}

测试主类:

package com.wz.abstractdemo;public class AbstractDemo {public static void main(String[] args) {fun(new Robot());fun(new Human());fun(new Pig());}public static void fun(Action act){act.commond(Action.EAT);act.commond(Action.SLEEP);act.commond(Action.WORK);}}

运行结果:

机器人充电机器人工作人吃饭人睡觉人工作猪进食猪睡觉

所有的子类如果要想正常的完成操作,必须按照指定的方法进行覆写才可以,而这个时候抽象类所起的功能就是一个类定义模板的功能。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。