Java 抽象类与接口
一、抽象类
在Java语言中,使用 abstract class 来定义抽象类:
/** * 定义一个抽象类 * @author Administrator * */ public abstract class Demo { }
- 尽管Demo类是抽象类,但是它仍然可以有成员变量,成员方法和构造方法
- 抽象类不能被实例化
- 抽象类可以被继承
抽象方法:
使用abstract 来声明抽象方法,抽象方法只包含一个方法名。且没有方法体。
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象
/** * 定义一个抽象类 * @author Administrator * */ public abstract class Demo { public String name; //抽象类中的成员变量 public String sex; public int age; /** * 抽象类的构造方法 */ public Demo(){ } /** * 抽象类中的成员方法 */ public void fun(){ System.out.println("我是抽象类中的成员方法"); } /** * 抽象方法 * 使用abstract声明 * 没有方法体 */ public abstract void funtion(); }
抽象类总结规定:
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过,只有抽象类的非抽象子类可以创建对象。
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
二、接口
接口定义的语法格式如下:
[访问控制修饰符] interface 接口名 [ extends 接口列表]{
常量
抽象方法
}
/** * 定义一个借口 * @author Administrator * */ public interface Interface { public String name = "abc"; //接口中的常量 public int age = 18; /** * 接口中的抽象方法 * 接口中定义抽象方法可以不写abstract */ public void fun(); }
访问控制修饰符的要求与类的一致,只能使用public和default(在使用default时,访问控制修饰符不填写)
- 使用public进行修饰表示该接口为公共接口,可以被任意一个类所使用
- 不加访问控制修饰符进行修饰则表示此接口为友好接口,友好接口只能被同一个包中的类所使用
interface为关键字,只有使用了interface,程序才认为这是接口
接口名同标识符
接口也是可以继承的,其语法与类的继承是一样的
与类继承的区别在于一个接口可以有多个父接口,这些父接口之间用逗号“ , ”隔开,形成父接口列表
接口的特性:
- 接口不可以被实例化
- 实现类必须实现接口的所有方法
- 实现类可以实现多个接口
- 接口中的变量都是静态常量
接口的作用:
- 接口的主要作用就是将程序中的“ 实现什么功能 ” 和 “ 怎么实现功能 ” 这两个概念分离开,这样编写出来的程序是可以拆分的,增强了程序的可维护性
- 另一个作用主要体现在团队合作上,准确的进行项目的开发
三、关键字final
final 可以用来修饰类,变量,方法
final 修饰的类不能有子类,也不能被继承
final 修饰的变量是一个常量,不能重新赋值,且定义时必须赋值
final 修饰的方法不能重写
/** * final 修饰类 * @author Administrator * */ public final class Abc { public final String name = "sunny"; //final 修饰变量 public final int age = 18; /** * final修饰方法 */ public final void fun(){ } }