Java抽象类 详解

Java抽象类 详解一 抽象类的基本概念普通类是一个完善的功能类 可以直接产生实例化对象 并且在普通类中可以包含有构造方法 普通方法 static 方法 常量和变量等内容 而抽象类是指在普通类的结构里面增加抽象方法的组成部分 那么什么叫抽象方法呢 在所有的普通方法上面都会有一个 这个表示方法体 有方法体的方法一定可以被对象直接使用 而抽象方法 是指没有方法体的方法 同时抽象方法还必须使用关键字 abstract 做修

一、抽象类的基本概念

普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰

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

范例:定义一个抽象类

abstract class A{//定义一个抽象类 public void fun(){//普通方法 System.out.println("存在方法体的方法"); } public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰 } 

二、抽象类的使用

package com.wz.abstractdemo; abstract class A{//定义一个抽象类 public void fun(){//普通方法 System.out.println("存在方法体的方法"); } public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰 } public class TestDemo { public static void main(String[] args) { A a = new A(); } } 

运行:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: Cannot instantiate the type A at com.wz.abstractdemo.TestDemo.main(TestDemo.java:15) 

从上可知,A是抽象的,无法直接进行实例化操作。为什么不能直接实例化呢?当一个类实例化之后,就意味着这个对象可以调用类中的属性或者放过了,但在抽象类里存在抽象方法,而抽象方法没有方法体,没有方法体就无法进行调用。既然无法进行方法调用的话,又怎么去产生实例化对象呢。

范例:

package com.wz.abstractdemo; abstract class A{//定义一个抽象类 public void fun(){//普通方法 System.out.println("存在方法体的方法"); } public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰 } //单继承 class B extends A{//B类是抽象类的子类,是一个普通类 @Override public void print() {//强制要求覆写 System.out.println("Hello World !"); } } public class TestDemo { public static void main(String[] args) { A a = new B();//向上转型 a.print();//被子类所覆写的过的方法 } } 

运行结果:

Hello World ! 

虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。

三、抽象类的使用限制

范例如下:

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

执行结果:

*A类构造方法* *B类构造方法* 
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 permitted at com.wz.abstractdemo.A. 
  
    (TestDemo.java:3) at com.wz.abstractdemo.B. 
   
     (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声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。

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 ! 
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 ! 

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

先定义一个抽象行为类:

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{ @Override public void eat() { System.out.println("机器人充电"); } @Override public void sleep() { } @Override public void work() { System.out.println("机器人工作"); } } 

定义一个人的类:

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

定义一个猪的类:

package com.wz.abstractdemo; public class Pig extends Action{ @Override public void eat() { System.out.println("猪进食"); } @Override public void sleep() { System.out.println("猪睡觉"); } @Override public 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); } } 

运行结果:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217215.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午10:05
下一篇 2026年3月18日 上午10:05


相关推荐

  • pscp 传输文件

    pscp 传输文件在执行的时候要打开 putty 并连接服务器 否则可能报错的 上传文件到 Linux 服务器 pscp exefileroot 192 168 32 50 root 将 Linux 服务器上的文件夹以及文件下载到本地 pscp rroot 182 254 247 191 usr lib locale c locale 命令的使用方法 PuTTY 安

    2026年3月16日
    2
  • 开源智能体框架(Agent Zero)

    开源智能体框架(Agent Zero)

    2026年3月16日
    3
  • iframe的contentWindow属性

    iframe的contentWindow属性最近在给项目搭建功能的过程中遇到了个难题 因为在设计该项目时给的 iframe 子页面非常多 从头到尾数下来的话起码得有十多个子页面 但子页面多也并不是件好事几乎每个子页面都需要用到父页面的中的方法 打开存放在父页面中与该业务相关的模态框 遮罩层 或是让父页面刷新 这都需要通过 js 中的 parent 属性去实现 反过来说 父页面也始终会用到子页面中定义好的方法 而我现在碰上的难题便是如此 比如在父中需要点击左侧菜单 触发子 iframe 中的某个事件 这个解决办法我在以前 admin 的 maya 代码中使用父中点击触

    2026年3月26日
    2
  • 全球首款原生集成“龙虾”手机!努比亚宣布Z80 Ultra开启内测招募

    全球首款原生集成“龙虾”手机!努比亚宣布Z80 Ultra开启内测招募

    2026年3月16日
    2
  • qlineedit_qt layoutstretch

    qlineedit_qt layoutstretch简述QLineEdit是一个单行文本输入框。QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做、剪切和粘贴、以及拖放(见setDragEnabled())。通过改变输入框的echoMode(),同时也可以设置为一个“只写”字段,用于输入密码等。文本的长度可以被限制为maxLength(),可以使用一个validator()或inputMask()来任意限制文本

    2022年10月6日
    4
  • sublime text3 激活码 2021(最新序列号破解)

    sublime text3 激活码 2021(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    236

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号