Live2D
复制代码

13-抽象类和接口

抽象类和接口

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();
		
	}

}

posted @ 2021-07-22 22:15  Milen-jie  阅读(48)  评论(0编辑  收藏  举报