面向对象下——抽象类

面向对象下——抽象类,第1张

面向对象下——抽象类 抽象类

类中的某些方法需要声明,但又不确定该如何实现时可以将其声明为抽象方法,而声明了抽象方法的类就是抽象类

即抽象方法是指没有实现的方法(没有方法体),当一个类中存在抽象方法时需要将该类声明为抽象类,而抽象方法的具体实现是由子类来完成

public abstract class Animal{
    String name;
    int age;
    abstract public void cry();  //抽象方法的具体实现由子类重写来完成
}
语法 抽象类
访问修饰符 abstract class 类名{
    
}

被abstract修饰的类即为抽象类

抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表); //无方法体

被abstract修饰的方法即为抽象方法

细节
  1. abstract只能修饰类和方法

  2. 抽象类不能被实例化

  3. 抽象类中可以没有abstract方法

  4. 若类中有abstract方法,则该类一定要被声明为抽象类

  5. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为了抽象类

  6. 抽象方法不能用private、final、static修饰,与重写违背

    private修饰的方法主要用于被本类其它方法所调用,而abstract修饰的方法没有方法体,同时用abstract和private修饰某个方法,并没有实际意义,并且private修饰的方法并不能被其他类重写

    static修饰的方法为类方法,在类加载的时候被加载,并不能被子类重写

应用情景 模板设计模式

实例:编写一个计算代码块耗时时间的方法

思路1:对每一个代码块都在开头和结尾加上计时代码,实现对不同代码块的计时

public class A{
    public void timing(){
        long starttime = System.currentTimeMillis();
        //待执行代码块
        //...
        //...
        long endtime = System.currentTimeMillis();
        System.out.println(endtime-starttime);
    }
}

缺点:计时代码重复,代码冗余度高

思路2:把计时代码封装成一个方法,代码块封装成一个方法

public class A {
    public void codeblock(){
        //待执行代码块
        //...
        //...
    }
    public void timing(){
        long starttime = System.currentTimeMillis();
        codeblock();
        long endtime = System.currentTimeMillis();
        System.out.println(endtime-starttime);
    }
}

缺点:若有多个类都需要对代码块进行计时,那么在每个类中都要声明计时方法,代码冗余度高

思路3:声明一个模板类,作为这些类的父类,在父类中声明计时方法,并将codeblock方法声明为抽象类,子类将需计时的代码块写入codeblock方法中从而实现对该方法的重写

public class A {
    public abstract void codeblock();
    public void timing(){
        long starttime = System.currentTimeMillis();
        codeblock(); //动态绑定机制
        long endtime = System.currentTimeMillis();
        System.out.println(endtime-starttime);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5693281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存