• 面向对象-抽象类实战案例


                 面向对象-抽象类实战案例

                                 作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

     

     

     

    一.抽象类概述

    1>.抽象定义

      抽象就是从多个事物中将共性的,本质的内容抽取出来。例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

    2>.抽象类

      Java中可以定义没有函数体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

    3>.抽象方法的由来

      多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体。那么只有功能生命,没有功能主体的方法称为抽象方法。
    
      例如,狼和狗都有吼叫的方法,可以吼叫内容是不一样的,所以首相出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

    4>.抽象类的特点

      抽象类和抽象方法必须用abstract关键字来修饰;
    
      抽象方法只有方法声明,没有方法体,定义在抽象类中,语法格式如下:
        修饰符 abstract 返回值类型 函数名(参数列表);   抽象类不可用被实例化,也就是不可用用new创建对象,原因如下:
        抽象类是具体事物抽取出来的,本身是不具备的,没有对应的实例,例如:犬科是一个抽象的概念,真正存在的是狗和狼。
        而且抽象类即使创建了对象,调用抽象方法也没有任何意义,因为抽象方法的抽象方法函数体为空。

      抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。

    5>.定义抽象类案例

    package cn.org.yinzhengjie.abstraPackage;
    
    /**
     *      
     * @author 尹正杰
     *
     */
    public abstract class Animal {
        /*
         *     没有函数体的方法需要用abstract关键字来修饰,这个方法就被称为抽象方法;
         *     
         *     当类中出现了抽象方法后,该类也必须使用abstract关键字修饰
         */
        abstract void sayHello();
    }
    Animal.java
    package cn.org.yinzhengjie.abstraPackage;
    
    /**
     *     
     * @author 尹正杰
     *
     */
    public class Dog extends Animal{
    
        /*
         *     定义狗叫的方法
         */
        void sayHello() {
            System.out.println("汪~汪~汪汪汪...");
        }
    }
    Dog.java
    package cn.org.yinzhengjie.abstraPackage;
    
    /**
     *     
     * @author 尹正杰
     *
     */
    public class Cat extends Animal{
    
        /*
         *     定义猫叫的方法
         */
        void sayHello() {
            System.out.println("喵~喵~喵...");
        }
    }
    Cat.java
    package cn.org.yinzhengjie.abstraPackage;
    
    public class Demo {
    
        public static void main(String[] args) {
            
            //抽象类通过其子类实例化
            Cat cat = new Cat();
            Dog dog = new Dog();
            
            cat.sayHello();
            
            dog.sayHello();
            
        }
    }
    Demo.java

    二.抽象类案例分析

    员工案例:
        具体事物:
            运维工程师,运维项目经理(有奖金(bonus))
        共性:
            姓名(name),工号(id),工资(salary),工作(work)。
    package cn.org.yinzhengjie.staff;
    
    /**
     *     定义员工类
     * @author 尹正杰
     *
     */
    public abstract class Employee {
        /*
         *     定义姓名
         */
        private String name;
        
        /*
         *     定义员工工号
         */
        private String id;
        
        /*
         *     定义工资
         */
        private double salary;
        
        Employee(String name,String id,double salary) {
            this.name = name;
            this.id = id;
            this.salary = salary;
        }
        
        public abstract void work();
    }
    Employee.java
    package cn.org.yinzhengjie.staff;
    
    /**
     *     定义运维项目经理
     * @author 尹正杰
     *
     */
    public class OperationManager extends Employee {
    
        /*
         * 定义奖金
         */
        private double bonus;
        
        OperationManager(String name, String id, double salary,double bonus) {
            super(name, id, salary);
            this.bonus = bonus;
        }
    
        @Override
        public void work() {
            System.out.println("运维项目经理正在分配工作...");
        }
    
    }
    OperationManager.java
    package cn.org.yinzhengjie.staff;
    
    /**
     *     定义运维工程师
     * @author 尹正杰
     *
     */
    public class operation extends Employee{
    
        
        operation(String name, String id, double salary) {
            super(name, id, salary);
        }
    
        @Override
        public void work() {
            System.out.println("运维人员正在协助开发解决问题并进行集群调优...");
        }
        
    }
    operation.java

    三.抽象类的细节问题

    1>.抽象类中是否有构造函数?

      参考答案:
        抽象类中是有构造函数的,虽然抽象类本身不可用实例化,但是继承抽象类的子类是可以实例化的。换句话说,只要是class定义的类,里面肯定有构造函数,只不过抽象类的构造函数是用于给予子类提供实例化的。
        其实抽象类和一般类没什么区别,该怎么描述就怎么描述,只不过有些功能在该类中无法确定内容,所以比普通类多了抽象方法。

    2>.抽象类中是否可以不定义抽象方法?

      参考答案:
        这个是可以的,没有抽象方法的抽象类存在的意义就是不想让该类被实例化。换句话说,没有抽象方法的抽象类存在的意义是不让该类创建对象,因为创建对象是没有意义的。

    3>.抽象关键字(abstract)和哪些关键字不可用共存?

      参考答案:
        final:
          如果方法被抽象,就需要被覆盖,但是final是不可以被覆盖,所以冲突。

        private:
          如果函数被私有化了,子类无法直接访问,怎么覆盖呢?这个时候就会提示非法的修饰符组合。

        static:
          不需要对象就可以通过类名 直接调用抽象方法,但是在这里调用抽象方法是没有意义的,这个时候会提示非法的修饰符组合。

     

  • 相关阅读:
    (双指针 二分) leetcode 167. Two Sum II
    (双指针) leetcode 485. Max Consecutive Ones
    (双指针) leetcode 27. Remove Element
    (String) leetcode 67. Add Binary
    (数组) leetcode 66. Plus One
    (N叉树 BFS) leetcode429. N-ary Tree Level Order Traversal
    (N叉树 递归) leetcode 590. N-ary Tree Postorder Traversal
    (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
    (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
    (BST 递归) leetcode98. Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12235234.html
Copyright © 2020-2023  润新知