类中的某些方法需要声明,但又不确定该如何实现时可以将其声明为抽象方法,而声明了抽象方法的类就是抽象类
即抽象方法是指没有实现的方法(没有方法体),当一个类中存在抽象方法时需要将该类声明为抽象类,而抽象方法的具体实现是由子类来完成
public abstract class Animal{ String name; int age; abstract public void cry(); //抽象方法的具体实现由子类重写来完成 }语法 抽象类
访问修饰符 abstract class 类名{ }
被abstract修饰的类即为抽象类
抽象方法访问修饰符 abstract 返回类型 方法名(参数列表); //无方法体
被abstract修饰的方法即为抽象方法
细节-
abstract只能修饰类和方法
-
抽象类不能被实例化
-
抽象类中可以没有abstract方法
-
若类中有abstract方法,则该类一定要被声明为抽象类
-
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为了抽象类
-
抽象方法不能用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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)