近日学完面向对象的知识点总结 2021-04-30

近日学完面向对象的知识点总结

面向对象的学习主要包括类的属性和方法、内存分析、静态变量、创建对象、封装、重载、抽象类、接口、继承、多态、重写、实现、包装类等内容。
一、基础
1.从面向过程到面向对象无疑是在处理问题的思想本质上发生改变,面向对象更注重对象本身,把有相同属性和方法的对象封装成一个类,便于创建对象时能够重复使用。属性与平时定义变量无太多区别,而方法则类似函数,这里可以有返回值,也可以没有返回值,有返回值的方法内部,return行代码为方法的结束,在return后面的代码将不执行。在创建类的时候已经把需要的东西都定义好了,用的时候把类给new一下就出来一个实例了,大大方便了代码的阅览,更便于修改和维护。

2.由于内存结构的关系,对象名存储在栈,而对象储存在堆并把地址赋予回给栈中的对象名,每当访问对象时,根据对象名引用的地址找到并且访问该对象存储在堆的数据。当堆中的对象没有被引用时被视为内存垃圾,Java的垃圾自动回收系统GC就会自动释放该部分的内存。

3.构造方法与类名完全一致,可以有参也可以无参,当类中无编写构造方法时,Java将自动生成无参无任何代码的构造方法全参通过构造方法把属性一次性把数据加载到内存,而不用逐个赋值。在编写类时,同时写入无参和全参的构造方法,便于后续修改和维护。

4.同一个类中相同的方法名完全相同时成为重载,其参数列表中数据类型、个数和顺序可以不相同,而于返回值无关。调用时会通过比较和查找是否存在符合的方法,不再局限于在输入时指定一种数据类型,重载的好处在于在类使用时更灵活。

5.在创建对象时,当且仅当使用一次的对象,可以使用匿名对象的定义格式去定义,该对象用完即弃,不会被保存下来。

二、进阶
1.封装类,通过加权限修饰符private把成员属性隐藏在类的内部,外部不可以直接访问,若外部想要修改和获取必须通过setter和getter两个方法进行操作,并在setter方法中对传入数据进行判断,多一条是否满足预设的条件的关卡,免除程序出现逻辑错误。在setter方法里面出现了this关键字,这个this关键字等价于当前正在调用对象名,比如this.age = age,避开了属性和方法形参重名的问题,从而可以把参数传入到属性。另外this关键字还可以用于类中构造方法的调用,但是需要注意的是this.被调用的构造方法();必须写另一构造方法的第一行,否则报错。

2.静态修饰符,用于修饰成员变量和成员方法,被修饰过的变量和方法独立于对象中的作用域变量和方法,当类被加载时,静态成员随着类的加载已经被加载到方法区(无论有无实例,只要类被加载,静态成员就会被加载,加载次数与类相同,有且只有一次),类加载结束后,如有新的对象,先会加载对象名到栈,再到堆开辟新的内存空间,把所在地址赋予给栈中的对象名,对象创建完成。由于静态变量储存在方法区,所有对象都可以调用该静态变量,而反过来则不允许,原因在于非静态变量在新的对象出现之后才会有,静态变量是不可以也没有这些变量去调用。静态变量好处在于可以通过把一组对象中相同的属性提取出来,只需要存储一份数据即可满足与对象资源共享,以达到节省内存的目的。

3.包的意义在于把相似或者功能相关的类整合到一起,作用类似文件夹把文件分门别类,便于调用和查找。在实际应用中难免类名存在重复,此时需要在类名前面加上包名加以区分,避免发生冲突。是否能导入包还需要看该包中类的权限是否公开,公开的类才能够被导入使用,此处权限修饰符修饰的类作用范围:public > protect > default > private。在程序编写时,使用的类加上包名之后的全称,此时作用等价于导包,而除了当前使用的包和java.lang以外的包都必须要进行导包操作才可以进行使用。另外,给包命名也应该注意包名多个单词要全小写,并且在代码源.java文件的首行写入包名,命名格式为packet com.公司名.项目名.模块名,此处公司名为互联网域名(保证唯一性)。

4.代码块分为普通代码块、构造代码块、静态代码块和同步代码块。由一对大括号框住的一段代码称为代码块,区别在于出现的位置不同,普通代码块在流程结构中出现;构造代码块则在类当中出现,格式与功能跟构造方法极其相似,但优先于构造方法执行,每创建对象一次构造代码块执行一次;静态代码块存在于类,编写方法仅仅比构造代码块多一个static静态修饰符,当类加载时静态代码块执行一次,和构造代码块的关系与静态变量和成员变量的关系极其相似,故此有加载时机:静态代码块 > 构造代码块 > 构造方法。与普通的方法相似,即使main作为系统指定的入口,其使用方法和修饰符和普通类中能够接收字符串和无返回值的方法无较大的差异。

