autojs类方法重载overload

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


重载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文档, 最后才是群里问问 --- 牙叔教程

声明

部分内容来自网络 本教程仅用于学习, 禁止用于其他用途


相关文章
|
18天前
|
Java
方法重载和方法重写有什么区别?
本文解释了Java中方法重载(Method Overloading)和方法重写(Method Overriding)的区别,包括它们的定义位置、参数要求、返回值要求、业务功能以及绑定方式的不同,并提供了示例代码。
21 2
方法重载和方法重写有什么区别?
|
4月前
|
Kotlin
Kotlin类的定义、构造函数、封装、继承和多态
Kotlin类的定义、构造函数、封装、继承和多态
|
5月前
|
Java
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
70 0
|
Java 编译器
【JavaSE】重载和重写
【JavaSE】重载和重写
|
存储 Java C#
【c#入门杂选】重载,继承,委托
【c#入门杂选】重载,继承,委托
105 0
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
533 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
|
Java 编译器
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
145 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
|
Java 程序员 C++
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
202 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
|
Java 编译器 数据库
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)
104 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)
|
Kotlin
【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )
【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )
201 0