说到面向对象这个话题,以前没少晕头转向。再没写java 之前,写过Pyhon ,写过Go ,写过PHP ,都没了解精髓。当然,主要是很多项目都是浅尝辄止,导致不深入。写了java 后,看了构造函数后,再理解面向对象,就比较清晰了,对比着看go 语言,发现也更清晰的能理解指针了。
go 语言没有Class的概念,只有struct和interface概念。 结构体里存放都是指定的数据的结构。其实跟java里的类的一个概念了。对比这看看吧。
需求:
一个功能函数,这个函数要用到特定类型的一个对象。 然后对这个对象进行处理。
go语言面向对象
先实现一个封装此对象的结构体
//写一个结构体
type IntCompareTest struct {
val int
}
写这个函数,来调用结构体的数据类型。
func (a IntCompareTest) compare(b int) bool {
return a.val > b
}
在这个compare函数里,在函数名前面写了变量a IntCompareTest,有这么几点讲究:
- 表示引入了一个 IntCompareTest 类型的变量 a。因为不是指针类型,所以引入的a的值,在函数内部计算时不能进行修改。
2.表示是个面向对象的变量,也就是如果变量在函数的前面,这个compare函数也就是相当于是IntCompareTest 结构体的方法。实例化结构体后,可以被调用。
第一句话好理解,第二句话怎么理解?我们看下执行调用的方法。
//结构体
type IntCompareTest struct {
val int
}
//实现函数
func (a IntCompareTest) compare(b int) bool {
return a.val > b
}
func main() {
//这里就是实例化结构体了。在Java里叫构造函数传值
m := IntCompareTest{9}
//实例化后。m 这个对象就有了compare的方法。
fmt.Printf("%v", m.compare(9))
}
Java语言面向对象
Java要是实现一个类并调用类的方法是如何做的呢,相对于来说,Java 更好理解了。
public class CompareTest {
private int a;
//构造方法,用于往函数里传值
public compareTest(int a){
this.a = a;
}
// 类方法
public boolean compare(int b){
return this.a > b;
}
}
调用方法,先new 一个这个类。通过构造方法,传入一个实例变量值。然后,再调用这个类的compare 方法。
public class TestCompare {
public static void main(String[] args) {
CompareTest one = new CompareTest(10);
System.out.println("nem" +one.compare(9));
}
}
Python语言面向对象
在Python 中,对于类的关键字跟Jave 就有点相似了。
但是Python的一种弱类型语言,所以传入的对象类型,就交由函数本身来判断。
Python里也有“构造函数” 就是def init(self, a, b) 了,这里可以传入参数,就能被类对象所识别,哪怕类里没有初始化的这个参数。但是有一点不像Java。
例如例子中的 a 参数,在TestLoader 没有初始化。 也能被类方法compare所调用。
class TestLoader(object): # 这里的 (object) 可以为空。
b = 10
def __init__(self, a, b):
self.a = a
self.b +=1
def compare(self, c):
print(self.b)
return self.a > c
if __name__ == '__main__':
t= TestLoader(10,0)
t.compare(10)
好的,今天基于golang、java、 Python的面向对象的浅析就先写这么多。后面再研究新的体会。
网友评论