1.抽象类使用abstract修饰符定义
抽象类不能实例化
抽象类可以包含普通属性方法,和普通类差不多
抽象类的方法没有方法体
实现抽象方法时权限修饰符不能低于抽象方法定义时的权限修饰符
从上面来看抽象类和普通类的区别:抽象类用abstract修饰符修饰,抽象方法没有方法体,其他貌似都一样
抽象类的作用,因为继承抽象类必须实现抽象类的方法,所以避免了子类设计的随意性,是一种模板模式。
class AbTest extends Ab
{
public void cTest(){ //继承抽象类必须实现抽象类的抽象方法
System.out.println("cTest");
}
public void dTest(Ab ab){ //抽象类不能创建实例,但是可以用来定义,然后以子类实现
}
public static void main(String[] args){
AbTest abTest = new AbTest();
System.out.println(abTest.c);
abTest.cTest();
abTest.dTest(new AbTest2()); //向上转型
}
}
abstract class Ab
{
private int a = 1; //抽象类的普通属性
protected int b = 2;
public int c = 3;
private void aTest(){ //抽象类的普通方法
System.out.println("aTest");
}
protected void bTest(){
System.out.println("bTest");
}
protected abstract void cTest(); //抽象类的抽象方法,没有方法体
}
2.接口是更彻底的抽象
接口属性默认是public static final 且只能是常量
接口的方法都是public abstract
一个类可以继承多个接口,相当于实现了多重继承
class InterfaceTest implements Itest
{
public void printTest(){ //实现接口方法
System.out.println("接口方法实现");
}
public void test(Itest it){ //接口当做形参,可以用子类实现
}
public static void main(String[] args)
{
InterfaceTest it = new InterfaceTest();
it.printTest(); //接口方法
System.out.println(Itest.MAX_A); //接口中静态常量
it.test(new InterfaceTest()); //向上转型
}
}
interface Itest //如果不定义修饰符,默认包修饰符,只有同包下能访问的接口
{
int MAX_A = 123; //默认是public static final,且属性只能是常量
void printTest(); //接口方法默认是public abstract
}
3.抽象和接口的异同
相同之处:
不同之处: