牙叔教程 简单易懂
重载overload
它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。
参数不同
- 参数个数不同
- 参数类型不同
做重载实验
类名: OverLoading
三个max方法
package com.yashu; public class OverLoading { public Object max(int a, int b) { // 含有两个int类型参数的方法 return String.valueOf(a > b ? a : b) + " : max(int a, int b)"; } public Object max(double a, double b) { // 含有两个double类型参数的方法 return String.valueOf(a > b ? a : b) + " : max(double a, double b)"; } public Object max(double a, double b, int c) { // 含有两个double类型参数和一个int类型参数的方法 double max = (double) (a > b ? a : b); double result = (double) (c > max ? c : max); return String.valueOf(result) + " : max(double a, double b, int c)"; } public static void main(String[] args) { OverLoading ol = new OverLoading(); System.out.println("1 与 5 比较,较大的是:"); System.out.println(ol.max(1, 5));; System.out.println("5.205 与 5.8 比较,较大的是:"); System.out.println(ol.max(5.205, 5.8)); System.out.println("2.15、0.05、58 中,较大的是:"); System.out.println(ol.max(2.15, 0.05, 58)); } }
autojs代码
runtime.loadJar("./overloadTest.jar"); importClass(com.yashu.OverLoading); let overLoading = new OverLoading(); let r = overLoading.max(1, 2); log(r); sleep(100); r = overLoading.max(1, 2, 3); log(r); sleep(100); r = overLoading["max(int,int)"](1, 2); log(r);
autojs运行日志
2.0 : max(double a, double b) 3.0 : max(double a, double b, int c) 2 : max(int a, int b)
可以看到, 默认两个参数调用方法 max(double a, double b),
除非加上参数类型: overLoading["max(int,int)"]
JavaAdapter
我认为他是一个代理
let overLoading2 = JavaAdapter(com.yashu.OverLoading, { max: function (a, b) { return a + b; }, }); r = overLoading2.max(1, 2); log(r); sleep(100); r = overLoading2.max(1, 2, 3); log(r); sleep(100); r = overLoading2["max(double,double)"](1, 2); log(r);
运行日志
3 3 3
max方法, 没有调用任何OverLoading的max方法, 因为他没有打印参数类型,
我写的OverLoading类里面, 如果调用了max, 必定会打印参数类型
调用类的实例的方法
实例化类, 调用实例的方法
let overLoading3 = new OverLoading(); let overLoading2 = JavaAdapter(com.yashu.OverLoading, { max: function () { let args = Array.from(arguments); if (args.length == 2) { return overLoading3.max(args[0], args[1]); } else if (args.length == 3) { return overLoading3.max(args[0], args[1], args[2]); } }, }); r = overLoading2.max(1, 2); log(r); sleep(100); r = overLoading2.max(1, 2, 3); log(r); // 日志 // 2.0 : max(double a, double b) // 3.0 : max(double a, double b, int c)
一个参数不行
let overLoading2 = JavaAdapter(com.yashu.OverLoading, { max: function (a) { return "牙叔教程"; }, }); r = overLoading2.max(1); log(r); // Can't find method adapter1.max(number).
四个参数不行
let overLoading2 = JavaAdapter(com.yashu.OverLoading, { max: function (a, b, c, d) { return "牙叔教程"; }, }); r = overLoading2.max(1, 2, 3, 4); log(r); // Can't find method adapter1.max(number,number,number,number)
因为原始的类里面的参数是2个或者3个,
JavaAdapter要重写max方法, 也必须和原始类有同样的参数个数,
不能多, 也不能少
js对象使用java类的静态方法
function Test() { this.hello = function () { for (var i in this) { log(i); } }; } Test.prototype = OverLoading; var testInstance = new Test(); testInstance.hello(); testInstance.main(["牙叔教程"]);
js对象使用java实例的方法
function Test() { this.hello = function () { for (var i in this) { log(i); } }; } let baseInstance = new OverLoading(); Test.prototype = baseInstance; var testInstance = new Test(); testInstance.hello(); r = testInstance.max(1, 2); log(r); testInstance.main(["牙叔教程"]);
总结
重载是不可能的, 这辈子都不可能重载,
参数又不支持类型,
就是判断参数个数这种东西, 才能维持的了生活这样子,
用了prototype感觉就像回家一样,
类方法个个都能用,操作又方便,我超喜欢酱紫!
测试环境
手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.13
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途