抽象类和接口
1、抽象类
/*
* 1.如何定义抽象类
* class关键字前加abstract
*
* 2.抽象类无法被实例化
*
* 3.虽然抽象类没有办法实例化,但是抽象类也有构造方法
* 该构造方法是给子类创建对象用的
*
* 4.抽象类中可以定义抽象方法
* 语法:在方法的修饰符列表中添加abstract关键字,并且抽象方法应该以;结束
* 不能带有{}
*
* 5.抽象类中不一定有抽象方法,但抽象方法只能出现在抽象类中
*
* 6.一个非抽象类继承抽象类,必须在子类中将父类的抽象方法覆盖(重写、实现)
*
* 7.抽象类不能被final修饰
* 抽象方法不能被final修饰,就是说final与abstract不能共存
*/
package o抽象类;
public abstract class A {
//抽象方法
public abstract void m1();
int a;//抽象类中的变量都是静态变量,因为该类是无法实例化的,所以没有成员变量
//Constructor
public A(){
super();
System.out.println("A...");
}
//入口
public static void main(String[] args){
//抽象类无法创建对象
//A a=new A();
//多态
A b = new B(); //父类型引用指向子类型对象
//输出为: A...
// B...
}
}
class B extends A{
public void m1(){//因为B为非抽象类,所有重写的抽象方法是一个成员方法
}
B(){
//此处隐藏super();
System.out.println("B...");
}
}
2、接口
2.1 认识接口
/*
* 接口也是一种引用类型,可以把它等同看作类,因为编译后生成的是.class文件
*
* 1.如何定义接口
* [修饰符] interface 接口名 {}
* 2.接口中只能出现:常量 抽象方法
* 3.接口其实是一个特殊的抽象类,特殊在接口完全是抽象的
* 4.接口中没有构造方法,无法被实例化
* 5.接口和接口之间可以多继承
* 6.一个类可以实现多个接口。(这里的"实现"可以看作继承)
* 7.一个非抽象的类实现接口,需要将接口中的所有方法重写/实现/覆盖
*/
package p接口;
public interface A {
//常量(必须用public static final修饰)
public static final String SUCCESS="success";
public final static double PI=3.14;
//在接口中,public static final可以省略
byte MAX_VALUE=127;
//抽象方法(接口中所有方法都是public abstract)
public abstract void m1();
//接口中public abstract可省略
void m2();
}
interface B{
void m1();
}
interface C{
void m2();
}
interface D{
void m3();
}
interface E extends B,C,D{//接口多继承
void m4();
}
//implements是实现的意思,是一个关键字
//implements和extends意义相同
class MyData implements B,C{//类实现接口,需将抽象方法重写
public void m1(){
}
public void m2(){
}
}
2.2 接口的作用
作用:
/*
* 客户业务接口
*
* 接口的作用:
* 1.使项目分层,所有层都面向接口开发,开发效率提高了
* 2.接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,
* 变得可插拔,可以随意切换
*
* 接口和抽象类都可以完成某个功能,优先选择接口
* 因为接口可以多实现,多继承
* 并且一个类可以实现多个接口外,还保留了继承(继承其他类)
*/
package q接口的作用;
public interface CustomerService {
//定义一个退出系统的方法
void logout();
}
/*
* 编写接口的实现类
*
* 该类的编写完全的面向接口去实现的
*/
package q接口的作用;
public class CustomerServiceImp implements CustomerService {
//对接口中的抽象方法进行实现
public void logout(){
System.out.println("成功退出系统");
}
}
package q接口的作用;
public class Test01 {
public static void main(String[] args){
CustomerService c = new CustomerServiceImp();
c.logout();
}
}
例子:
/*
* 汽车和发动机之间的接口
*
* 生产汽车的厂家面向接口生产
* 生产发动机的厂家面向接口生产
*/
package q接口的作用;
public interface Engine02 {
//建立一个所有的发动机都可以启动的抽象方法
public abstract void start();
}
//生产汽车
package q接口的作用;
/**
*
* @author 钟荣杰
*
*/
public class Car {//此处不需要实现
//Filed
//引擎
//面向接口编程,不能填YAMAHA02 y;引擎不能被固定
Engine02 e;
//Contructor
Car(Engine02 e){//此处的e初始化后的内存地址赋给上面的e
this.e=e;
}
//汽车应该能测试引擎
public void TestEngine(){
e.start();//面向接口调用
//e传过来是谁的地址就调用谁的start方法
}
}
package q接口的作用;
public class HONGDA02 implements Engine02 {
public void start(){
System.out.println("HONGDA启动");
}
}
package q接口的作用;
public class YAMAHA02 implements Engine02 {
public void start(){
System.out.println("YAMAHA启动");
}
}
package q接口的作用;
public class Test02 {
public static void main(String[] args){
//生产引擎
Engine02 e1 = new YAMAHA02();//多态
//生产汽车
Car c = new Car(e1);
//测试引擎
c.TestEngine();
//换HONGDA
Engine02 e2 = new HONGDA02();
c.e = e2;//c.e相当于以前的c.name="XXX",因为e是父类型的,可直接更换属性值,无需再创建对象
c.TestEngine();
}
}