java进阶 - api接口 -规则 -定义格式 -定义特点 -多态引入 -对象多态和行为多态 -多态成员的访问特点 -多态的转型特点以及问题 -支付系统案例31
package com.cyjt97.minterface; public class minterface { // 接口: // 接口的思想提现就是规则 // 如果一个类,所有的组成都是抽象方法, // -没有成员变量 // -没有普通方法 // 这种类我们会设计为java中的接口,因为这个类的唯一价值就是声明规则 // ----------------------------------------- // 接口的定义格式: // interface 接口名字{} // 接口不允许实例化 // 接口与类中间是实现关系,通过implements关键字来完成 // 实现类(口的子类): // 1,重写所有的抽象方法 // 2,将实现类变成抽象类 public static void main(String[] args) { interimp inp = new interimp(); inp.ter(); inp.www(); } } interface inter{ public abstract void ter(); public abstract void www(); } //1,重写所有的抽象方法 class interimp implements inter{ @Override public void ter() { System.out.println("吃饭睡觉"); } @Override public void www() { System.out.println("打豆豆"); } } //2,将实现类变成抽象类 // 然后子类接收这个抽象类 // 一般来说用的比较少 abstract class interimp2 implements inter{ }
package com.cyjt97.minterface; public class minterface2 { public static void main(String[] args) { // 接口的成员特点 /* 1成员变量: 只能定义常量,系统会默认加入三个关键字 public , static,final 2成员方法: 只能定义抽象方法,因为系统会默认加入两个关键字 public,abstract 3构造方法:没有*/ // 系统会默认加入三个关键字static System.out.println(give.age); } } interface give { // 系统会默认加入三个关键字 // public final static int age = 20; int age = 20; // 只能定义抽象方法,abstract加不加系统都会自动帮我们加上去 public abstract void SHOW(); }
package com.cyjt97.minterface; public class minterface3 { /* 接口和类之间的关系: 1,类与类之间的关系:继承关系,可以单继承,也可以多层继承,不支持多继承关系 2,接口与类直接的关系,实现关系,可以单实现,也可以多实现,甚至可以继承一个类的同时,实现多个接口 3,接口和接口之间的关系:继承关系,可以单继承,也可以多继承 */ public static void main(String[] args) { } } //可以单实现,也可以多实现,没有逻辑性 //不会逻辑冲突 interface A { void A(); } interface B { void B(); } interface C { void C(); } class ABC implements A, B, C { @Override public void A() { } @Override public void B() { } @Override public void C() { } } class fu { public void show() { System.out.println("父"); } } //甚至可以继承一个类的同时,实现多个接口 class zi extends fu implements A, B, C { @Override public void A() { } @Override public void B() { } @Override public void C() { } } interface interA { void SHOW(); } interface interB { void SHOW(); } //继承关系,可以单继承,也可以多继承 interface interC extends interA, interB { void SHOW(); }; class interD implements interC { @Override public void SHOW() { } };
package com.cyjt97.minterface; public class minterface4 { // 抽象类和接口的对比 /* 成员变量: 抽象类:可以定义常量,也可以定义变量 接口:只能定义常量 成员方法: 抽象类:可以定义具体方法,可以定义抽象方法 接口:只能定义抽象方法 构造方法: 抽象类:有 接口:无 */ // 抽象类:对事物进行抽象(描述事物) // 接口:对行为抽象(指定规则) }
package com.cyjt97.order; public interface order { // 创建订单 void create(); // 查单个订单 void single(); //查多个订单 void Multiple(); // 取消订单 void cancel(); // 完结订单 void end(); // 支付订单 void pay(); }
package com.cyjt97.order; public class orderInterface implements order { // 创建订单 @Override public void create() { System.out.println("创建订单"); } // 查单个订单 @Override public void single() { System.out.println("查单个订单"); } //查多个订单 @Override public void Multiple() { System.out.println("查多个订单"); } // 取消订单 @Override public void cancel() { System.out.println("取消订单"); } // 完结订单 @Override public void end() { System.out.println("完结订单"); } // 支付订单 @Override public void pay() { System.out.println("支付订单"); } }
package com.cyjt97.order; public class foreignOrders implements order{ // 创建订单 @Override public void create() { System.out.println("创建订单-国外"); } // 查单个订单 @Override public void single() { System.out.println("查单个订单-国外"); } //查多个订单 @Override public void Multiple() { System.out.println("查多个订单-国外"); } // 取消订单 @Override public void cancel() { System.out.println("取消订单-国外"); } // 完结订单 @Override public void end() { System.out.println("完结订单-国外"); } // 支付订单 @Override public void pay() { System.out.println("支付订单-国外"); } }
package com.cyjt97.order;
import java.util.Scanner;
public class orderSystem {
// 同一个行为具有多个不同表现形式或形态的能力
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入:1国内订单,2国外订单");
int choice = sc.nextInt();
order order = null;
switch (choice) {
case 1:
// 创建对象的时候,左右两边类型不一致,是所有对象都可以这样创建吗?
// 得有前提条件:父类引用指向子类条件,或者接口类引用指向实现类引用
order = new orderInterface();
break;
case 2:
order = new foreignOrders();
break;
}
// 为什么调用的方法是同一套方法,却有不同的表现形式?
// 给他不同的子类对象,走的是不同的内容
order.create();
order.single();
order.Multiple();
order.cancel();
order.end();
order.pay();
}
}
对象多态和行为多态:
package com.cyjt97.polymorphic; public class polymorphic { /* 多态的前提: 有继承/实现关系 有方法重写 有父类引用子类对象 1对象多态: animal a = new cat(); animal b = new dog(); 好处:方法的形参定义为父类类型,这个方法就可以接收到父类任意子类对象了 */ public static void main(String[] args) { // 对象多态 animal a = new cat(); animal b = new dog(); // 行为多态 useAnimal(new dog()); useAnimal(new cat()); } // 行为多态 public static void useAnimal(animal a) { a.eat(); } } abstract class animal { public abstract void eat(); } class cat extends animal { @Override public void eat() { System.out.println("猫吃鱼"); } } class dog extends animal { @Override public void eat() { System.out.println("狗吃骨头"); } }
多态成员的访问特点:
package com.cyjt97.polymorphic;
public class polymorphic2 {
// 多态的成员访问特点:
// 1.成员变量:编译看左边(父类),运行看左边〔父类)
// 2.成员方法:编译看左边(父类),运行看右边〔子类)
// 在编译的时候,会检查父类中有没有这个方法
// 没有:编译出错
// 有:编译通过,但是运行的时候,一定会执行子类的方法逻辑
// 原因:担心你调用的方法,在父类中是一个抽象方法
// 多态创建对象,调用静态成员:
// 静态的成员,推荐类名进行调用
// 细节:静态的成员,可以使用对象名调用,但这是一种假象
// -改成字节码文件后,会自动将对象名调用,改成类名调用
// 好处:提高程序的扩展性
// 弊端:不能使用子类特有的成员
public static void main(String[] args) {
// 编译看左边(父类),运行看左边〔父类)
fu f = new zi();
System.out.println(f.num);
f.show();
// 多态创建对象,调用静态成员
// 静态的成员,可以使用对象名调用,但这是一种假象
f.pink();
// 编译看左边(父类),运行看右边〔子类)
InterMpl i = new InterMpl();
i.method();
}
}
interface Inter {
// 编译通过,但是运行的时候,一定会执行子类的方法逻辑
// 担心你调用的方法,在父类中是一个抽象方法
void method();
}
class InterMpl implements Inter {
@Override
public void method() {
System.out.println("+11111111");
}
}
class fu {
int num = 10;
public void show() {
System.out.println("fu");
}
public void pink() {
System.out.println("pink_fu");
}
}
class zi extends fu {
int num = 20;
@Override
public void show() {
System.out.println("zi");
}
public void pink() {
System.out.println("pink_zi");
}
}
package com.cyjt97.order; public interface order { // 创建订单 void create(); // 查单个订单 void single(); //查多个订单 void Multiple(); // 取消订单 void cancel(); // 完结订单 void end(); // 支付订单 void pay(); }
package com.cyjt97.order; public class foreignOrders implements order{ // 创建订单 @Override public void create() { System.out.println("创建订单-国外"); } // 查单个订单 @Override public void single() { System.out.println("查单个订单-国外"); } //查多个订单 @Override public void Multiple() { System.out.println("查多个订单-国外"); } // 取消订单 @Override public void cancel() { System.out.println("取消订单-国外"); } // 完结订单 @Override public void end() { System.out.println("完结订单-国外"); } // 支付订单 @Override public void pay() { System.out.println("支付订单-国外"); } }
package com.cyjt97.order; public class orderInterface implements order { public void check() { System.out.println("选择"); } // 创建订单 @Override public void create() { System.out.println("创建订单"); } // 查单个订单 @Override public void single() { System.out.println("查单个订单"); } //查多个订单 @Override public void Multiple() { System.out.println("查多个订单"); } // 取消订单 @Override public void cancel() { System.out.println("取消订单"); } // 完结订单 @Override public void end() { System.out.println("完结订单"); } // 支付订单 @Override public void pay() { System.out.println("支付订单"); } }
package com.cyjt97.order; import java.util.Scanner; public class orderSystem { // 同一个行为具有多个不同表现形式或形态的能力 public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入:1国内订单,2国外订单"); int choice = sc.nextInt(); order order = null; switch (choice) { case 1: // 创建对象的时候,左右两边类型不一致,是所有对象都可以这样创建吗? // 得有前提条件:父类引用指向子类条件,或者接口类引用指向实现类引用 order = new orderInterface(); break; case 2: order = new foreignOrders(); break; } // 为什么调用的方法是同一套方法,却有不同的表现形式? // 给他不同的子类对象,走的是不同的内容 // 向下转型 // ClassCastException:类型转换异常 // 在引用数据类型中,[实际类型]和[目标类型]不匹配,就会出现该异常,所以就需要做判断 // instanceof判断左边的引用是否是右边的的数据类型 if (order instanceof orderInterface) { orderInterface ort = (orderInterface) order; ort.check(); } order.create(); order.single(); order.Multiple(); order.cancel(); order.end(); order.pay(); } }
支付系统案例:
package com.cyjt97.Paymentsystem; public interface pay { void money(double money); }
package com.cyjt97.Paymentsystem; public class bankCard implements pay{ @Override public void money(double money) { System.out.println("已用银行卡支付"+money); } }
package com.cyjt97.Paymentsystem; public class onlineBanking implements pay{ @Override public void money(double money) { System.out.println("已用网银支付"+money); } }
package com.cyjt97.Paymentsystem; public class platform implements pay{ @Override public void money(double money) { System.out.println("已用支付平台支付"+money); } }
package com.cyjt97.Paymentsystem; import java.util.Scanner; public class payment { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请选择您的支付平台:1,支付平台 2,银行卡支付 3,网银支付"); int check = sc.nextInt(); pay pay = null; switch (check){ case 1: pay =new platform(); break; case 2: pay =new bankCard(); break; case 3: pay =new onlineBanking(); break; } System.out.println("请输入您的支付金额"); double money = sc.nextDouble(); pay.money(money); } }
代码改变了我们,也改变了世界