接口,抽象类,一般类,他们的共同点:都是一个类;
抽象类前面介绍了一些,下面谈谈接口,我们知道抽象类用abstract修饰符修饰,它可以拥有抽象方法,也可以拥有具体方法。抽象类最大的特征就在于它不能被实例化,而接口本身就是一个抽象类,不同于抽象类的是,你可以不用显式地显示它的abstract修饰符,也不用显式地显示它的方法的abstract修饰符,即使不显示,但是它的方法依然属于抽象方法,接口中只能包含抽象方法,它不允许有具体方法。
接口是用来实现的,用修饰符implements,而抽象类则只能被extends.一个一般类只能继承于一个类,但是它可以实现多个接口。
1)定义一个接口:
public abstract interface IInterTest //等同于public class IInterTest,可以省略 abstract
{
public void printName();//等同于public abstract void printName,可以省略 abstract
}
2)定义它的实现类:
public class InterTest extends InterTester
{
public static void main(String[] args)
{
IInterTest test = new InterTest();//接口的多态,借口自己无法实例化,但是它的引用可以指向它的一个实现类的对象;
test.printName();
InterTester test1 = new InterTest();
InterTester test2 = new InterTest();
test1.printAge();//父类的static方法是无法被重写的,就是你写了它也不帮子类实现,一直实现的是父类的方法;
InterTester.printAge();//推荐使用类名.加静态方法
}
public void printName()//抽象类实现接口,可以不写接口中的方法,但是不代表它没做;实现接口的抽象类中虽然可以不写接口的方法,但是不代表这个方法没有,所以必须实现抽象方法;
{
System.out.println("MyName");
}
public static void printAge()//静态方法只能被继承,不能被重写,虽然不报错,但是不执行
{
System.out.println(33);
}
public InterTest()//只在new一个新的对象的时候,才执行构造方法;
{
System.out.println("后于静态代码块执行!");
}
static //初始时执行,执行一次,最先执行最上级的父类,再依次向下执行,执行完所有静态代码块再做其他操作;
{
System.out.println("静态代码块,先于构造方法!");
}
}
abstract class InterTester implements IInterTest
{
//抽象类实现接口,可以不写接口中的方法,但是不代表它没做;
public static void printAge()
{
System.out.println(23);
}
}
输出结果如下:
静态代码块,先于构造方法!
后于静态代码块执行!
MyName
后于静态代码块执行!
后于静态代码块执行!
23
23
上面的程序将继承,实现,一般类,接口,抽象类放到一起就是方便大家区分。接口不能被一般类继承,接口只能被接口继承,接口既可以被一般类实现,也可以被抽象类实现。