在类与类之间存在继承关系时,有可能会出现父类存在一种功能(方法),但在不同子类中该方法内容不一样。比如动物都有吃的功能,而猫吃老鼠,狗吃骨头,两者内容不一样,这时,就要使用抽象类。
实例解释:
abstract class Animal//class前要加abstract关键字
{
astract void eat();//不能确定的功能也要加abstract,这称为抽象函数,而且该函数没有主体,分号结束
void sleep()
{
System.out.println("睡觉");
}
}
class Cat extends Animal
{
public void eat()//子类要把父类中的抽象函数重写掉
{
System.out.println("吃老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
}
注意事项:1,如果子类没有把父类中的所有抽象函数重写掉的话,子类也必须定义为抽象类。
2,抽象类不能建立对象。
在子类较少时,内容不同的同一功能可以不定义在父类中,而是定义为子类的特定功能,但是如果子类种类很多,就应该使用抽象类,以免功能丢失。
================================================================================================================
接下来要说的是接口,接口其实就是特殊的抽象类,接口中的所有函数都是抽象函数,接口也有子类,子类并不是继承接口,而是实现接口(其实基本用法一样),关键字为implements,而定义接口时还要用到的关键字是interface,取代class。
举个例子展示一下格式:
interface KaiGuan//接口的定义(名字是开关。。。。)
{
public abstract void open();
public abstract void close();
}
class Light implements KaiGuan//implements关键字完成实现开关接口
{
public void open()
{
System.out.println("开灯");
}
public void close()
{
System.out.println("关灯");
}
};
接口的功能:有利于程序功能的扩展,有利于开发的模块化,至于具体例子,等学完多态就明白了。
接口的特点:1,接口可以多实现,这也是与继承之间最大的区别,在类中,如果实现多继承,那么如果不同父类中含有同名功能,在通过子类对象调用该功能时,就会出错, 因为不知道要调用哪个函数,而对于接口,由于接口中定义的全是抽象函数,无函数主体,只有被子类重写后才有用,并且以子类中定义的为准,因此不存在 矛盾。
2,接口中的成员有固定的修饰符,其中常量是public static final,方法是public abstract,一般不会在接口中定义变量,这些修饰符是固定的,即使忘了写,系统也 会默认加上(隐式)。
====================================================================================================================
既然上面讲到了final这个修饰符,那就要讲一下。
final可以用来修饰常量(final变量),方法以及类。
常量的修饰:final 类型 常量名=值;被final修饰过的变量只能被赋值一次,换句话说,在接下来的代码中,不能对final变量的值进行修改。
方法的修饰:final 类型 方法名(参数){主体} 被final修饰过的方法不能被重写。可以把类中一些重要的方法用final去修饰,防止被重写。
类的修饰:final class 类名{主体} 被final修饰过的类不能被继承,而且类中所有方法也默认被final修饰。