Class类三种函数的区别:普通函数、get函数、 静态函数

Class类三种函数的区别:

  • 1. 普通函数(如示例代码的 方式一)
    可以传参,函数内可以用this关键字获取实例属性,需要通过实例对象调用 (如u.getUserName(obj))
  • 2. get函数(如示例代码的 方式二)
    不能传参,函数内可以用this关键字获取实例属性,需要通过实例对象调用 (如u.userImg)
    注意:调用函数时不需要加括号()
  • 3. 静态(static)函数(如示例代码的 方式三)
    可以传参,函数内this关键字指向类(即 User),因此不能用this关键字获取实例的属性
    需要通过类名直接调用 (如User.getUserType(obj, 1))
    注意:
    • (1)通过类名直接调用,不能通过实例对象调用
    • (2)静态函数中的this指向类(即 User),this只能调用静态方法和静态属性

实例方法与静态方法的区别与选择:

  • 实例方法(如方式一 和 方式二)
    实例方法属于实例的行为,偏面向对象编程,复用性、灵活性较高,可以处理各种复杂的业务
    get函数更能体现面向对象的思想,当遇到不需要传参的业务逻辑时,推荐使用get函数
  • 静态方法(如方式三)
    静态方法属于类的行为,偏面向过程编程(非面向对象),不太具有复用性,需要传入大量的参数
    一般用于偏简单的业务逻辑
class User {
  constructor(id, type) {
    this.id = id;
    this.type = type;
  }

  // 方式一: 普通函数
  getUserName(user) { // 可以传参
    // 可以使用 this 关键字获取实例对象的属性
    if (this.id === user.id) {
      return user.name;
    }
    return null;
  }

  // 方式二: get 函数
  get userImg() { // 不能传参
    const user = {
      id: 1,
      img: 'xxx.img',
      type: 'normal'
    }
    // 可以使用 this 关键字获取实例对象的属性
    if (this.id === user.id) {
      return user.img;
    }
    return null;
  }

  // 方式三: 静态(static)函数
  static getUserType(user, id) { // 可以传参
    // 静态函数中的 this 对象代表类本身(即 User)
    // 此时 this 只能获取类(即 User)中的静态方法和静态属性
    // 因此不能可以使用 this 关键字获取实例对象的属性
    // console.log(this);
    if (user.id === id) {
      return user.type;
    }
    return null;
  }
}

// 调用
const u = new User(1, 'personal');
const obj = { id: 1, name:'Jack', type: 'normal' };

// 调用方式一: 通过实例对象调用
const uName = u.getUserName(obj);
console.log('uName:', uName);

// 调用方式二: 通过实例对象调用,调用时不需要加括号()
const uImg = u.userImg;
console.log('uImg:', uImg);

// 调用方式三: 通过类名直接调用
const uType = User.getUserType(obj, 1);
console.log('uType:', uType);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于Java中的构造函数,我们不能像普通方法一样直接使用Clone方法进行克隆,因为构造函数是在创建对象时自动调用的。但是,我们可以使用Javassist库来实现静态构造函数的克隆。 Javassist是一个用于在运行时修改字节码的Java库。我们可以使用Javassist创建一个新的,并将原始的所有方法和字段复制到新中。然后,我们可以在新中修改构造函数的实现,以实现克隆。 以下是一个示例代码,演示如何使用Javassist创建静态构造函数的克隆: ``` import javassist.*; public class ConstructorClone { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass origClass = pool.get("com.example.OriginalClass"); CtClass newClass = pool.makeClass("com.example.NewClass"); // Copy all fields and methods from original class to new class newClass.setSuperclass(origClass); CtField[] fields = origClass.getDeclaredFields(); for (CtField field : fields) { newClass.addField(field); } CtMethod[] methods = origClass.getDeclaredMethods(); for (CtMethod method : methods) { newClass.addMethod(method); } // Clone constructor CtConstructor origConstructor = origClass.getDeclaredConstructor(new CtClass[]{}); CtConstructor newConstructor = CtNewConstructor.copy(origConstructor, newClass, null); newClass.addConstructor(newConstructor); // Modify constructor implementation newConstructor.setBody("{ super(); }"); // Create instance of new class Object newObject = newClass.toClass().newInstance(); } } ``` 在上面的代码中,我们首先获取了原始的CtClass对象,并创建了一个新的CtClass对象。然后,我们将原始的所有字段和方法复制到新中。接下来,我们使用CtNewConstructor.copy方法克隆原始的构造函数,并将其添加到新中。最后,我们修改新构造函数的实现,以调用原始构造函数并执行其他操作。 请注意,这只是一个示例代码,实际应用中可能需要更复杂的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值