• Java的抽象类与抽象方法(abstract class and abstract method)


    为什么需要抽像Abstract

    • 当多个类出现相同的功能,而只是功能的主体不同时,可以向上抽象。
    • 所谓抽象就是,只抽取功能的定义,而不抽取功能的主体
    • 抽象Abstract,简单理解就是:看不懂。

    抽样类的特点:

    • 抽象方法一定定义在抽象类中,但抽象类中的方法不必全是抽象的,也可以有非抽象的方法。
    • 只要类中有一个方法是抽象的,这个类就是抽象的。
    • 抽象方法和抽象类必须用abstract关键字修饰。
    • 抽象类不可以new一个对象,因为抽象类中的方法没有方法体,new一个对象无实际意义。
    • 抽象类中定义的方法要被使用,就要由子类去继承这个抽象类,并且子类要重写抽象类中的所有抽象方法。
    • 如果子类只是重写了父类的部分抽象方法,那么这个子类仍然时抽象的。

    为什么需要抽象的示例:

    class Cat {
    
        void yell() {
            System.out.println("Cat: meow meow meow...");
        }
    }
    
    class Dog {
    
        void yell() {
            System.out.println("Dog: woof woof woof...");
        }
    }

    上面两个类,小猫和小狗都有发出叫声的功能,为了能够抽象出阿猫阿狗的叫声,我们写了另一个Pet类

    class Pet {
    
        void yell() {
            System.out.println("pet yell...");
        }
    }

    但这个类里面的方法还不够抽象,因为它的yell()方法时具体的。这时我把它的方法体去掉。

    class Pet {
    
        void yell() {
        }
    }

    一个方法后面可以跟大括号,里面什么也不写,方法也可以以分号结尾。进一步抽象这个方法,去掉大括号,加上分号。

    class Pet {
    //当一个方法没有大括号包围起来的方法提示,我们就应该在方法的前面加上abstract这个关键字,来申明这个方法时一个抽象方法。
    //实际,idea等ide这时会报错提示我们,要么给出方法体,要么什么它是abstract的。
    void yell(); }

    根据idea提示,给yell()的方法加上abstract关键字时,idea会自动给Pet类也加上abstract关键字。

    这就是我们前面提到的:抽象方法存在与抽象类中;如果一个类中有抽象方法,这个类也必须是抽象的。

    abstract class Pet {
        abstract void yell();
    }

    抽象类不可以new一个对象。下面我们试图在Demo类中new一个Pet类的对象,因为Pet是一个抽象类,intelliJ idea就会报错提示我们不可以这样做。

    public class Demo {
    
      Pet p=new Pet();
    
    }

    完整的例子:

    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void test() {
            Cat c = new Cat();
            Dog d = new Dog();
            c.yell();//子类调用子类自己已经实现的yell()方法
            d.yell();
        }
    }
    
    abstract class Pet {
    
        public abstract void yell();
    }
    
    class Dog extends Pet {
    
        public void yell() {
            System.out.println("Dog: woof woof woof...");
        }
    }
    
    class Cat extends Pet {
    
        public void yell() {
            System.out.println("Cat: meow meow meow...");
        }
    }

    运行结果

    Cat: meow meow meow...
    Dog: woof woof woof...

    后记:

    2020年3月1日 星期日 上海 阴有间断小雨 气温:10° 比较冷

  • 相关阅读:
    bzoj5328: [Sdoi2018]物理实验
    HDU
    bzoj4820: [Sdoi2017]硬币游戏
    bzoj4600: [Sdoi2016]硬币游戏
    阿里云配置防火墙规则
    博客园 添加 Live 2D 模型
    R语言做逻辑回归
    R语言错误的提示(中英文翻译)
    用随机森林分类
    python 切换虚拟环境
  • 原文地址:https://www.cnblogs.com/majestyking/p/12389783.html
Copyright © 2020-2023  润新知