一、接口概念
通过interface关键字修饰的Java元素就是接口
格式:public interface 接口名{ }
interface 接口名{ }
二、为什么要使用接口?
为了克服java的单继承,接口可以被实现多个
例如:收费,出租车有收费功能【1元/公里】,飞机有收费功能【全程100元】
出租车与飞机不是同一类事务,但是有相同的功能
接口实际就是提供不同类型事务的公共内容,由接口根据自身的实际情况,类实现这个接口提供的公共内容。这样子类就不需要创建这个公共内容,只需要继承父类来重新写一下。
三、接口中的元素
接口可以有常量、静态方法、抽象方法
1.接口汇总变量一定是public static final修饰的变量
2.接口中的静态方法一定是public修饰的,public可以被省略
3.接口中的抽象方法一定是public abstract修饰的,public abstract可以省略
例如:package com.wangxing.interfacetest1; /** * 创建爱你一个接口 * @author 联想 */ public interface interfaceClass { //不能使普通实例变量/静态变量/局部边浪 //public int int=1001; //public static int1=1001; //接口中的变量必须有 public stati final声明 //可以省略public static但是还是静态变量 final int int1=1001; //接口中方法一定是静态方法一定是public修饰,可以省略public //public interfaceClass(){} //public void method1(){} public static void method(){ System.out.println("这是接口方法"); } //接口中的抽象方法一定是public abstract修饰的,public abstract可以省略 public abstract void interfaceMethod(); void interfaceMethod2(); }
四、接口的用法
1.接口不能new,如果需要访问抽象方法需要借助接口子类
例如:package com.wangxing.interfacetest2; public interface interfaceClassTow { //创建接口变量,可以使用接口名访问 public static final String name="zhangsan"; //创建抽象方法 public abstract void interfaceMethod2(); }
package com.wangxing.interfacetest2; public class interfaceTowSun implements interfaceClassTow{ @Override public void interfaceMethod2() { System.out.println("这是继承interfaceClassTow接口抽象方法重写后的"); } }
package com.wangxing.interfacetest2; public class main { public static void main(String args[]){ //创建interfaceTowSun对象 interfaceTowSun its=new interfaceTowSun(); //调用interfaceTow中的interfaceMethod2方法 its.interfaceMethod2(); } }
2.类可以通过implements关键字去实现一个/多个接口
3.普通类去实现一个/多个接口,就需要将每一个接口抽象方法重写,否则就需要将这个普通的类改成抽象类。
例如:package com.wangxing.interfacetest2; public class Class implements interfaceClassTow,interfaceClass{ //继承接口interfaceClass的抽象方法重写 @Override public void interfaceMethod() { System.out.println("interfaceClass的抽象方法重写后的"); } //继承接口interfaceClassTow的抽象方法重写 @Override public void interfaceMethod2() { System.out.println("interfaceClassTow的抽象方法重写后的"); } }
4.抽象类去实现一个/多个接口,不需要重写接口中的抽象方法。
例如:抽象类的子类继承这个方法时需要重写package com.wangxing.interfacetest2; /** *创建抽象类 * @author 联想 */ public abstract class abstractClass implements interfaceClassTow{ //抽象类继承接口时不需要重写抽象方法 //抽象类的子类要重写父类继承接口的抽象方法 }
package com.wangxing.interfacetest2; public class abstractSun extends abstractClass { //这是抽象类从接口2的抽象方法上继承的需要重写 @Override public void interfaceMethod2() { // TODO Auto-generated method stub } }
5.接口可以继承接口,并且可以继承父接口中的所有元素.
例如:package com.wangxing.interfacetest2; public interface abstarctInterfaceTow extends interfaceClassTow { }
package com.wangxing.interfacetest2; public interface interfaceClassTow { //创建接口变量,可以使用接口名访问 public static final String name="zhangsan"; //创建接口方法 //接口中的静态方法可以使用接口名访问 public static void method(){ System.out.println("这是接口的方法"); } public abstract void interfaceMethod2(); }
测试:
package com.wangxing.interfacetest2; public class main { public static void main(String args[]){ //测试接口继承接口 System.out.println("从接口2上继承的元素"+abstarctInterfaceTow.name); } }
6.利用接口对象创建出接口对象接口2
package com.wangxing.interfacetest2; public interface interfaceClassTow { //创建接口变量,可以使用接口名访问 public static final String name="zhangsan"; //创建接口方法 //接口中的静态方法可以使用接口名访问 public void method(){ System.out.println("这是接口的方法"); } public abstract void interfaceMethod2(); }
接口子类
package com.wangxing.interfacetest2; public class interfaceTowSun implements interfaceClassTow{ @Override public void interfaceMethod2() { System.out.println("这是继承interfaceClassTow接口抽象方法重写后的"); } public void method() { System.out.println("这是继承interfaceClassTow接口method方法重写后的"); } }
package com.wangxing.interfacetest2; public class main { public static void main(String args[]){ //用接口名访问接口2中的method //interfaceClassTow.method(); //创建interfaceSun对象 interfaceSun its=new interfaceSun(); //调用interfaceSun中重写的method方法 //此时结果是接口2的子类重写后的method方法 its.method(); //如果想要访问接口2父类中的method方法可以使用接口接口回调对象创建接口对象,得到接口2的对象 //1.接口回调对象只能访问接口的抽象方法,实际上访问子类重写以后的抽象方法 interfaceClassTow ift =new interfaceSun(); //ift.method(); System.out.println("使用创建的接口对象访问接口2中的元素"+ift.name); //2.接口回调对象不能访问子类本身的方法,如果要访问就需要强制类型转换 //由接口2对象强制转换回接口的子类对象 interfaceSun ifct=(interfaceSun)ift; } }
7.当某一个普通的java类中的方法参数是接口类型的时候,可以传递接口回调对象,也可以是接口的子类对象。
例如:package com.wangxing.interfacetest2; public class puTongClass { public void method(interfaceClassTow inter){ System.out.println("这是参数为接口类型的实例方法"); } }
package com.wangxing.interfacetest2; public class main { public static void main(String args[]){ //创建interfaceSun对象 interfaceSun its=new interfaceSun(); //如果想要访问接口2父类中的method方法可以使用接口接口回调对象创建接口对象,得到接口2的对象 //1.接口回调对象只能访问接口的抽象方法,实际上访问子类重写以后的抽象方法 interfaceClassTow ift =new interfaceSun(); //ift.method(); System.out.println("使用创建的接口对象访问接口2中的元素"+ift.name); //2.接口回调对象不能访问子类本身的方法,如果要访问就需要强制类型转换 //由接口2对象强制转换回接口的子类对象 interfaceSun ifct=(interfaceSun)ift; //创建普通类的对象 puTongClass ptc=new puTongClass(); //使用了接口2的回调对象 ptc.method(ifct); //使用了接口2的子类对象 ptc.method(its); } }
五、 接口回调对象
接口回调对象与上转型对象很相似
接口回调对象--接口的子类对象赋值给接口变量
1.接口回调对象只能访问接口的抽象方法,实际上访问子类重写以后的抽象方法
2.接口回调对象不能访问子类本身的方法,如果要访问就需要强制类型转换例如:
package com.wangxing.interfacetest2; public interface interfaceClassTow { //创建接口变量,可以使用接口名访问 public static final String name="zhangsan"; //创建接口方法 //接口中的静态方法可以使用接口名访问 public static void method(){ System.out.println("这是接口的方法"); } public abstract void interfaceMethod2(); }
子类
package com.wangxing.interfacetest2; public class interfaceSun implements interfaceClassTow{ @Override public void interfaceMethod2() { System.out.println("这是继承interfaceClassTow接口抽象方法重写后的"); } public static void method(){ System.out.println("这是的interfaceTowSun重写父类接口的方法"); } }
测试:
package com.wangxing.interfacetest2; public class main { public static void main(String args[]){ //如果想要访问接口2父类中的method方法可以使用接口接口回调对象创建接口对象,得到接口2的对象 //1.接口回调对象只能访问接口的抽象方法,实际上访问子类重写以后的抽象方法 interfaceClassTow ift =new interfaceSun(); //接口回调对象不能访问除了抽象方法以外的方法 //想要访问抽象方法中的其他方法使用接口名直接访问 interfaceClassTow.method(); //ift.method(); System.out.println("使用创建的接口对象访问接口2中的元素"+ift.name); //2.接口回调对象不能访问子类本身的方法,如果要访问就需要强制类型转换 //由接口2对象强制转换回接口的子类对象 interfaceSun ifct=(interfaceSun)ift; ifct.method(); } }
六、卖水果和文具实例
创建价格功能接口和怎么吃的接口
package com.wangxing.interfacetest3; public interface fruitPrice { //创建一个抽象方法给接口 public abstract void priceMethod(); }
package com.wangxing.interfacetest3; public interface fruitEat { public abstract void eatMethod(); }
创建超市里面的有的水果类
package com.wangxing.interfacetest3; public class apple implements fruitPrice,fruitEat{ @Override public void eatMethod(){ System.out.println("可以削了皮吃。"); } @Override public void priceMethod(){ int price=8; System.out.println("苹果的价格为:"+price+"元/斤"); } }
package com.wangxing.interfacetest3; public class xigua implements fruitPrice,fruitEat { @Override public void eatMethod() { System.out.println("切开吃。"); } @Override public void priceMethod() { int price=12; System.out.println("苹果的价格为:"+price+"元/斤"); } }
创建用户要购买时触发的动作及得到的结果
package com.wangxing.interfacetest3; import java.util.Scanner; public class shuiGuoMain { public static void main(String args[]){ boolean fag = true; while(fag){ Scanner scn=new Scanner(System.in); System.out.println("请输入您要购买的水果:"); String sg=scn.next(); if(sg.equals("苹果")){ apple ap=new apple(); ap.priceMethod(); ap.eatMethod(); } if(sg.equals("西瓜")){ xigua xg=new xigua(); xg.priceMethod(); xg.eatMethod(); } if(!sg.equals("苹果")&&!sg.equals("西瓜")){ System.out.println("我们超市没有此水果"); fag=false; } } } }
这时超市拓展业务买文具这时候可以直接使用水果具有的价格功能
package com.wangxing.interfacetest3; public class qianBi implements fruitPrice{ @Override public void priceMethod() { int price=2; System.out.println("铅笔的价格为"+price); } }
创建用户要购买文具时触发的动作及得到的结果
package com.wangxing.interfacetest3; import java.util.Scanner; public class wenJuMain { public static void main(String[] args) { boolean fag = true; while(fag){ Scanner scn=new Scanner(System.in); System.out.println("请输入您要购买的文具:"); String sg=scn.next(); if(sg.equals("铅笔")){ qianBi qb=new qianBi(); qb.priceMethod(); } if(!sg.equals("铅笔")){ System.out.println("我们超市没有此文具"); fag=false; } } } }