• Java自学-接口与继承 抽象类


    Java 抽象类

    在类中声明一个方法,这个方法没有实现体,是一个“空”方法

    这样的方法就叫抽象方法,使用修饰符“abstract"

    当一个类有抽象方法的时候,该类必须被声明为抽象类

    步骤 1 : 抽象类

    为Hero增加一个抽象方法 attack,并且把Hero声明为abstract的。
    APHero,ADHero,ADAPHero是Hero的子类,继承了Hero的属性和方法。
    但是各自的攻击手段是不一样的,所以继承Hero类后,这些子类就必须提供不一样的attack方法实现。

    package charactor;
     
    public abstract class Hero {
        String name;
     
        float hp;
     
        float armor;
     
        int moveSpeed;
     
        public static void main(String[] args) {
     
        }
     
        // 抽象方法attack
        // Hero的子类会被要求实现attack方法
        public abstract void attack();
     
    }
    
    package charactor;
     
    public class ADHero extends Hero implements AD {
     
        public void physicAttack() {
            System.out.println("进行物理攻击");
        }
     
        @Override
        public void attack() {
            physicAttack();
        }
     
    }
    package charactor;
     
    public class APHero extends Hero implements AP {
     
        @Override
        public void magicAttack() {
            System.out.println("进行魔法攻击");
        }
     
        @Override
        public void attack() {
            magicAttack();
        }
     
    }
    package charactor;
     
    public class ADAPHero extends Hero implements AD, AP {
     
        @Override
        public void attack() {
     
            System.out.println("既然可以进行物理攻击,也可以进行魔法攻击");
        }
     
        public void magicAttack() {
            System.out.println("进行魔法攻击");
        }
     
        public void physicAttack() {
            System.out.println("进行物理攻击");
        }
     
    }
    

    步骤 2 : 抽象类可以没有抽象方法

    Hero类可以在不提供抽象方法的前提下,声明为抽象类
    一旦一个类被声明为抽象类,就不能够被直接实例化

    package charactor;
       
    public abstract class Hero {
        String name;
              
        float hp;
              
        float armor;
              
        int moveSpeed;
           
        public static void main(String[] args) {
            //虽然没有抽象方法,但是一旦被声明为了抽象类,就不能够直接被实例化
            Hero h= new Hero();
        }
              
    }
    

    步骤 3 : 抽象类和接口的区别

    区别1:
    子类只能继承一个抽象类,不能继承多个
    子类可以实现多个接口

    区别2:
    抽象类可以定义
    public,protected,package,private
    静态和非静态属性
    final和非final属性
    但是接口中声明的属性,只能是
    public
    静态
    final的
    即便没有显式的声明

    : 抽象类和接口都可以有实体方法。 接口中的实体方法,叫做默认方法

    package charactor;
      
    public interface AP {
      
        public static final int resistPhysic = 100;
         
        //resistMagic即便没有显式的声明为 public static final
        //但依然默认为public static final
        int resistMagic = 0;
         
        public void magicAttack();
    }
    

    练习抽象类

    有的物品使用之后就消失了,比如血瓶

    有的物品使用了之后还会继续存在,比如武器

    为Item类设计一个抽象方法

    public abstract boolean disposable()
    

    不同的子类,实现disposable后,会返回不同的值。
    比如LifePotion就会返回true,因为是会消失了。
    而Weapon,Armor 就会返回false,因为是不会消失了

  • 相关阅读:
    重新温习软件设计之路(4)
    重新温习软件设计之路(3)
    技术判断力
    GIS基本函数类库Delphi代码
    C#文本转语音并保存wav和MP3文件
    多网卡多网关浏览器访问外网
    自信与乐观
    System.Security.SecurityException when writing to Event Log
    4010 An unhandled security exception has occurred. IIS 8.5
    How to make a grid (like graph paper grid) with just css?
  • 原文地址:https://www.cnblogs.com/jeddzd/p/11566068.html
Copyright © 2020-2023  润新知