• Java抽象类


    1.抽象类

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

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

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

    2.语法格式

    1. 【修饰符】abstract class 类名{
    2. }

    3.抽象类使用注意 

    1.抽象类无法实例化,抽象类是专门给子类继承的

    1. public abstract class A {
    2. public A(){
    3. }
    4. }
    5. class text{
    6. public static void main(String[] args) {
    7. new A();//Error:(5, 9) java: 集成开发.抽象类.A是抽象的; 无法实例化
    8. }
    9. }

    2.final与abstract无法联合使用

    原因:final修饰的类与方法不能被继承和修改,但是抽象类是专门给子类继承的,抽象方法还必须实例化

    1. public final abstract class A {//Error:(3, 23) java: 非法的修饰符组合: abstract和final
    2. public A(){
    3. }
    4. }

    3.抽象类虽然无法被实例化,但是抽象类有构造方法,因为抽象类有自己的一些属性。这个构造方法是给子类使用的

    1. public abstract class A {
    2. String name;
    3. public A(){
    4. }
    5. }
    6. class B extends A{
    7. private String name;
    8. public B(String name){
    9. super();
    10. this.name=name;
    11. }
    12. }
    13. class text{
    14. public static void main(String[] args) {
    15. B b=new B("张三丰");
    16. }
    17. }

    4.如果子类无法实例化父类全部的抽象方法,则该子类只能定义为一个抽象父类的抽象子类

    原因:子类继承抽象父类,那么势必将父类的抽象方法继承过来,但是抽象方法只能在抽象类中,此时要么把子类定义为抽象类,要么将继承过来的抽象方法全部实例化

    1. public abstract class A {
    2. public abstract void some();
    3. public abstract int move();
    4. }
    5. class B extends A{//Error:(7, 1) java: 集成开发.抽象类.B不是抽象的, 并且未覆盖集成开发.抽象类.A中的抽象方法move()
    6. public void some(){
    7. }
    8. //move方法没有声明
    9. public static void main(String[] args) {
    10. }
    11. }

    5.抽象类中可以没有抽象方法,但是抽象方法必须在抽象类中

    1. public abstract class A {
    2. public int move(){
    3. return 123;
    4. }
    5. }
    6. class B{//B含有抽象方法,但是B不是一个抽象类
    7. public abstract void some();
    8. public static void main(String[] args) {
    9. }
    10. }

    4.抽象类实例

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

    先定义一个抽象行为类:

    1. package com.wz.abstractdemo;
    2. public abstract class Action{
    3. public static final int EAT = 1 ;
    4. public static final int SLEEP = 3 ;
    5. public static final int WORK = 5 ;
    6. public abstract void eat();
    7. public abstract void sleep();
    8. public abstract void work();
    9. public void commond(int flags){
    10. switch(flags){
    11. case EAT:
    12. this.eat();
    13. break;
    14. case SLEEP:
    15. this.sleep();
    16. break;
    17. case WORK:
    18. this.work();
    19. break;
    20. case EAT + SLEEP:
    21. this.eat();
    22. this.sleep();
    23. break;
    24. case SLEEP + WORK:
    25. this.sleep();
    26. this.work();
    27. break;
    28. default:
    29. break;
    30. }
    31. }
    32. }

    定义一个机器人的类:

    1. package com.wz.abstractdemo;
    2. public class Robot extends Action{
    3. @Override
    4. public void eat() {
    5. System.out.println("机器人充电");
    6. }
    7. @Override
    8. public void sleep() {
    9. }
    10. @Override
    11. public void work() {
    12. System.out.println("机器人工作");
    13. }
    14. }

    定义一个人的类:

    1. package com.wz.abstractdemo;
    2. public class Human extends Action{
    3. @Override
    4. public void eat() {
    5. System.out.println("人吃饭");
    6. }
    7. @Override
    8. public void sleep() {
    9. System.out.println("人睡觉");
    10. }
    11. @Override
    12. public void work() {
    13. System.out.println("人工作");
    14. }
    15. }

    定义一个猪的类:

    1. package com.wz.abstractdemo;
    2. public class Pig extends Action{
    3. @Override
    4. public void eat() {
    5. System.out.println("猪进食");
    6. }
    7. @Override
    8. public void sleep() {
    9. System.out.println("猪睡觉");
    10. }
    11. @Override
    12. public void work() {
    13. }
    14. }

    测试类:

    1. package com.wz.abstractdemo;
    2. public class AbstractDemo {
    3. public static void main(String[] args) {
    4. fun(new Robot());
    5. fun(new Human());
    6. fun(new Pig());
    7. }
    8. public static void fun(Action act){
    9. act.commond(Action.EAT);
    10. act.commond(Action.SLEEP);
    11. act.commond(Action.WORK);
    12. }
    13. }
    14. //运行结果:
    15. //机器人充电
    16. //机器人工作
    17. //人吃饭
    18. //人睡觉
    19. //人工作
    20. //猪进食
    21. //猪睡觉

    与我们之前采用多态设计的主人给宠物投食一样,只是使用抽象类更简单明了,我将改进的代码一律放在下面,对比前面讲继承时代码学习

    需求:主人给不同的宠物投食,不同的宠物吃的食物不同

    1. public class Text {
    2. public static void main(String[] args) {
    3. //创建主人对象
    4. zhuRen ren=new zhuRen();
    5. //创建小狗、小猫对象,然后向上转型成Pet类型
    6. dog dg=new dog();
    7. Pet dog=dg;
    8. Cat ct=new Cat();
    9. Pet cat=ct;
    10. //然后主人投食
    11. ren.feed(dog);//小狗正在啃骨头
    12. ren.feed(cat);//小猫正在吃鱼
    13. }
    14. }
    15. class zhuRen{
    16. public void feed(Pet pet){
    17. pet.eat();
    18. }
    19. }
    20. abstract class Pet{
    21. public abstract void eat();
    22. }
    23. class dog extends Pet{
    24. public void eat(){
    25. System.out.println("小狗正在啃骨头");
    26. }
    27. }
    28. class Cat extends Pet{
    29. public void eat(){
    30. System.out.println("小猫正在吃鱼");
    31. }
    32. }

  • 相关阅读:
    GLTF模型添加关节控制
    allegro中shape的一些基本操作(三)——挖空铜皮(shape)、删除孤岛
    Metasploit Framework
    C语言-变量与数据类型
    IFD-x 微型红外成像仪(模块)的温度测量和成像精度
    java计算机毕业设计停车场管理系统源程序+mysql+系统+lw文档+远程调试
    java计算机毕业设计校园外卖零食商城系统源码+数据库+系统+lw文档+部署
    签约掘金了!
    cf1693C. Keshi in Search of AmShZ(div1)【最短路,反向建图】
    upp(统一流程平台),一份迟来的可行性研究报告
  • 原文地址:https://blog.csdn.net/m0_71673753/article/details/128103621