• java中的抽象类


    package com.aaa.zxf.ajax.test;
    
    /**
    
      一、java中的 抽象
    
     Animal这个类 存在的意义是什么?
        (动物园真的有一个动物叫Animal吗?没有 但是你为了某种操作创建了Animal 那么此时程序就有一个bug
    
    
     分析:
         1  Animal这个来存来仅仅是用来产生多态,但是为了多态而导致能创建Animal对象这显然是不合理的,
                所以我们希望:Animal这个类得存在,但是不能通过new 创建对象
         2  Animal的eat有用,在编译的时候 如果Animal没有eat函数 编译不会通过,但是我们运行的时候 是调用的真实类型的eat()所以Animal的eat不会被调用。
                Animal的eat方法得有 但是方法体没什么用。
                所以我们希望:Animal中的eat函数 只声明 不写实现(因为没必要写)。
         3  Animal的子类必须要有各自的eat函数,但是我们做的练习 eat可以不写,此时会去调用父类的eat函数。所以我们希望:子类必须实现eat()函数
    
        解决方案:将Animal这个类变成抽象类
    
    
     二、声明一个抽象类
    
     三、java中抽象类中构造函数使用
          1.   构造函数是对象的基本,没有构造函数就没有对象。
    
          2.   父类抽象类中写了有参数的构造函数,子类继承是就必须写一个构造函数来调用父类的构造函数
    
     四、匿名内部类
    
     */
    public class JavaDuoTai {
        public static void main(String[] args) {
            // 继承多态
            Animal02 h = new Hourse();
            // h 代表了两个对象。
                    h.sleep();      // 调用父类抽象类中的普通方法  sleep
                    h.eat();        // 调用子类中的方法 eat。
    
            Hourse hourse = new Hourse("张三", 45);
            System.out.println("  name="+hourse.name +"     age="+ hourse.age);
    
    
    
            /**
             *  抽象类无法通过new 来创建对象。 因为是抽象的。
             *  我是匿名内部类 实现它的抽象方法。
             * 这种写法
             */
            Animal02 animal02 = new Animal02() {
                @Override
                public void eat() {
                    System.out.println("我是匿名内部类");
                    //多一个T$1.class,这个class就是匿名内部类的原型,
                    // 所以new针对的还是普通的class(虽然内部类和普通类有很大不一样),只不过这个class的写法稍有不同,它是编译器帮我们从匿名内部类中提取的。
                    System.out.println("获得class的对象"+this.getClass());
                }
            };
    
            //执行 匿名内部类
            animal02.eat();
    
        }
    
    }
    class Animal01{
        public int id;
        public String name;
        private  int age;
    
        void run(){
            System.out.println("动物要吃饭");
        }
    }
    
    class  Dog01 extends  Animal01{
        public  String food;
    
        @Override
        void run(){
            System.out.println("狗吃骨头");
        }
    
    }
    
    class Cat01 extends Animal01{
        public String color;
    
        @Override
        void run(){
            System.out.println("猫吃鱼");
        }
    }
    
    
    /**
     * 二、 声明一个抽象类
     *
     *   1.   关键字  abstract  用来修饰类 和 方法。
     *
     *
     *   2.   抽象类的特征?
                 * A  抽象方法不需要写方法体
                 * B  抽象方法必须在抽象类中
                 *      The type Animal must be an abstract class to define abstract methods
                 * C  抽象类中不一定要有抽象方法 (抽象类可以有抽象方法 普通方法 成员方法)
                 * D  子类继承了一个抽象父类并且父类中有抽象方法 那么子类必须去重写抽象方法----》抽象方法由子类负责实现
                 * E  抽象类不能通过new创建对象 但是 有构造函数 (
                 *    这个构造函数是用来让子类调用的
     *
     */
    
    // 定义一个抽象类。
    abstract class Animal02{
    
    
        public  String name;
        public  int age;
    
        public Animal02() {
        }
    
        //有参数的构造函数      这个构造函数是用来让子类调用的
        public Animal02(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public  abstract void eat(); //1.抽象方法不需要写方法体    2.抽象方法必须在抽象类中
    
        //抽象类中不一定要有抽象方法     普通方法
        public  void  sleep(){
            System.out.println("睡觉!");
        }
    
    }
    
    
    //子类 继承抽象类 需要重写父类的方法
    class Hourse extends  Animal02{
    
        public Hourse() {
        }
    
        // 让子类调用父类的 构造函数  关键字 super
        public Hourse(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void eat() {
            System.out.println("马飞飞。");
        }
    }
  • 相关阅读:
    tcp笔记
    sublime使用技巧
    mysql笔记
    ubuntu安装mysql
    正则表达式笔记
    网络编程笔记
    swoole安装异步reids
    mysql的时间存储格式
    nginx环境的搭建
    php的闭包函数use的使用
  • 原文地址:https://www.cnblogs.com/ZXF6/p/11535574.html
Copyright © 2020-2023  润新知