先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:xhs1999xhs (备注Java)
正文
文章目录
🚩前言
上节介绍到了类与对象的一些基本概念,今天主要分享一下类的实操。如何把一个类中的方法作为属性使用?如何把类变为一个迭代器,然后把生成的对象当列表一样被for循环进行迭代?如何实现将一个方法或者函数每次运行的环境保存下来? |
➰类中的装饰器
💓基本概念
在函数学习的时候已经接触过了装饰器这个概念,今天再来重新提一下,装饰器可以为函提供一个最初的运行环境,在调用你写的函数之前,往往会先调用函数上方的装饰器,一个函数可以拥有多个装饰器。一般的用法如下: |
import time
#装饰器函数
def timeit(func):
def wrapper(\*s):
start=time.perf_counter()
func(\*s)
end=time.perf_counter()
print('运行时间:',end-start)
return wrapper
#函数使用装饰器
@timeit
def mysum(n):
sum=0
for i in range(n):sum+=i
print(sum)
#调用函数
mysum(10)
类中方法的装饰器有很多,只不过功能与函数有些不同,方法中的装饰器主要是为了限定方法的某些功能或者限定方法的类别。例如我们上节提到的@staticmethod 、@classmethod 。今天着重介绍的是@property 装饰器,他的作用可以让某些方法当做属性一样进行访问。默认的话只提供一个只读的权限,可以人为实现@getter``@setter``@deleter |
property装饰器原型:proper(fget=None,fset=None,fdel=None,doc=None) |
💓实现方式
Python中的实现可以将某些方法当做属性一样来访问、修改、删除已达到对某些属性的更好的封装。 |
第一种
class PTest1:
def \_\_init\_\_(self,name):
self.__name=name
@property
def getname(self):
return self.__name
p=PTest1("xiaolan")
print(p.getname)
第二种
class PTest1:
def \_\_init\_\_(self,name):
self.__name=name
@property
def opname(self):
return self.__name
@opname.setter
def opname(self,value):
self.__name=value
@opname.deleter
def opname(self):
self.__name=""
p=PTest1("xiaolan")
print(p.opname)
p.opname="123"
print(p.opname)
del p.opname
print(p.opname)
第三种
class PTestX:
def \_\_init\_\_(self,name):
self.__myname=name
def getname(self):
return self.__myname
def setname(self,v):
self.__myname=v
def delname(self):
self.__myname=""
name=property(getname,setname,delname,"404 NotFond")
p=PTestX("xiaolan")
print(p.name)
p.name="123"
print(p.name)
del p.name
print(p.name)
➰类与迭代器的无缝衔接
💓基本概念
迭代器可以使用next()函数依次获取该迭代器内的下一个值,迭代器可以使程序更通用、优雅、高效、更具有Python编码风格。普通对象可以通过实现__iter__()与__next__()两个方法,使得对象变为可迭代对象,可以通过循环进行迭代。如果类只实现了__iter__()方法,该类生成的对象就变为了可迭代对象,只不过运行的时候会报TypeError: iter() returned non-iterator of type '**' 如果只实现__next__()方法那么程序会报TypeError: '**' object is not iterable 所以只有将类的两个方法都实现了,对象才会变为能够迭代的对象。__iter__()与__next__()方法又称为迭代器协议。 |
💓实现方式
将两方法实现一下,然后方法iter中返回对象本身,next返回你要返回的下一个值。 |
测试可迭代对象是否可迭代
import collections.abc
class ITClass:
def \_\_init\_\_(self,name):
self.__name=name
self.a=1
# 以下二者合称为迭代器协议
def \_\_iter1\_\_(self):
return self
def \_\_next\_\_(self):
self.a+=1
return self.a
i1=ITClass("小黄")
# 测试对象是否可迭代
print(isinstance(i1,collections.abc.Iterable))
print(isinstance(ITClass,collections.abc.Iterable))
print(isinstance([1,2,3],collections.abc.Iterable))
# 测试对象是不是迭代器
print(isinstance(i1,collections.abc.Iterator))
print(isinstance(ITClass,collections.abc.Iterator))
print(isinstance((i for i in range(100)),collections.abc.Iterator))
# 只有i1对象的isinstance的两项结果都为True的时候才可以无限循环迭代。
for i in i1:
print("Hello")
使用迭代器实现斐波那契数列
class fib:
def \_\_init\_\_(self,nums):
self.nums=nums
self.a,self.b=0,1
self.i=0
def \_\_iter\_\_(self):
return self
def \_\_next\_\_(self):
self.i+=1
# 达到终止条件就抛出异常来终止否则会一直迭代下去
if self.i>self.nums:
raise StopIteration
self.a,self.b=self.a+self.b,self.a
return self.a
f=fib(100)
for i in f:
print(i)
反向迭代器的实现
反向迭代器
实现了__reversed__方法的可迭代对象,可以使用reversed()反向迭代可迭代对象。
自己实现range可迭代对象
class Range:
def \_\_init\_\_(self,startnums,endnums):
self.endi=endnums
self.a,self.b=0,1
self.starti=startnums
def \_\_iter\_\_(self):
while self.starti<=self.endi:
yield self.starti
self.starti+=1
def \_\_reversed\_\_(self):
while self.starti<=self.endi:
yield self.endi
self.endi-=1
f1=Range(10,20)
for i in f1:
print(i)
f2=reversed(Range(10,20))
for i in f2:
print(i)
💓手写一个range函数
可以传入起始数值、结尾数值。默认步长是1,也可以自己传入,支持正反向迭代。 |
class Range:
def \_\_init\_\_(self,startnums,endnums,dis=1):
self.endi=endnums
self.starti=startnums
self.dis=dis
def \_\_iter\_\_(self):
i=self.starti
j=self.endi
if self.starti<self.endi:
while i<=self.endi:
yield i
i+=self.dis
else:
while self.endi<=i:
yield i
i-=self.dis
f1=Range(10,30,2)
for i in f1:
print(i)
➰生成器
💓基本概念
在函数中如果使用yield语句代替return 语句返回一个值,则定义了一个生成器函数 生成器函数使用yield语句返回一个值,然后保存当前函数的整个执行状态等待下一次调用(下次调用还从上次返回的时候开始)。生成器函数是一个迭代器,是可迭代对象、支持迭代。我记得这种生成器在scrapy框架中有使用,大家先记住这种语法与如何操作的即可,实际应用咱们后来再补充。 |
💓实现方式
def gentripls(n):
for i in range(n):
yield i\*3
f=gentripls(10)
for i in f:
print(i)
# 生成器表达式
# 生成器表达式与列表推导式基本一样,只不过使用()代替了[]
ls=(1,2,3,4,5,6)
for i in ls:
print(i)
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
[外链图片转存中…(img-tL4MeJ0f-1713684590863)]
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)
[外链图片转存中…(img-eIq7A1I7-1713684590863)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!