1 抽象类:
定义: 必须用 abstract 修饰的类, 如果一个类包含抽象方法,则这个类是抽象类。
作用:解决代码部分余,把共有的类中的方法公有化,需要用这些方法的类只需要继承这个抽象类即 可,并且是在父类中没有具体实现,必须在子类中具体实现的。
抽象方法:
1.用abstract修饰的方法,和普通方法的区别在于:抽象方法没有方法体,
2.只是声明一个方法,不做具体的实现, 而且抽象方法必须在抽象类中,
3.抽象方法所在的类必须声明为抽象类
4.抽象方法声明的类型不能为private(私有的),这里说的不能设为private,是因为如果设为private ,子类就继承不了这个方法,那这个方法就失去了他的意义了。
5.抽象类中科院声明普通方法
首先new 一个抽象类 A,在类中声明一个方法,声明方法如果没有村遵从以上规则都会报可见错误
1.用abstract 修饰的方法,带方法体
2.声明私有
3.abstract修饰,没有方法体,这样就不会报错了。
4.普通类中声明抽象方法,会直接提示异常
那么问题来了,抽象类的作用是什么呢?还记得java的三大特性嘛,封装,继承,多态,
抽象方法就是用于子类继承用的,但是java只能单继承,可以多实现。我们在写一个子类C来继承抽象类A
C继承A后会报错,错误是什么呢,找到提示的原因,原来是没有重写A中的抽象方法
那我们重写一下A的抽象方法就好了,但是普通方法好像并没有被重写,由此可见,子类继承抽象类时,必须要实现抽象类中所有的抽象方法,普通方法是非必须重写的。
还有一个问题,抽象类能不能继承抽象类呢,继承之后又会怎么样呢?那我们试一下,new一个抽象类B ,继承A,在B中声明一个抽象方法 getB();
继承之后,并没有要强制重写A中的抽象方法,但是也可以重写A的get方法,当然可也重写A的普通方法
我们来测试一下,抽象类中的效果,new一个Test测试类,在Test中new 抽象类A,发现不行,new的时候,必须重写A的抽象方法
C继承了A,那C就可以调用A中的非私有的抽象方法了。抽象方法如果在C中重写了,那么具体的内容是以C中重写的内容为准。
总结:
抽象方法需要用关键字abstract修饰
抽象方法没有方法体,即只有声明,而没有具体的实现
抽象方法所在的类必须声明为抽象类
抽象方法必须声明为public或者protected,不能声明为private
抽象类不能被实例化,即不能通过new来创建对象
抽象类需要用关键字abstract修饰
如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。
抽象类除了可以拥有普通类的成员变量和成员方法,还可以拥有抽象方法
接口:
什么是接口?
定义:用 interface修饰的类,并且类中的方法没有方法体.可以被多实现。
为什么要用接口呢?
作用:用于代码的同一规范和协议,减轻了后期代码维护的难度。(如果后期需要增加/修改东西的时候只需要找到对应的接口,在接口的实现方法中修改即可,或者多加一个接口),当多个人开发的时候,统一规范编码,变量命名等等,这样就不会乱也减轻了开发工作量。
注意:接口类中除了没有方法体之外,也没有普通方法。
1.new 一个接口类 ,在类中定义一个接口,
package test;
public interface Dservice {
public String a();
}
2.new 接口实现类 ,实现接口时,需要强制重写接口类中的所有接口方法,在实现类中做具体实现
package test;
public class Dimpl implements Dservice {
@Override
public String a() {
String s = "DD is me";
System.out.println(s);
return s;
}
}
3.创建一个测试类,声明一下接口,在方法中直接调用接口中的方法,
package test;
import org.springframework.beans.factory.annotation.Autowired;
public class E {
@Autowired
private Dservice dservice;
public String ss(){
return dservice.a();
}
}
输入内容
DD is me
总结:
1.用interface 修饰的类叫接口
2.接口不能被继承,但是可以被实现,可以实现多个接口
3.实现类必须重写接口类中所有的接口
4.接口类不能被实例化,
5.接口中的方法没有方法体,具体实现在子类中
6.接口方法不能声明私有的,子类访问不到接口类中的私有化方法,那么这个方法就失去作用了
抽象类和接口的区别
1.都不能实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2.抽象类需要被继承,接口需要被实现
3、接口只能做方法申明(类似一个规范),抽象类中可以做方法申明,也可以做方法实现 (增强代码的扩展性)
4.接口定义的变量只能是公共的静态常量,抽象类中定义的变量是普通变量。
5.抽象类中的所有抽象方法都需要被子类实现,如果不能实现父类的全部方法,那么该子类只能是抽象类,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6.抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7.抽象类里面可以没有抽象方法,接口里面方法没有方法体
8.如果一个类里面有抽象方法,那么这个类只能是抽象类,
9.抽象类的所有方法不能为静态和私有的,因为所有的抽象方法需要被实现。
10.接口可多继承,抽象类只能继承单个,