本节的两个疑问

来源:3-5 函数

慕莱坞0998854

2022-11-20

老师您好,借用视频里面的代码:

class Foo {
  fun bar(p0: String, p1: Long): Any {
    TODO()
  }
}

请解释一下,如下的代码为什么会报错:

val h : (Foo,String,Long) -> Any = Foo()::bar

问题2> 老师在另一个解答中提到,
“类的函数(或者 Java 当中的方法)的调用必须通过类的实例去调用” 我对这句话有些不理解,为什么一定需要有一个实例呢?在js中,我们可以通过Foo.prototype.bar() 来调用函数,为什么Java没有Foo.bar()呢?为什么不能用类.method()的方式?为什么一定是实例.method()的方式?

写回答

4回答

qq_忘记

2023-01-15

//img.mukewang.com/szimg/63c3fe3f098a587e04210096.jpg

第一个问题你变量类型去掉,然后IDEA就会显示出变量类型,再根据视频12分钟的时候讲解的,报错就是因为类型不一致而已。

第二个问题prototype给我的感觉有点类似于groovy闭包的delegate,它是可以被修改的。我的理解就是prototype就像找张三做事,但这事儿实际上有可能是张三做的,有可能是李四做的甚至王五做的。实例调用函数就像我问张三想吃啥,只有问他的时候才知道,提前问或者问别人都不知道,实例化的时候才分配内存。静态方法就像不管张三李四还是王五,不管啥时候问,都知道他们的名字是两个字,因为自从JVM装载的时候,他们就分配了内存。

不知道这理解对吗?
0
0

bennyhuo

2022-11-22

不用太较真,记住就行了。
0
0

bennyhuo

2022-11-22

这就是语法设计上的差异,js不是严格意义上的oo语言,跟Java这种在设计上差异还是很大的。
0
0

bennyhuo

2022-11-20

js当中的函数都是独立的函数,你可以给他绑一个对象,也可以不绑。java当中定义在类里面的非静态函数不是独立的,必须使用实例调用,不然就破坏了语言的设计。Java当中函数或者方法的调用能够很明确的知道this是谁,js能吗?不能吧,因为调用出没有限制。
0
3
bennyhuo
2. Java静态方法不需要实例,但实际上也是依赖于类本身的。从语法形式上,至少有作用域的限制。
2022-11-22
共3条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程