哈工大软件构造之OOP难点学习心得

目录

1.静态变量与实例变量/类的方法

2.重写和重载 

3.结语


1.静态变量与实例变量/类的方法

         PPT中称类成员变量为与类关联的变量,而不是与类的实例关联的变量。而不是类方法或类变量的方法和变量称为实例方法和实例变量。听起来比较晦涩(毕竟是英文翻译出来的),用白话说,不与实例关联就是静态变量,剩下的就是实例变量。同理,实例方法就是不用static修饰的方法。

        静态方法不与类的任何特定实例相关联,而实例方法(声明时没有Static关键字)必须在特定对象上调用。说的通俗点,静态方法可以直接调用,像Math.abs()这种就属于静态方法;而反之实例方法就必须创建对象才能用,即与实例相关联,像s.length()这种就属于实例方法,不能直接调用。

        除此之外,静态方法和实例方法在内存中加载的方式也是不同的,每调用一次实例方法就会分配一次空间,而静态方法是一次就分好,不会再分配给它额外的stack。如下图所示:

2.重写和重载 

        重写父类方法不能改变方法的原意,不能改写方法的声明(返回值类型、参数、函数名),简单来说就是只能改大括号里边的东西。而重载指多个方法具有同样的名字,但有不同的参数列表或返回值类型;注意,重载虽说可以改变返回值类型,但是实际上重载只看是否改变了参数列表(包括参数数量、参数类型、参数类型顺序),而不是看是否改变了返回值类型。举一个简单的例子,有一个方法返回void,如果重载只改变了返回值类型,而参数列表没有改变的话,在调用这个方法的时候,你完全可以不使用返回值,这样机器就不知道你调用的是返回void的方法还是重载返回具体类型的方法。

        重写和重载的难点是和多态分不开的。如果多态和重写/重载同时出现,编译和运行所看的地方是不一样的。对重写的方法来说,有一个口诀叫“编译看左边,运行看右边”,即编译的时候看的是左边声明的类型有没有相应的方法,而运行的时候运行的是实际类型(右边类型)的方法。例如:

Animal dog = new Dog();
dog.eat();

        其中Animal是Dog的父类,Dog重写了Animal的eat方法,编译时就会看左边Animal类型有没有eat方法,如果有才不会报错;运行时实际运行的是Dog中重写的eat方法。

        重载在上面例子中类似,所以如下例子中,:

箭头所指处会报错,因为在Animal中并没有相应的重载方法,在这种情况下也是符合“编译看左边”的规则。但是在如下例子中:

        说明要调用的方法的哪个重写版本是在运行时根据对象类型决定的,但要调用的方法的哪个重载版本是基于编译时传递的参数的引用类型。这个时候重载调用哪个方法就是看左边了,所以可以说“运行看左边”。

3.结语

        以上是个人在复习OOP时感觉较难理解和容易产生困惑的地方,经过查阅资料和讨论总结而出,并未覆盖全部OOP内容,请谅解。希望能对你理解OOP产生帮助,也欢迎一起探讨。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值