目录
一、抽象类
1.概念
在面向对象的概念中,所有的对象都通过类来描述,但并不是所有类都是描绘对象的,如果一个类中没有足够的信息来描述一个具体的类,那么这个类就叫抽象类!例如:
注意:
Animal类中有bark()方法,但由于Animal不是一个具体的动物,因此bark()方法不能具体实现,而Cat与Dog类都是具体的动物,且都继承于Animal类,所以此时可以将Animal设置为抽象类。像Animal中的bark()没有实际工作的方法称为抽象方法,包含抽象方法的类称为抽象类 。
2.语法
java中,如果被abstract修饰的类就称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体(内部细节代码)。
abstract class Animal{ String name; int age; abstract void bark(); }
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法 。
3.特征
(1)抽象类不能直接实例化对象。
(2)抽象方法不能是private的,抽象方法不能被final和static修饰(因为抽象方法要被子类重写)
(3)抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必需要使用 abstract 修饰(不然创建这个子类没有意义,后期还是要创建一个类去重写父类方法)
(4)抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。
(5)抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量 。
4.作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法,这样相当于多了一个校对器,如果不小心误用成父类了(实际工作不应该由父类完成), 使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误。
二、接口——(附代码8.2.java.1)
1.概念
2.语法
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
注意:
接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.直接 void 方法名称();
3.接口的使用
public interface 接口名称{......}public class 类名称 implements 接口名称 {......}
4.特征(重点)
(2)接口中每一个方法都是public的抽象方法(需要在实现类中重写方法), 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)。
(3)接口中的方法是不能在接口中实现的,只能由实现接口的类来实现 。
(4)重写接口中方法时,不能使用默认的访问权限 。(必须写出来)
(5)接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量,接口中不能有静态代码块和构造方法。(区别于抽象类可以有构造方法)
(6)如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。
5.多个接口的实现
在java中,类和类继承是单继承的,一个类只有一个父类,即没有多继承,而一个类的实现是可以有多个接口的。
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性,有了接口之后,使用者就不用关心具体类型,而是关心,某个类是否具有某种能力!!
6.接口间的继承(重点)
interface Run{ } interface Fly{ } interface exercise extends Run,Fly{ } class Bird implements exercise{ //省略具体代码 }
接口间的继承就相当于合并多个接口,但无论怎样接口最后的实现都要在最后的类中重写接口方法