三、高阶
1.面向对象的三大特性:封装、继承、多态。封装就是把类的属性和方法按需要设置为私有,即外部不可直接访问和修改,但可以提供get和set方法给外部传入和访问数据。继承就是不同的类,一个或多个类继承另外一个类的所有属性和方法,分别叫做子类和父类,子类并可以对父类的所有方法进行调用和重写,类的继承允许单继承和多重继承,但不允许多继承,当在子类创建对象时,会在堆中创建一个父类的对象再创建子类对象,并把父类对象的地址赋予给子类对象.super属性当中,仅在父类设置权限为public和protected可以被子类继承。多态就是对象和调用的方法呈现的多种型态。

2.多态可分为对象多态性和方法多态性,对象多态性是指子类对象继承了父类对象,不同的子类创建各种各样的对象呈现了多种形态,方法多态性包含方法的重载和重写,重载是同一个类中,方法名称、返回值相同,参数列表、长度、数量不同,使用时任由对象选择传入一种与重载方法中的几种参数相同格式之一的数据,重写则是子类在继承父类的时候对父类已经定义好的方法或无方法体的抽象方法进行重新编写并覆盖父类原有的方法,重写的方法必须与父类的方法名称、参数列表、返回值完全一致才能实现重写,在此条件基础上还需要与父类权限相同或比父类权限更高和出现异常范围更小或相同且不能出现新的异常(即要求更加严格)。

3.在普通类定义的基础上,又扩充多两种类型:抽象类和接口。抽象类跟普通类比较类似,两者区别在于抽象类存在抽象方法,即有方法未有方法体,因为存在抽象方法不能够直接创建对象,需要子类继承重写抽象方法去实现,如子类未能完全实现抽象方法,该子类也为抽象类,而完全实现则为普通可以实例化的类。与抽象类相比,接口更加抽象,接口中的方法必须全部为抽象方法且不能为静态,而全部属性为常量,支持多继承,即一个子(类、接口)可以继承多个父接口,实现方法的操作与继承抽象类相同。

4.包装类,把基本数据类型封装成类,由于Object是所有类的基类,此操作便于继承Object的方法对数据进行处理,也可以看作Object对象进行传输,在jdk1.4及之前版本需要手动装箱和拆箱(包装类的实例化对象和基本数据类型的数据之间不能直接转化)。此外instanceof关键字可用于判断实例化对象是否某个类的实例,返回值为boolean类型。此外,在jdk1.5及之后的版本,加入了可变参数,提高了仅参数个数不同的重载方法代码的复用率,只要编写方法时把传入参数的位置设置为可变参数(需要放到最后面),在方法的调用时,可以传入任意个数的参数,并且把这些传入的参数存储为数组。

5.API,是程序预设好的类与方法的集合,其中Object类最常用(重写)的方法包括toString和equals,toString方法返回String文本类型,可以根据需要重写,使其返回对象的详细信息,equals则对比两个对象是否相同,在继承时需要对equals进行重写,设置需要的匹配条件,也应该遵循5个特性:自反性、对称性、传递性、一致性和非空性。

6.递归,方法间或方法自身的调用,当被调用方法返回后原方法才能进行下一步操作,否则陷入死循环就会导致内存占用过多而溢出。

四、总结和感悟
学习面向对象需要在思想上做出改变,不应该把注意力放在整个流程而应该放在整个架构,在每一个类的编写过程中确保功能是完整的,尽可能避免用户输入数字导致的错误。需要放更多关注在类、方法和对象当中,了解程序在执行过程的内存分析,什么是堆、栈、方法区,什么时候哪些数据存储在哪里,经过操作之后哪些数据变成了什么。此外,与Java基础相比,面向对象存在更多的关键字和内部定义的方法,需要多加运用才能够把这些内容深刻的印在脑海。
学习完面向对象之后,成长不仅仅是在写代码时,更加在生活的方方面面,主要体现处理复杂任务时思维方法的提升,处理事情的时候把复杂的问题分门别类,把任务拆分成若干个子任务,哪些是可以自己解决的哪些需要请求他人解决,哪些操作是需要等待别的任务完成后才能完成的,有了一个总体的框架才去系统的部署和推进任务,总体来说是减少了不必要的时间等资源浪费,使得效率有所提高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值