一、抽象类
1.抽象类的定义
抽象类:只是在普通类的基础上扩充了一些抽象方法,
使用abstract关键字定义类,来
表示抽象类
抽象方法:指只声明而未实现的方法(即没有方法体),所有抽象方法要求使用abstract关键字来定义
abstract class Person//抽象类 { private String name; public String getName() {//普通方法 return name; } public void setName(String name) { this.name = name; } public abstract void print();//抽象方法 }
通过上面代码看出,抽象类中包含有抽象方法,而抽象方法不包含方法体,即没有具体实现。因此抽象类不能直接产生实例化对象,因此要求:
(1)所有的抽象类必须有子类
(2)抽象类的子类必须覆写抽象类的所有抽象方法(子类不是抽象类)
(3)抽象类的对象可以通过对象多态性利用子类为其实例化
(4)private与abstract不能同时使用。
abstract class Person//抽象类 { private String name; public String getName() {//普通方法 return name; } public void setName(String name) { this.name = name; } public abstract void print();//抽象方法 } class Student extends Person { public void print() { System.out.println("抽象类的子类覆写了全部抽象方法"); } } public class Test { public static void main(String[] args) { Person person=new Student();//向上转型 person.print();//被子类覆写的抽象方法 } }
注:
(1)抽象类中允许不定义任何的抽象方法,但是此时抽象类依然无法直接创建实例化对象
(2)抽象类一定不能使用final声明,因为使用final声明的类不允许有子类,而抽象类必须有子类
抽象方法也不能使用private定义,因为抽象方法必须要被覆写。
(3)抽象类也分为内部抽象类和外部抽象类。内部抽象类中也可以使用static定义来描述外部抽象类
如果现在外部抽象类中使用了static那么就是语法错误,但是内部抽象类允许使用static
二、接口
抽象类与普通类相比最大的特点是约定了子类的实现要求,但是抽象类存在单继承局限。如果要约定子类的实现要求并避免单继承局限就需要使用接口。
1.接口
的定义
(1)接口就是一个抽象方法和全局常量(可以没有)的集合,使用interface关键字定义
(2)子类如果要想使用接口,那么就必须使用implements关键字来实现接口,同时,一个子类可以实现多个接口(可以使用接口来实现多继承的概念),而接口的子类(不是抽象类)必须覆写接口中的全部抽象方法。随后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象。
interface IMessage { public static final String MSG="Hello Word";//全局变量 public abstract void print();//抽象方法 } interface INew { public abstract String getNews();//抽象方法 } class Message implements IMessage,INew { public void print()//覆写print抽象方法 { System.out.println(IMessage.MSG); } public String getNews() //覆写getNews抽象方法 { return IMessage.MSG; } } public class Test { public static void main(String[] args) { IMessage message=new Message();//向下转型 message.print();//调用被子类覆写过的方法 INew new1=(INew) message; System.out.println(new1.getNews()); } }
2.接口使用权限
(1)接口中只允许public权限。(不管是属性还是方法,其权限都是public)
(2)当一个子类即需要实现接口又需要继承抽象类时,请先使用extends继承一个抽象类,而后使用implements实现多个接口。
interface INew { void getNews();//抽象方法 } abstract class Messgge//抽象类 { public abstract void getMessage();//抽象方法 } class MessageImple extends Messgge implements INew { public void getMessage()//覆写getMessage抽象方法 { System.out.println("覆写抽象类中的抽象方法"); } public void getNews() //覆写getNews抽象方法 { System.out.println("覆写接口中的抽象方法"); } } public class Test { public static void main(String[] args) { INew new1=new MessageImple(); new1.getNews(); MessageImple messageImple=(MessageImple) new1; messageImple.getMessage(); } }
(3)一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类
(4)一个接口可以使用extends继承多个父接口
(5)接口可以定义一系列的内部结构,包括:内部普通类,内部接口。其中,使用static定义的内部接口就相当于一个外部接口。
3.接口的应用
(1)定义操作标准
(2)表示能力
(3)在分布式开发之中暴露远程服务方法
4.抽象类与接口的区别