韩顺平Java教程个人笔记 抽象类和抽象方法

抽象类

基本介绍

  1. 当父类的某些方法需要声明但是还没确定如何实现,则可以将其声明为抽象方法。含有抽象方法的类就是抽象类。

  2. 一般来说抽象类会被继承,在设计的时候会经常用到,其抽象方法会在子类中实现。

  3. 声明为抽象类语法:

    访问修饰符 abstract 类名{ }

  4. 声明为抽象方法语法:(无方法体)

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

注意事项

  1. 抽象类不能被实例化
  2. 抽象类可以没有abstract方法,但是有abstract方法的类一定要声明为抽象类
  3. abstract关键字只能修饰方法和类名,不能修饰属性或其他。
//AbstractDetail01.java

public class AbstractDetail01 {
}

//抽象类可以没有abstract方法
abstract class A{
    public void hi(){
        System.out.println("hi");
    }
}

//但是有abstract方法的类一定要声明为抽象类
abstract class B{
    public abstract void hi();
}

/** abstract关键字只能修饰方法和类名,不能修饰属性或其他。
 * class C{
 *     public abstract int n1 = 1;//报错
 * }
 */
  1. 抽象类本质还是类,可以拥有任意成员。如:非抽象方法、构造器、静态属性等。

  2. 抽象方法不能有主体(不能有大括号),即不能在父类中实现。

  3. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自身也声明为抽象类。从语法角度讲,所谓实现就是给方法后面补上大括号,无论是否大括号里有内容。

  4. 抽象方法不能用privatefinalstatic 等关键字来修饰,因为这些关键字和重写是相互违背的。

    • private:子类无法访问
    • final:子类无法重写
    • static:本类中要初始化,而抽象类不需要初始化
//AbstractDetail02.java

public class AbstractDetail02 {
    public static void main(String[] args) {
        System.out.println("你好");//只是为了能运行方面检测而写的语句
    }
}

//抽象类本质还是类,可以拥有任意成员。声明以下抽象类后运行未报错
abstract class D{
    public int n1 = 10;//普通属性
    public static String name = "hspjava";//静态属性
    public void hi(){//普通方法
        System.out.println("hi");
    }
    public static void OK(){//静态方法
        System.out.println("OK");
    }
    public abstract void hello();//抽象方法
}

//如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自身也声明为抽象类。
abstract class E{
    public abstract void hi();
}

/**以下会报错,因为没有实现E中的hi()方法
 * class F extends E{
 *
 * }
 */

//以下不会报错,因为F也声明为了抽象类,但要在F的子类中实现hi()方法
abstract class F extends E{

}

class G extends E{
    @Override
    public void hi() {//此处加了大括号,从语法上实现了方法,不会报错
    }
}

实践-模板设计模式

需求:

  1. 有多个类,完成不同的任务
  2. 要求能够得到各自完成任务的时间

实践:

设计抽象类(Template)完成如下功能:

  1. 编写方法calculateTime(),计算某段代码执行的耗时
  2. 编写抽象方法job()
  3. 编写子类 Sub 继承抽象类Template(),并实现job()
  4. 编写测试类TestTemplate

抽象类Template

//Template.java
abstract class Template {
    public abstract void job();//声明抽象类job
    public void calTimes(){//统计耗时
        long start = System.currentTimeMillis();//该方法用于统计1970-1-1 0:0:0至今的时间,单位ms
        job();
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start));
    }
}

AA类和BB类中都实现job方法,一个+=,一个*=

//AA.java
public class AA extends Template{
    public void job(){
        long num = 0;
        for (long i = 0; i <= 80000; i++) {
            num += i;
        }
    }
}
//BB.java

public class BB extends Template{
    public void job(){
        long num = 0;
        for (long i = 0; i <= 80000; i++) {
            num *= i;
        }
    }
}

测试主函数TemplateTest

//TemplateTest.java
public class TemplateTest {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calTimes();
        BB bb = new BB();
        bb.calTimes();

    }
}

运行结果:(耗时与计算机配置有关,不同计算机结果可能不一样)

耗时:1
耗时:1
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值