抽象类
定义:一个类的方法是抽象方法时,那么这个类就是抽象类。
在类名前用关键字abstract修饰:如定义一个抽象的动物类的具体格式如下:
//定义抽象类
abstra class animal{
//定义抽象方法
abstract int shout();
}
注意:
1、包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需使用abstract来修饰即可。
2、抽象类不可以被实例化,因为抽象类中可能包含抽象方法,抽象方法没有方法体,不可以被调用。
3、如果一个非抽象类继承了抽象类,那么这个类必须重写抽象类的抽象方法
例如:abstract class Anmial{
abstract void shout();
}
class Dog extends Anmial{
@Override
void shout() {
}
}
4、如果是抽象类继承抽象类,那么作为派生类的抽象类可以不实现基类的抽象方法。
例如:abstract class Anmial{
abstract void shout();
}
abstract class Dog extends Anmial{
}
5、在重写方法的时候 :派生类的访问权限一定要大于等于基类的访问权限抽象类里面可以包含非抽象方法。
例如:
abstract class Anmial{
public abstract void shout();
}
class Dog extends Anmial{
@Override
public void shout() {
//重写父类的方法时该方法的权限一定要大于等于父类方法的权限
}
}
6、如果父类没有无参构造函数,那么子类构造必须使用super()关键字指出父类使用哪个构造方法。
7、抽象类不允许用final关键字声明,因为final声明的类不允许有子类,而抽象类必须有子类。
模板设计
开闭原则(OCP)一个软件实体如类,模块和函数应该对扩展开放,对修改关闭
使用模板设计的好处:
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、控制子类扩展。
接口
用关键字interface 声明
//定义一个Anmial的接口
interface Anmial{
void breathe();//定义抽象方法
}
1、接口:定义接口的关键字:interface
如:
interface Anmial{
//定义一个Anmial接口
}
2、接口中的数据成员默认为 public static final 全局常量
例如:
interface Anmial{//定义一个Anmial的接口
1、 public static int a=100;
2、int b=100;
常量定义可以使用1或2两种格式 都代表静态全局变量
}
3、接口里面定义的方法默认为抽象方法
例如:
interface Anmial{//定义一个Anmial的接口
1、public static void print();
2、void breathe();//定义抽象方法
}
抽象方法定义可以使用1或2两种格式,都代表 静态公用的抽象方法
4、接口内不能有已经实现的方法。
5、接口解决了JAVA中的单继承问题,一个类可以实现多个接口,接口不能进行实例化。
例如:
interface Anmial{//定义一个Anmial的接口
void breathe();//定义抽象方法
}
interface A{//定义一个A的接口
void re();
}
class b implements A,Anmial{
//定义一个b的接口 实现A和Anmial接口
@Override
public void breathe() {
}
@Override
public void re() {
}
}
6、接口可以继承多个接口,此时的接口拥有了继承的接口里面的抽象方法
例如:
interface Anmial{//定义一个Anmial的接口
void breathe();//定义抽象方法
}
interface A{//定义一个A的接口
void re();
}
interface b extends A,Anmial{//定义一个b的接口 继承A和Anmial接口
void su();
}
7、如果一个抽象类继承了接口,那么抽象类当中可以不实现接口的方法
8、但是如果再有一个普通类继承了此抽象类,那么普通类一定要实现接口和抽象类里面的抽象方法。
例如:
interface Anmial{//定义一个Anmial的接口
void breathe();//定义抽象方法
}
interface A{//定义一个A的接口
void re();
}
abstract class b implements A,Anmial{
//定义一个b的接口 继承A和Anmial接口
//b作为抽象接口,不实现A中的方法
abstract void prinf();
}
// DeleteStudent继承了b,并复写了其中的方法
public class DeleteStudent extends b {
@Override
public void breathe() {
}
@Override
public void re() {
}
@Override
void prinf() {
}
}