• 09-03 Java 抽象类


    抽象类的特点

    /*
        抽象类的概述:
            动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
            我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
            
        抽象类的特点:
            A:抽象类和抽象方法必须用abstract关键字修饰
            B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
            C:抽象类不能实例化
                因为它不是具体的。
                抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
                用于子类访问父类数据的初始化
            D:抽象的子类
                a:如果不想重写抽象方法,该子类是一个抽象类。
                b:重写所有的抽象方法,这个时候子类是一个具体的类。
                
            抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
                Animal a = new Cat();
    */
    
    //abstract class Animal //抽象类的声明格式
    abstract class Animal {
        //抽象方法
        //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体,大括号
        public abstract void eat();
        
        public Animal(){}
    }
    
    //子类是抽象类
    abstract class Dog extends Animal {}
    
    //子类是具体类,重写抽象方法
    class Cat extends Animal {
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    
    class AbstractDemo {
        public static void main(String[] args) {
            //创建对象
            //Animal是抽象的; 无法实例化
            //Animal a = new Animal();
            //通过多态的方式
            Animal a = new Cat();
            a.eat();
        }
    }

    抽象类的成员特点:

    /*
        抽象类的成员特点:
            成员变量:既可以是变量,也可以是常量。
            构造方法:有。
                        用于子类访问父类数据的初始化。
            成员方法:既可以是抽象的,也可以是非抽象的。
            
        抽象类的成员方法特性:
            A:抽象方法 强制要求子类做的事情。
            B:非抽象方法 子类继承的事情,提高代码复用性。
    */
    abstract class Animal {
        public int num = 10;
        public final int num2 = 20;
    
        public Animal() {}
        
        public Animal(String name,int age){}
        
        public abstract void show();
        
        public void method() {
            System.out.println("method");
        }
    }
    
    class Dog extends Animal {
        public void show() {
            System.out.println("show Dog");
        }
    }
    
    class AbstractDemo2 {
        public static void main(String[] args) {
            //创建对象
            Animal a = new Dog();
            a.num = 100;
            System.out.println(a.num);
            //a.num2 = 200;
            System.out.println(a.num2);
            System.out.println("--------------");
            a.show();
            a.method();
        }
    }

    抽象类案例

    /*
        猫狗案例
            具体事物:猫,狗
            共性:姓名,年龄,吃饭
    
        分析:从具体到抽象
            猫:
                成员变量:姓名,年龄
                构造方法:无参,带参
                成员方法:吃饭(猫吃鱼)
                
            狗:
                成员变量:姓名,年龄
                构造方法:无参,带参
                成员方法:吃饭(狗吃肉)
                
            因为有共性的内容,所以就提取了一个父类。动物。
            但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
            而方法是抽象的类,类就必须定义为抽象类。
            
            抽象动物类:
                成员变量:姓名,年龄
                构造方法:无参,带参
                成员方法:吃饭();
        
        实现:从抽象到具体
            动物类:
                成员变量:姓名,年龄
                构造方法:无参,带参
                成员方法:吃饭();
                
            狗类:
                继承自动物类
                重写吃饭();
                
            猫类:
                继承自动物类
                重写吃饭();
    */
    //定义抽象的动物类
    abstract class Animal {
        //姓名
        private String name;
        //年龄
        private int age;
        
        public Animal() {}
        
        public Animal(String name,int age) {
            this.name = name;
            this.age = age;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
        
        public int getAge() {
            return age;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        
        //定义一个抽象方法
        public abstract void eat();
    }
    
    //定义具体的狗类
    class Dog extends Animal {
        public Dog() {}
        
        public Dog(String name,int age) {
            super(name,age);
        }
        
        public void eat() {
            System.out.println("狗吃肉");
        }
    }
    
    //定义具体的猫类
    class Cat extends Animal {
        public Cat() {}
        
        public Cat(String name,int age) {
            super(name,age);
        }
        
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    
    //测试类
    class AbstractTest {
        public static void main(String[] args) {
            //测试狗类
            //具体类用法
            //方式1:
            Dog d = new Dog();
            d.setName("旺财");
            d.setAge(3);
            System.out.println(d.getName()+"---"+d.getAge());
            d.eat();
            //方式2:
            Dog d2 = new Dog("旺财",3);
            System.out.println(d2.getName()+"---"+d2.getAge());
            d2.eat();
            System.out.println("---------------------------");
            
            //多态方法 测试
            Animal a = new Dog();
            a.setName("旺财");
            a.setAge(3);
            System.out.println(a.getName()+"---"+a.getAge());
            a.eat();
            
            Animal a2 = new Dog("旺财",3);
            System.out.println(a2.getName()+"---"+a2.getAge());
            a2.eat();
            
            //练习:测试猫类
        }
    }

    抽象类案例

    /*
        假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
        经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
        请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
        
        分析:
            普通员工类
                成员变量:姓名、工号以及工资。
                成员方法:工作
            经理类:
                成员变量:姓名、工号以及工资,奖金属性
                成员方法:工作
                
        实现:
            员工类:
            普通员工类:
            经理类:
    */
    //定义员工类
    abstract class Employee {
        //姓名、工号以及工资
        private String name;
        private String id;
        private int salary;
        
        public Employee() {}
        
        public Employee(String name,String id,int salary) {
            this.name = name;
            this.id = id;
            this.salary = salary;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
        
        public String getId() {
            return id;
        }
        
        public void setId(String id) {
            this.id = id;
        }
        
        public int getSalary() {
            return salary;
        }
        
        public void setSalary(int salary) {
            this.salary = salary;
        }
        
        //工作
        public abstract void work();
    }
    
    //普通员工类
    class Programmer extends Employee {
        public Programmer(){}
        
        public Programmer(String name,String id,int salary) {
            super(name,id,salary);
        }
        
        public void work() {
            System.out.println("按照需求写代码");
        }
    }
    
    //经理类
    class Manager extends Employee {
        //奖金
        private int money; //bonus 奖金
    
        public Manager(){}
        
        public Manager(String name,String id,int salary,int money) {
            super(name,id,salary);
            this.money = money;
        }
        
        public void work() {
            System.out.println("跟客户谈需求");
        }
        
        public int getMoney() {
            return money;
        }
        
        public void setMoney(int money) {
            this.money = money;
        }
    }
    
    class AbstractTest4 {
        public static void main(String[] args) {
            //测试普通员工
            Employee emp = new Programmer();
            emp.setName("林青霞");
            emp.setId("czbk001");
            emp.setSalary(18000);
            System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
            emp.work();
            System.out.println("-------------");
            emp = new Programmer("林青霞","czbk001",18000);
            System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
            emp.work();
            System.out.println("-------------");
            
            /*
            emp = new Manager();
            emp.setName("刘意");
            emp.setId("czbk002");
            emp.setSalary(8000);
            emp.setMoney(2000);
            */
            //由于子类有特有的内容,所以我们用子类来测试
            Manager m = new Manager();
            m.setName("刘意");
            m.setId("czbk002");
            m.setSalary(8000);
            m.setMoney(2000);
            System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
            m.work();
            System.out.println("-------------");
            
            //通过构造方法赋值
            m = new Manager("刘意","czbk002",8000,2000);
            System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
            m.work();
        }
    }

    抽象类的几个小问题:

    /*
    一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
        A:可以。
        B:不让创建对象。要访问它,只能通过子类。
    
    abstract不能和哪些关键字共存?
        private    冲突
        final    冲突    
        static    无意义
    */
    abstract class Fu {
        //public abstract void show();
        
        //非法的修饰符组合: abstract和private
        //因为私有不能被继承,而抽象又要求用继承
        //private abstract void show();
        
        //非法的修饰符组合
        //因为最终的不能读写,而抽象又要求用继承
        //final abstract void show();    
        
        //非法的修饰符组合
        //因为static方法,可以通过类名调用;而abstract定义的方法,又没有方法体;所以无意义
        static abstract void show();
        
        public static void method() {
            System.out.println("method");
        }
    }
    
    class Zi extends Fu {
        public void show() {}
    }
    
    class AbstractDemo3 {
        public static void main(String[] args) {
            Fu.method();
        }
    }
  • 相关阅读:
    如何自定义长连接策略
    知物由学 | 这些企业大佬如何看待2018年的安全形势?
    网易云易盾朱星星:最容易被驳回的10大APP过检项
    网易云易盾朱浩齐:视听行业步入强监管和智能时代
    知物由学 | 人工智能、机器学习和深度学习如何在网络安全领域中应用?
    知物由学 | 广告欺诈:如何应对数字广告里分羹者?
    知物由学 | 如何应对日益强大的零日攻击
    不再任人欺负!手游安全的进阶之路
    邪恶的三位一体:机器学习、黑暗网络和网络犯罪
    PAT 1053. Path of Equal Weight
  • 原文地址:https://www.cnblogs.com/baiyangyuanzi/p/6825148.html
Copyright © 2020-2023  润新知