- java基础的视频内容笔记都在这了
- 前言等字数非常长的章节,使用了AI语音识别成文字后修改的,有错漏欢迎提出
- 面对对象模块的按照自己的理解进行了内容修改,可以对比原视频内容理解,如有建议欢迎提出
前言
解决疑问
0基础可以学java吗?
可以,没学过编程的人就相当于一张白纸,有编程基础反而可能会束缚于一些观念
英语不好能学吗?
程序设计中用到的单词并不多,用多了就会了
理解慢能学好吗?
编程需要一定逻辑思维能力,但更多的是持续性学习,勤能补拙,一定要保持持续性学习!
现在学java晚吗?
python和go虽然比较新潮,但是市场上的岗位需求还是比不上java的,未来十年内java仍会是最受欢迎的编程语言之一,如果你想成为一名后端或者全栈工程师进入一些大公司发展,那么推荐你还是深入学习java
工资高、岗位多、生态成熟,你在各个领域都能看到java
学习建议
-
对于初学者而言一开始很容易被编程语言中的各种抽象概念吓到
-
比如常量、字符串、对象、注封、装继、多态…,虽然字你都认识但是就是搞不懂是干什么的
-
建议:不要过于关注某个概念的字面意思,这样很容易跑遍的
-
还有很多概念看英文名词很容理解,但是翻译成中文后就非常玄奥,这也是学习中一大问题!
- 如 套接字看着就很让人不理解,实际上英文就是Socket,在翻译过来就是插座的意思,表示的概念实际上就是 应用程序与网络协议栈进行交互的接口
-
-
还有很多人把抽象概念都搞懂了,但是不知道把他们写出来
-
还有的人想写出完整的程序,往往脑子里有思路,但是就是不知道怎么用代码体现出来
-
这些问题都很正常,编程并不是想讲话一样是任何人的交流,更像是任何动物的交流,两者的思维方式和行为习惯并不是完全相同的
-
从理解到熟练运用者之间还是有不少路要走的,没有说那个地方就速成了,一两个月就搞定了
-
就算你天天练,起码也要半年时间才能完全掌握吧,到熟练运用也要工作两三年,往上提升的话还要接触很多底层领域的东西,都是一步一步来的
-
学习java没有晚不晚的说法,更多的是看你对这条路是否坚定
-
java和python抉择
-
这个问题会引起争议,如果这个人是学python的并且混得还不错,那他肯定会告诉你python好,如果是学java而且混得好,那就会告诉你java好
-
当然还有很多键盘侠两个都没学过,他会告诉你所有语言都是相通的不要纠结
-
但是从我个人来说,我认为编程语言只有两种:Java和C体系、其他体系,但是我肯定不能通过这种偏激的方式误导大家
-
我们必须明白java和python的各自定位
-
java:1995年推出的,源自C/C++体系,专门给程序员设计大型的分布式复杂运用而设计的
-
python:1991年推出的,面向系统管理、科研教育等非程序员应用比较多的
-
不知道什么时候开始,传出了python简单java很难,人生苦短我用python这样的话
-
一方面python上手快一点,但仅此而已,在解决一个复杂性问题时,没人会考虑到底用什么语言,而是把精力放在算法思路上,这一点大家一定要清楚!
-
很多学程序的非常焦虑,认为自己是不是技术不够深啊,在企业中越来越没有竞争力了,所以最终还是要硬着头皮去研究更深入的技术,无论是编程、网络、数据库、协议、自动化测试、性能测试等等,这个过程是非常痛苦的,就像我说啊世界上百分之99的人都会选择好走的道路,因为懒惰因为恐惧,但是成功往往属于那1%上。
-
这句话同样适用在编程语言的基础功底训练上,如果你还在纠结到底是java好还是python好这件事,毫无疑问这个时候你还是一个新手,我可以说你连门都还没入
-
-
所以说,不要因为什么事情简单,所以我们才去做,无论是学习编程语言还是生活中还是人生中的其他事情上,然我们从单纯的事实出发
-
python简单的原因只是因为我们在使用python的时候,我们尽可能要去调用别人写好的代码/库/接口来用而已
-
java处理很多问题相对更原生态而已(C++更原生态),如果我们java也能写好一些代码封装好让别人去调用,这时候就很难说谁更简单了
-
而封装的过程才是编程中最重要的部分,如果这部分你都不愿意参与学习,就不知道它的实现原理,你怎么可能成为一个优秀的程序员,而且你让那些勤奋的人情何以堪。
-
要成为一个高级程序员,一定不是写写简单的应用而已,比如java源代码我们学习过程中就要不断去刨析它为什么这么写,里面涉及的数据结构是如何产生的,所以我们一定要知道这些封装和代码如何实现的,这些细节是怎么来的,这样你才能进步
-
-
所以不要纠结,如果你把java当作第一门语言,那么你只要极在未来就能学会 c++、python、JavaScript、php这些语言,不同语言实际上只是在解决一些问题和具体语法上有些不同而已。
-
如果你未来要励志成为一个专业程序员,建议你学java或c++,这两者在原理上是十分相像的,这才是个给程序员的专属语言,是有门槛的,才能建立自己的优势
-
如果你只是想玩一玩感受一下,或者当作工作中的工具而已,那python就是你的不二选择
-
-
如果是在真实企业中的做项目就不要纠结了,项目需要什么就学什么,不要那么多理由,干就是真理
- 锤子好用还是榔头好用?python好用还是java好用?为什么非要二选一,搞程序的不要太浮躁,通吃他们不就完了,这两个都会了这才是一个技术人员该有的状态
-
-
纠结是个坏毛病,小时候总是纠结自己要做爱因斯坦呢还是做比尔盖茨呢,纠结了很多年,后来长大了才发现自己太天真了,老老实实做个程序员不就完了,当一个老师,这就是我自己的爱好,人这一生总得有自己的爱好,我认为把知识传授给大家我就是快乐的
希望所有小伙伴都能够有一种心态,把编程当爱好,我也尽可能在之后课程中更多传给大家这种思想而不是只是知识,在学习之外一定要有一种收获——对人生的收获,这才是最重要的
学习方方法和课程概述
OK,那咱们来继续聊聊,到Java它是一个什么?是一个编程语言,编程语言是干嘛的?
是不是写程序的,那写程序的为什么要用Java呢?
如果你们是科班出身的或者说没听过的人啊,咱们来看一下,首先咱们最早出的是不是C语言这样的语言,C系列的语言奠定了咱们现在语言的一些基础,就是咱们现在编程语言啊,就汇编啊,二进制那些指令咱们就不去说了,从高级语言开始啊,咱们C它需要去管理一些底层的东西,什么呢?
比如说内存管理,还有一些指针,咱们每次去写完代码,他们要去管理一下电脑的内存该怎么去释放,哎,这就是非常麻烦的,写了一个构造函数,还要来一个析构函数
哎,这就不爽了,那咱们Java程序员为什么要学Java呢?为什么Java出来Java火了呢?是不是为什么?我这个地方给大家说了一连串为什么,就是想让大家去思考这样一个问题
- Java它几乎摒弃了咱们很多C或者C++语言的不好。,也不是说不好,就是那些容易导致大家犯错的地方,比如说纸质内存管理
这个在之后,可以大家聊一聊Java帝国是如何诞生的,在那一块大家建议认真听一下啊,一个很有趣的故事里面会给大家细细的讲解,到底什么是java
那我们重点来看啊,java能干什么?现在java能干什么呢?看一下这个早些年的诺基亚手机亚,这个地方有个Java程序列表,可以看到java能写一些网站,还有包括大家之前玩手机游戏的时候,零几年的时候,咱们玩游戏经常发现那个手机打开上面是不是有个咖啡状的一个logo啊,下面写了一个Java,哎,当然那个图片现在都不好找到了,
-
咱们Java是可以写一些手机的应用的,包括现在很多安卓的代码,是不是安卓程序的开发都是由Java来开发的
-
然后咱们看一下这旁边这个叫什么我的世界对不对?这样一款桌面游戏,它运行起来是不是也需要安装Java的一些环境啊,
- 当然现在Java去写桌面游戏的是越来越少了。因为他在这上面的话,可能有自己的劣势,但是C++就是它的一个强项了,咱们C很多大型游戏啊,都是用C加加去写的,对不对?
-
那除此之外的话,看一下这个什么东西,这是不是一个大数据分析平台啊,你看实时的动态刷新一些数据,诶不知道大家知不知道,在咱们的生活中啊,有非常多细节的改变,比如说咱们如果红绿灯这样的东西,能够由大数据来实时计算,就可以提高咱们的交通效率,它可以监测路面的状况,哎,咱们去实时的动态刷新来控制咱们灯是红灯还是绿灯,这样的话就可以提高咱们交通的效率,对不对?
- 包括一个城市所有的应急警报啊,像这样的平台啊,java是也能写的,当然这是一比较大型的系统啊,就是一些大数据分析平台,Java现在在大数据领域可谓是如日中天。
除了传统的网站开发企业开发,几乎所有的大数据领域啊,都会用到Java这门语言,因为在大数据里面啊,有个东西叫做Hadoop,它本身就是Java来写的,所以说Java还是比较流行的,他能做的事情非常多。
你把这三个串成一条线来看一下,从手机端对,到咱们的PC端的游戏桌面应用,到咱们的网站这些BS的架构Java都能做
- 这些东西大家不理解没关系,咱们之后学习深入再去聊
就这样一条线,无论是手机桌面还是咱们的网站它都能做,这就是为什么它这么强大的原因
那咱们来看一下咱们这边如何去学习Java呢?是不是很多人说,聊了半天终于聊到这儿了?那咱们来看一下这个学习Java它需要哪些东西
课程体系
我们来看一下这个是课程是怎么给大家安排的,如何体系的进行学习,很多人苦于没有体系的办法去学习,所以说学着学着放弃了啊,这是不应该的。课程大纲如下
首先我们会学习一些Java的基础
-
聊一聊计算机的基础
-
博客的重要性:因为很多人啊,就是写东西他没办法总结,或者学到后面,他前面的又忘了,所以说我们建议大家干嘛写博客,养成一个好的习惯
-
然后会在这里面讲一些Java的基础语法,什么是面向对象
-
然后还有一些Java的高级类的一些用法
-
包括咱们可以把图形界面编程教给大家,就是如何让大家去写一些桌面端的应用,
- 比如说写一个QQ这样的聊天程序,
-
然后包括一些网络编程,你们如何去写爬虫啊,如何去网站上爬上一些资源啊都可以。
-
-
然后Java的一些底层GVM的探究,GC高并发编程,这些我们都会去讲
-
我们会在其中呢,也穿插一些设计模式,包括数据结构的教学
所以说学完这个阶段啊,大家的基础应该是非常的牢的,前提是什么?就是按照我们的要求把所有的事情都去完成,对不对?
然后我们会去学数据库的一些知识
-
mysql这样一个数据库,就是现在最流行,也比较小小数据库,大家学习成本也比较低是吧?
-
然后会学习GDBC,就是Java如何去操作咱们的mysql,
- 包括学习一些里面的一些测试框架
-
然后我们会给大家教一下UML类图怎么画,讲一下数据库如何设计,去教一些咱们在架构上面的思想,我们尽量让大家学完之后有一个具备抽象的一个概念啊。
- 因为写代码大家都会,但是如果抽象的剥离出来一个系统的架构,诶这是很多人欠缺的一个能力,
-
OK,有了数据库咱们就可以把一些信息存起来了,比如说咱们的网站注册是怎么实现,你为什么这么久了再登录,还能把你的用户登录上去呢?是不是就因为他的这个你的信息被保存在人家大型互联网公司的数据库里了
- 大家先了解这样概念,诶听不懂没关系
咱们还会学习一些前端知识
- 比如,下面这张图说的HTML,CSS,JS,这就是一些前端相关的概念
说白了是干嘛呢?就是写出一个页面,让它更好看,有更多的交互效果,比如说这个百度这个页面,它为什么能够长成这样子,为什么这个框框就居中显示是吧,为什么点一下这个地方就会弹出一些东西,这时候啊就会在前端去给大家细细讲述,比如什么阿贾克斯。
然后这个页面呢,给大家瞄一眼,这个能看到的吗?是不是这边是一些代码呀,这边也是一些代码,就是咱们的HTML和CSS,它就能写出一个漂亮的网页
当然这是不动的页面
我们还要继续让这个网站动起来,有功能,我们就会学习JavaWeb
javaWeb阶段就会学习一些底层知识了
-
比如说学习一个简单的服务器,Java里面的叫做Tomcat服务器
-
然后学习一下咱们的HTTP这个协议,比如说这么网站这个HTTPS,还有些HTTP,它又是干嘛的,它里面是如何传输数据的,它是怎么交互的,就在这一块需要去掌握的。
-
然后学习maven,就是让咱们的项目更好的去构建,然后包括一些技术啊,servlet啊,什么session cookie jsp,这些都是写代码的一些技术,也就是网站后台的一些常用技术啊
然后包括再往下学完这个web之后,咱们到这个阶段就学完前四个阶段咱们做出一个网站就是没有问题了
只是这个网站写起来呢,代码可能有些繁琐,因此我们会进入下面这一些阶段
我们会学一个框架叫做SSM框架
- 如果有些人早的话,还听过一个框架叫做什么SSH,是不是就是咱们,但是现在慢慢的已经淘汰了,因为太笨重了
这个框架里面我们会学习三个东西,Mybatis、spring、spring mvc
-
mybatis是操作数据库的,就是把前面这个数据库给简化了
-
spring跟spring mvc,就是把咱们的javaWeb给简化了
你们在这个地方学完之后啊,只需要用很少的代码就能实现一个网站的开发了
然后在这个地方我们会学习一个工具叫做git。
-
如果了解咱们程序的人或者没听过,但是你有可能会听过一个东西,叫做全球最大的同性交友网站是吧,叫什么github,
-
那那个是干嘛的,就是咱们把代码写完可以放到这些平台上进行托管的,它也是一门技术啊,咱们之后再聊
OK,学到这个地方之后,咱们的基本网站开发就是常规的企业已经没有什么太大的问题了
然后我们要去学习一个操作系统,叫做Linux
Linux的话跟咱们的Windows是完全不一样的,它里面会有它很多的自己的操作,包括命令行,因为什么要学它呢?
-
咱们现在所有的大型互联网公司的服务器,都是在咱们Linux上的,Linux这个操作系统啊,几乎把所有服务器端的市场啊都占领了
-
这里我们会学Linux的基础,看起来是不是很少啊,这个基础其实是最多的
然后我们会在这个地方给大家把 radis、nginx 讲了,做网站负载均衡的
- 听不懂,没关系,看一下哪些技术栈吧
还有一些docker现在容积化的一些技术,对不对,会在Linux给咱们学习
然后学完之后呢,咱们基础的阶段就差不多完了,这个就算Java的全部的基础了
-
就是学到这个位置,你去一些小公司上班,我认为是没有啥问题的
-
前提是你需要把这个基础打牢,对不对,把每一章每一个点都听懂,把每一个原理都渗透才可以啊
-
这些天数是给大家认真学习的天数,而不是说你今天学两个小时,三天打鱼,两天三晚这样
-
这是以线。线下为标准给大家去定制的,线下的话一般就是早上九点是吧,到晚上六点
-
你如果能保持这样的态度去学习,这点时间是够用的了
然后咱们再往下,这是什么东西呢?
有些会什么spring cloud spring boot、hadoop,这是干嘛的?
现在的网站啊,都是微服务,微服务框架比较流行的就是SpringBoot,为什么叫微服务呢?
- 我们会把一个大的网站,拆成一个小点一个小点去开发,可以做到很多人去协同工作,而且互不影响是
我们会在这里面给大家讲非常多的新技术以及高级的技术啊
-
比如说缓存消息队列,
-
比如说咱们的一些分布式开发,doubbo+Zookeeper等等,都是在这个阶段学习的,
这个阶段也会给带大家深剖一些源码去学习,然后最后给大家讲一下什么是spring cloud
讲一下为微服务是什么东西,微服务架构如何来的对?讲一下spring cloud这个生态圈里面有哪些技术栈。
会给大家讲解一套比较传统的解决方案,比如Eureka这样的一个注册中心,hystrix熔断机制,路由网关,还有用SP cloud进配置中心
- 大家现在啊,估计是不是听不懂这些啊,所以说咱们不在这地方去做过多的赘述啊,吓唬大家,是不是咱们之后会来认真的学习到这个地方的时候再说
我们可能还给大家讲一些比较新的技术,比如说springCloud阿里巴巴,因为这个东西它有很多种解决方案,咱们可能到时会挑着重点去学习
OK,学完这个之后呢,Java方面呢,是不是就差不多完了
后面给大家赠送一门课程,叫做hadoop的课程,这是大数据的一个入门吧,因为大数据的话太多东西了,hadoop只能算入门,
-
会给大家聊一下咱们大数据时代的一些东西,它的一些技术发展前景
-
聊一下什么是Hadoop,给大家讲一下里面一些常见的技术应用,以及如何去处理这些东
-
很多人在这个最开始的时候去看这条路哇,觉得是不是好漫长啊,我现在相当于给你们画了一个很高的起点
-
这并不是让大家学Java就把起点放在javaSE的基础语法中
-
把大家起点放高了,大家可能会学到更多的东西啊
-
但是不要因此放弃
-
如果我们不做项目的话,77天时间就够用了,但是如果做了项目可能就要更久一点,
希望把学习放到你们的生活当中去穿插着来,不要说一天到晚沉迷于学习无法自拔,学习之外还要做一些自己的事情
这就是咱们整个Java的一个大概的路线,学完之后呢,咱们去做出一些应用是没有任何问题的,就像咱们上面说的三种,手机游戏你能开发,后台网站也能开发,没有任何问题,包括微服务的网站,大数据分析没问题、桌面的软件我们也会讲,但是不会讲的很深,你能做出一些简单的应用,那是完全绰绰有余的
OK,这就是关于咱们课程的一些概述,很多人都在网上说啊,自己没办法体系的去学习java是吧。
-
其实听到这个地方,你们按着这条路应该就是能慢慢学过来的
-
要一步一步的走,不能跳着走
如何更好的学java
那来给大家推荐一个学习方法是吧,如何更好更高效的去学习咱们的加va这个地方,我列出了一些这样的点
首先多写代码,咱们很多人学习一门编程语言,他他就跟看电影一样,老师把这个课在这讲,然后给他们在现场讲,讲完他们就诶在那坐着发呆,所以说很难成长啊
-
一门编程语言如果你不去写的话,几乎就是废了,相当于不会了,所以说这个东西我放在了第一位,一定要多写代码,写久了就没有任何问题了
-
第二个是多写什么呢?要写笔记,因为咱们刚才看到这个体系非常庞大,对不对,我们要怎么更好的学习呢?一定要去做笔记,咱们之后如果你忘记了,是不是回来还能看看笔记啊
-
第三个可以多写一些文章,咱们知道你们在大学的话都要写的论文是不是,如果文章都不会写,那肯定是不行的,这样的话可以去锻炼大家的一个文档编辑能力啊
那除了这三个写之外,咱们来看一下我下面还有给他什么三个练
-
首先要交流,很多人说有可能我是自学是吧,没办法交流,但是我建议你啊,还是加一下咱们的一些交流群是不是,或者一些论坛去看一下,看一下别人是怎么学的,因为你有可能不会的东西,别人一下就给你解释通了,有可能你钻研三四天的东西,老师一句话就给你点名了,这都是可能的,你要多跟别人交流交流思维
-
第二个是不是思维就来了,要多练习思维,咱们编程里面啊,有很多固有的思维,包括咱们的一些设计模式,都是一些传统的思想,把它集中起来,对不对,变成了一些传统的模式,所以说你在编程中要去多练一些思维
-
当然我们这个地方的思维,除了去编写代码的思维,还有面向对象的一个思维叫做oop思想,这个思想的话,回头学习,大家深入就慢慢了解了
-
第三个多练技能,什么叫技能呢?就包括咱们课程后面说的这一块,你学到前面大家都是一样,基础没问题,但是后面这些微服务,大数据,这就是一个一个的技能栈,每一个栈里面还有一些详细东西,这就是你要跟常人去比较,而且能把别人甩一大截的东西,这些技能就是要慢慢练的,如果你不去用,你都没使用过,哎,你根本无法去跟别人竞争啊,因为现在很多基础的出来,如果你作为一个程序员,嗅觉不够敏感,这是很容易干嘛,就失败了。
- 所以说平时在写代码的时候,会给大家慢慢的灌输这一种思想,让大家能够在学完基础阶段就把一个良好的编程习惯给养成
然后还有最下面这三个是给大家的建议
-
要多去分享知识,把你学到的东西写成一篇文章,或者把一些有用的错误把它总结起来,可以让别人再看到
-
第二个多提问怎么了?就是因为你们写程序啊,经常会出bug,什么叫bug呢?就是代码出问题了,你的程序跑不起来,程序又有异常了。你就要去提问,我的东西到底是怎么了呀?然后你你有了这个怎么了,你是不是就会想着如何去解决它呀?
-
第三个方法是不是多思考,为什么?比如说最开始思考的就是我为什么要学Java,有可能你再往里面学,我为什么要去用这个关键字,再往里面学,我为什么要用这个方法,再往下面,为什么这个东西就能这样实现了,你随着这样一步一步的深入,你就能够把它掌握的很好
-
最好的学习方式不是向大家传输什么,而是能够干大家提出很多问题,让你们去思考.你们思考完的话,其实这才是你们自己得到的东西
然后这些东西啊,都是光说不练假把式,是不是很多人就是我说了是我说了,你们做不做是你们的事,但是最重要的,如果你没有坚持下去,以上说的都是白搭。
如果不去坚持做一件事情,我认为没有什么人能够简简单单成功,你如果坚持下来,我认为没有任何问题,因为东西是死的是吧,人是活的,就像学习,为什么有的人从小开始就学习好,因为人家就是努力,可能有时候是他天赋好,但是我认为天赋只能占一部分,大家以前肯定都学过伤仲永,对不对?如果说你是天才,但是你不学习到后面肯定也会废,所以说要比常人更加努力的就是坚持。
学习语言也是样的,三到六个月这样的一个时间,说短不短,说长不长是吧,但是确实能够改变大家的一生。然后在这个地方送给大家一句话,每个牛逼的人物最后都有一段苦逼的岁月,只要像傻逼一样的坚持,终将牛逼。
- 什么意思呢?就是你看到所有的风光人物背后肯定有一段见不得人的岁月。什么叫见不得人呢?他不愿意把这段东西分享给大家,甚至他觉得这段东西对于他来说是痛苦的,对不对?但是由于有痛苦,他才能够成长啊
所以说只要你一直坚持,你终将变得特别厉害,这就是人生的一个道理吧,我希望大家能够把这句话干嘛牢牢的记在心中,你要知道,你这段苦逼的岁月就是为了将来你牛逼的人生是不是打了一个基础,如果没有这个基础,那你肯定就是一个苦逼的人生,对不对?
这是给大家说的一些学习建议的方式,当然按部分吸收就好了,我可能给大家传输的也是不对的,对不对,但是大家挑中自己有用的诶就可以了,OK,等会儿带大家看一下Java的一些就业前景,以及关于教育我们的一些想法。
就业前景
给大家聊完了这条路该怎么走,咱们来简单的看一下它的一些就业前景
咱们区现在比较流行的什么boss直聘这个网站上来看一下,这个网站的话,你一看一上来第一个就能看到咱们的Java他最热门也没啥说的,因为搜他的人多,咱们刚才之前是不是聊过,如果这个东西生态好用的人多,他一定就值得去学习。如果你学了一个东西都没人用,其实是很难成功的。
咱们来随便点开看一下,就点
Java,我们去看一下,就在西安这样一个城市来说,他的工资是不是都能达到10k15k这是比较高的,而且他的学历要求只要在本科以上就可以了
- 当然这些公司有些是外包公司,什么是外包?咱们以后再跟聊是吧?
随便点进去一个看一下要求,就是要求你熟悉Java语言,了解Linux,熟悉这些主流的框架就可以用了,对不对?像这样的东西,我们在学习阶段都是把它已经吃得透透了,对不对?所以找工作是没有任何问题的。
除了这些你们还可以看一下北上广是吧?有人比较了解想看一下北京、深圳、广州你看想找一些好的经常是多少是吧?几乎都是1万起步,1万起步的话,在目前来说这些城市可能比起大部分人来说都算算是高薪了,阿里的这些大厂可能工资更高,月薪都是2万到4万,一年就是几十万了,然后京东什么的,也是14k、15k非常多,大集团待遇都不差。
所以说我认为就业前景来说,学Java是没有任何问题的
关于教育与对大家的期望
教育
当然我不带大家过去过多追溯,我们重点是给大家想聊一聊,之前在知乎上看到过这样一句话,叫什么?为什么很多it公司它不喜欢经过培训机构的人,身为一个教学负责人,看到这样的问题,我一定是要去关注的。
看了一下下面所有的回答,简直是排山倒海的一些骂声,很多负面评价那太多了,看完之后心里憋得慌,又堵得慌又委屈又气愤是吧?大家看一下有这样一个链的连锁反应
-
很多线下的培训机构,他们去坑骗一些大学生,他把他招过去,说是让他去上班对不对?结果让他们去学东西还要交报名费。
-
学生毕业之后要骗公司
- 什么意思呢?很多学员毕业他又没有工作经验,甚至都没有学过东西,他就干嘛,他说自己有几年工作经验
-
然后公司干嘛,公司是不是就被骗的多了,然后他就开始直接过滤掉培训机构毕业的宣,导致有一些人确实是很认真很认真,学完了干嘛,而找不到工作,这样的话就非常的倒霉了是吧?
-
这些学员他找不到工作,他又干嘛,他又去网上骂培训机构,然后这样的消息越来越多,导致什么?
-
导致那些培训机构招生成本上涨。
-
你们要知道咱们作为一个线下的培训机构要去跟人家去商谈,要把人家学生让过来到我们这来报名,你要让别人觉得这么多培训机构为什么要选择你对不对?
-
然后这样的成本就越来越高了,叫做获客成本了,然后只能投放更多的广告来去招一些学生,这样的话成本就越来越高了。
-
-
羊毛出在羊身上是吧?
-
导致学费的上涨,然后很多机构的教研成本就压缩了,他们要更多的保证盈利
-
于是把老师就放在了第二位甚至第三位,然后慢慢的他们就只管赚钱了,反正有一天可能公司走不下去了,对不对?招不到人了他们就倒闭了。
-
然后有些大的知名公司那就不喜欢招培训机构的人,
-
然后慢慢的优秀的讲师是不是就越来越少了?
但是现在我觉得还好,有很多人已经站出来发声了,很多人愿意去为咱们这个行业证明,所以说我认为春天会慢慢的来到是吧?只要坚持去做对的事情就没有问题。
教学质量不断的下降,毕业生质量越来越差,更多企业不想要培训机构的人,这样的一些连锁反应导致现在很多机构形成了一个死局,还有的人在不断的给抹黑,之前也是一家机构来黑我们这个机构,他说你们这边怎么样,然后他们去骗完学生,我们看着非常生气对不对?特别难受
但是讲真的我并不是通过这个问题才了解到培训机构名声不好的,因为干这行也不是一天两天了,是不是?早就知道这个行业的老大,他经常通过一些招转来坑骗学生,然后我知道一些大型机构啊,毕业出来就是包装成几年工作经验,早就知道某些大品牌现在已经沦落到连小学没毕业的人,他他都敢去招过去
之前觉得只要坚持做好自己就可以了,别的机构怎么样做下去,口碑越来越差,长久不了的,但是好几年过去却发现一个问题,那些做那些骗人的机构,它干嘛依然屹立不倒,而且越来越好了,我去探究了一下它的原因就是什么?
广告打得响,销售人员的话忽悠能力比较强,而且那些都是忽悠的小白,你说一个小学都没毕业的人,他们招进去学程序,一出来包装两三年,这个水不深,我都不信对不对?一年给百度一两个亿也就能忽悠到足够多的小白用户,所以说他们也不考虑挣不挣钱,反正不管什么人交钱就招。
其实把这些东西说给大家听,大家有的人是不是可能还不爱听,但是这就是一个事实,也并不是说咱们要去做些什么事情,我们只想为这个行业发一些声是吧?尽一些个人的能力来帮助更多的人有一个清晰的选择其实看到这个行业的一些前景,我个人是感觉比较焦虑的
其实还有一件事情是更难受的什么呢?之前咱们公司要去做一些宣传的视频,让一些之前的老学员在线下培训的老学员吗?想让他们来帮我们录一些视频,有几个学生平时都聊得很好,但是他们不愿意给说怕泄露隐私对吧?我说放心不会写真名的,只写某某同学还是不愿意,但是最后他们才说出来,他说害怕公司里面的人知道他们是从培训机构出来的,突然间真的好难过,就是难过的不是他们连这点小忙都不愿意帮,更难过的是我们如此辛苦培养出来的好学生出去之后竟然不敢跟别人说我们自己是从这出来的,更难过的时候,我们甚至一起度过了那段艰苦充实的岁月,就那么七八个月甚至多的还有十几个月是吧?他们只能埋在心里,不能对别人讲,还有那些想通过努力学习提升自己,只想借助培训机构出来的学生,他们那么努力在别人的眼中却又造成了低人一等的感觉,这是一个多么难受又不得不接受的现实。
这些事情让我瞬间觉得失去掉了干这样一份职业的荣誉感,甚至觉得当初为什么要辞职出来当一名讲师,这样的选择是不是正确的?本来是师者,所以传道授业解惑对不对?本来一直秉承着什么?教育不是灌输,而是点燃火焰,本来一直坚信优秀的老师是吧?教授知识只是一个基本的,它还要对学生的人生观产生真正积极的一些影响。本来一直坚信真正牛逼的老师一定是活成了学生心中想要的样子,对不对?我看到很多老师真的是很努力的工作,很努力的去拼命,到头来发现什么?所从事的行业却变成了什么?老鼠过街人人喊打,很多学员如此努力的学习,最后出去找工作,竟然要靠隐藏自己的培训经历,包装简历才能得到一些面试的机会。
最后被逼的在学生找不到工作的时候,我们也要教一下他怎么一下包装简历,因为不这样做,可能有些人连面试的7机会都拿不到,或者本来50k直接变成5k对不对?最后被逼的我们也要干嘛?教学生如何去包装简历。因为如果你不这样做的话,是不是可能有些人连面试的机会都没有了?只能接受5000起步,本来你的技术可能比人家科班出来的还要好,但是人家学历高,人家怎么一出来几十k对不对?包装一下就几十k一个月不包装一下就5000块钱,因为你是培训出来的,你就处在鄙视链的底层。
上次毕业的人他拿过来说老师技能点该怎么写,教一下我怎么包装,我觉得我边讲自己的形象就边在崩塌,对不对?之前告诉学生价值观要做一些正确的事情,对不对?为人师表你却要告诉人如何作假,真是可笑,有时候觉得自己当然有时候会自己安慰,比如说对自己说你可以坚持不让这个学生包装,你自己是正义了,对不对?
但是代价就是要学生接受比其他机构学生要低一倍的工资,凭什么?凭什么自己坚持的正义到最后却让学员买了单对不对?所以说有时候让他们包装一点包装个半年,这样子也不算过分,别人学也学了这么穷对不对?有这样一句话不知道大家听过没有是吗?当正义得不到持久的声张是吧?当受害者得不到应有的同情,荒谬也就变成了真理。
之前看过一个短片,有两个人在谷歌工作技术能力还挺强的,然后后面人采访问他,他们就说他们自己从培训机构出来的,他们面试的时候就直接说了,然后他们就在问你们去面试的时候就不会被区别对待吗?他们说不会,只要具备实际的能力,为什么要在意人家是培训出来的,很多大学生也都会培训对不对?
本职工作干到半路想转行it,人多的去了,反而是勇敢尝试新鲜事物的一些表现,这个事情就让我引起了深思,做的事情明明是帮人改变提升的好事,在国内怎么就变成了这个样子,对不对?
难过、愤慨、无奈,有时候也想骂人,所以说有时候我上课的时候经常把一些思想喜欢传递给一些新的同学,星星之火能够燎原是吧?我也希望自己的一些思想能慢慢的转变一部分人,这一部分人如果能去转变,其他人一些思想就更好了,一个东西它总会向更好的地方发展,其实我是相信正义是终将战胜邪恶。
我自己录的所有款我都免费发放给大家,对不对?想证明给这个社会说这个行业还是有希望的,想证明给一些无良的同行看,不用靠坑蒙拐骗也能招到学生,是不是?想证明给一些学员说你们的努力不应该被别人接受质疑,想证明给一些企业看培训出来的学生是可以用的,也证明给自己我们做的事情是一件正确的事情,对不对?
有时候我自己说这些话的时候,我也觉得挺可笑的,因为这件事情并不容易对不对?有可能看到这些视频的人或者听到这堂课的人,都觉得这是个笑话,这都有可能。所以说各位在这地方坐着学习,我还是想把自己的一些想法说给大家,无论你心里怎么想,我希望大家能够把一些正义的东西传递出去,而不是一些负能量,对不对?
就给大家唠到这,等会咱们还要上课
期望
给大家说一个期望,希望大家都能够坚持学到最后对不对?之前差不多都是一个班40多个人学到最后面的话,应该也就会走一两个,大部分人都能学到最后,然后不要辜负自己付出的时间,希望大家学完之后干嘛都能拥有属于自己的一些作品,无论是网站还是游戏对吧?
送给大家一句话,即使再小的帆也能远航!!
什么时候要干嘛偶要保持自己的一个自信,要是有精力可以学学音乐讨论情操,多去看一下国际社会有机会的话出国少一天沉迷于什么游戏对吧?无用的一些社交什么去泡吧喝酒等等,这样的事情没有必要去做,如果你的学历没有上来的话,可以通过努力干嘛把学历慢慢的补回来。现在学习力补回来的方式非常多,成人高考一些远程在线教育等等,可以考研什么的对不对?有机会的话出国走一走,扩大自己的眼界,如果有时间跟精力的情况下
最后希望大家干嘛?
学完之后我们还是最好的朋友一起谈天说地,对不对?因为我认为学生跟老师之间是有一种天然的友情的,就是出来之后有很多困难的时候,你可能第一个想到的不是家人,而是你教过你的老师对不对?
最后希望大家都能够拥有属于自己的精彩人生,如果之前你还是比较迷茫的话,我希望大家能够此刻从现在开始认真的打起精神,把这剩下的6个月认真充实的度过,让大家自己学有所获,对不对?
之后的课程学习时间都将由我来陪大家度过了,可能我不是一个最好的老师,但是我会尽可能的告诉大家我知道的所有东西,用最通俗的话给大家讲解这门课程
所有的课程也都是自己设计的,可能去参考一下这边参考一下那边,尽量用自己认为比较好的方式传授给大家,如果大家有兴趣也可以加入到其中可以来帮我一块设计一些课程,甚至你觉得你是某个行业确实做得还可以,你对某个方面有独到的见解,你来私信我,我觉得我们也可以一块去设计一些课程,这都是可以的,希望越来越多的人能够加入咱们这个行业。
Ok这就是对大家的一些期望,过多的话就不多说了,等会咱们就去学习正式的课程了。其实我也没有希望大家通过这一个小时就能够有一些巨大的转变,但是我相信大家在学完之后回头转望这一路的时候,你会感谢对吧?咱们学过这一堂课,ok等会咱们就去看一下咱们的预科知识,就教一下大家什么是计算机对吧?聊一些计算机的简单知识,聊完之后咱们才正式进入Java的学习。
预科阶段
论博客的重要性
博客,英文名为Blog,正式名称为 网络日记
为什么要写博客?
-
需要总结和思考。有时候我们一直在赶路,却放了放慢脚步
-
提升文笔组织能力
-
提升学习总结能力
-
提升逻辑思维能力
-
帮助他人,结交朋友( 最主要的,我们要提升做人能力,学编程不能宅!多交朋友才是走的远的关键 )
”冰冻三尺,非一日之寒“,写博客也是,短期内看不到效果,但是长期检查对自己很有帮助
注册博客
- 博客网站推荐
-
博客园(推荐)
-
CSDN
-
简书
-
知乎
-
购买个人服务器搭建个人网站(学完java就搞)
-
wordpress
-
typecho(非常快):有许多开源主题
-
MarkDown(写博客的利器)
推荐的markdown编辑器:Typora
MarkDown 文件后缀: .md
常用语法
-
标题
-
字体样式
-
引用
-
分割线
-
图片
-
链接
-
列表
-
表格
-
代码块
标题
- #+空格 表示一级标题 (几个#就是几级标题,最大支持6级)
字体样式
-
粗体:字体两边加 **
-
斜体: 字体两边加*
-
删除线: 两边加~~
引用
引用:>加空格
分割线
分割线:—或***
图片
超链接
超链接:名字:markdown里面不会跳转,blog会
列表
-
有序号时,1+. 空格即可 ,后面的为 2+………
-
无序列表 - 加空格
表格
-
右键插入表格,推荐
-
写出表头、表线、内容,然后查看源代码,将行间空格删除,即可
代码块
代码块:```加语言类型+ 空格
什么是计算机
-
Computer:全称电子计算机,俗称电脑。
-
能够按照程序运行,自动、高速处理数据和现代化智能电子设备就是计算机
-
由硬件和软件组成
-
藏剑形式有台式计算机、笔记本计算机、大型计算机等
-
广泛应用在:科学计算、数据处理、自动控制、计算机辅助射界、人工智能、网络等领域
-
硬件与冯诺依曼结构
硬件: 一些物理装置,按系统结构的要求构成一个计算机整体为计算机运行提供物质基础。
计算机硬件组成
-
cpu
-
主板
-
内存
-
电源、主机箱
-
硬盘
-
键盘、鼠标
-
显示器
-
…
软件及软件开发
计算机软件
-
可以使计算机按照实现预定好的顺序完成特定功能
-
计算机软件按照功能可以粗略分为系统软件与应用软件;(软件除了计算机软件外还可以划分成,实时嵌入式软件、科学和工程控制计算软件、人工智能软件等)
系统软件: Dos(Disk Operating System),Windows,Linux,Unix,Mac,Android,IOS等
应用软件: WPS、QQ、微信、英雄联盟、绝地求生
软件开发: 根据开发的软件不同,可以划分为Web开发、游戏开发、桌面开发等
windos常用快捷键 和 基本Dos命令
windows常用快捷键(待补充)
-
永久删除:shift+delete
-
运行:win+r
-
任务管理器:ctrl+shift+esc
-
切换:win+tab
基本Dos命令
打开Dos的方式
-
方法一:开始-系统-命令提示符
-
方法二:win+R–输入cmd(推荐)
-
方法三:在任意文件夹下,按住shift+鼠标右键–在此处打开命令行
-
方法四:资源管理器地址栏前面加上cmd
ps:以管理员身份运行,方法1右键以管理员身份运行
常用的Dos命令及其实现
-
进入盘符: 盘符字母 加 :
-
查看当前目录所有文件 : dir
-
切换目录 : cd
-
清屏:cls
-
退出终端:exit
-
查看电脑ip:ipconfig
-
打开应用:
-
测试网络是否正常:ping
-
创建目录:md 文件夹名
-
创建文件: cd > 文件名和后缀
-
删除文件:del 文件全名
-
删除目录: rd 文件名
计算机语言及语言发展史
计算机语言的发展方向:更易更强,即更容易上手(易学程度、代码量),更强的功能
常见语言
- C语言、C++、Java、C#、Python、PHP、JavaSCript(前端)
发展史
-
第一代:机器语言
-
第二代:汇编语言
- 第三代:高级语言
整个计算机语言的发展史就是山寨史,抄袭并不断改进就是新语言,哈哈哈哈哈
java入门及环境搭建
java的诞生
编程语言的发展
1972年 C语言 诞生
-
贴近硬件,运行极快,效率极高。
-
贴近操作系统,编译器,数据库,网络系统等
-
指针和内存管理
1982年 C++诞生
-
面对对象
-
兼容C语言
-
被广泛用于图像领域,游戏
1995年 java诞生
java设计理念
-
实际上是往C+±-方向开发,即功能和C++一样但是操作更简易,后来发现与C++不同点太多,改名java)
- C+±-,即语法像C、没有指针与内存管理、有高可移植性(编写一次,到处运行)、面对对象、类型安全、高质量的类库
java的初生
-
环境:1995年 网页简单且粗糙,缺乏互动性
-
java的锋芒毕露:支持java的网络浏览器能使用Applet(采用java语言编写的小应用程序),极大的提升了界面互动与美观(比尔·盖茨:java是迄今位置设计的最好的语言)
-
随后,java向更多方向发展展
-
java2 标准版(J2SE):去占领桌面
-
java2 移动版(J2ME):去占领手机
-
java2 企业版(J2EE):去占领服务器
-
-
更多的巨头加入,为java注入更多力量
java的发展
-
基于java开发了巨多的平台,系统,工具
-
构建工具:Ant,Maven,Jekins
-
应用服务器:Tomcat,Jetty,Jboss,Websphere,weblogic(一个中间件解决了三高问题,即 高可用、高性能、高并发)
-
Web开发:Struts,Spring,Hibernate,myBatis
-
开发工具:Eclipse,Netbean,intellij idea,Jbulder
-
-
2006年,Hadoop出现,大数据领域被java占领
-
2008年,Androl被java占领
题外话 (C#)
-
是微软为了对抗java基于C#开发的框架,但由于不开源、不能跨平台(开始仅仅支持windows,后来才通过 core才进军linux)等原因,与java的争锋一直落败。
-
直至2020年,微软将原本分散的各框架(asp framework、aps core等)集中统一为.Net并开源,有了较好的前景,但此时java已经占据大半江山,C#是否可以逆袭不可知
java特性和优势
-
简单性
-
面向对象
-
可移植性 : write once run anywhere, java通过jvm虚机级跨平台
-
高性能: 性能接近C++,随着更多人的加入,java的速度会优化的越来越快
-
分布式: java就是为了网络分布式设计的
-
动态性: 通过反射拥有了动态性能
-
多线程
-
安全性: 由于强类型语言等原因,java基本不会造成程序崩溃
-
健壮性: 学的人多(这些是为什么学的原因,只有java才有入门到入土的教程)
j ava为什么成功?
强大特性+互联网时代到来(机会是留给有准备的人的)
java三大版本
-
JavaSE:标准版(桌面程序、控制台开发…)
-
JavaME:嵌入式开发(手机、小家电…)
-
JavaEE:企业级开发(Web端、服务器开发)
题外话: 程序出错是好事,出错了才能知道这么解决
JDK、JRE、JVM
-
JDK: Java Development Kit
-
JRE:Java Runtime Enviroment
-
JVM:Java Virtual Machine
java开发环境搭建
有安装过不是1.8版本的,建议先卸载
如何卸载java:
1.删除java的安装目录
2.删除javahong
3.删除path下关于java的目录
5.java -version
安装jdk
1.百度搜索jdk8,找到下载地址
2.同意协议
3.下载电脑对应版本
4.双击jdk
5.记住安装路径
6.配置环境变量
-
我的电脑-右键-属性-高级设置–环境变量
-
配置path变量
- 新建 JAVA_HOME变量变量值为你的java安装路径,下图是我的路径
- 新建CLASSPATH:这里的变量值可以直接复制 [ .;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar ]
-
点击path变量:弹框出现后新增两个变量
-
%JAVA_HOME%bin
-
%JAVA_HOME%jrebin
-
7.测试jdk是否安装成功c
打开cmd,分别输入下面三个命令,都不报错则安装完毕
-
java -version
-
java
-
javac
Hello World
-
新建文件夹,存放代码
-
新建一个java文件
-
文件后缀名为 .java
- 例: Hello.java
-
注意点系统默认不显示文件后缀名,需要手动开启
- 编写代码
- 记事本中输入下列代码:
public class Hello{
public static void main(string[] args){
system.out.print("Hello,World!");
}
}
- 将新建的.txt文件改名为 Hello.java
- 编译java文件 生成 同名的但后缀为.class的文件
-
进入cmd
-
javac Hello.java
- 运行 class文件
- java Hello
注意
-
java大小写敏感
-
中文有可能输出不了,和系统环境有关
-
文件名和类名保持一致,并且首字母大写
-
符号不要使用中文
java程序运行机制
java可以是编译型也可以解释型,最开始只是解释性,但技术发展模糊了界限
例子: 外国人看中文书
编译型:全书翻译后给他看
对操作系统要求低,但代码修改时成本高
解释型:找个翻译官,看一句话翻译一句话
使用IDEA开发
ide:集成开发环境
idea:常用的java开发平台
有免费版和收费版
idea安装教程:https://www.bilibili/video/BV12J41137hu?p=20
如需破解版,自行百度或csdn中搜索即可
java基础
创建一个空项目并配置java环境
1.创建空项目,不做配置
2.创建模块
3.修改项目结构(增加java环境,此时是没有配置环境的)
若没有勾选环境,代码内可能没有绿色箭头(不让执行)
Idea中的常用的缩写
-
psvm: public static void main(String[] args){}–>main函数
-
sout: System.out.printLn()–>输出
Idea中常用快捷键
有可能会跟其他软件冲突,导致无法使用
知道有就行,现在暂时用不上,可以往后看着先
-
新建, 插入:alt+insert
- 通常用在自动化生成get、set等地方
-
复制当前行到入下一行:Ctrl+D
-
格式化代码:ctrl+alt+l
-
全局查找:Ctrl+shift+F
-
全局查找并替换:Ctral+Shift+R
注释
注释是什么?
平时我们编写的代码,在代码量少的时候,我们还能看懂,但项目复杂起来,我们就需要注释了,否则就会出现,每次回头看前两天写的代码时,需要完完全全从头开始读的现象
-
注释不会被执行了,是给我们这些写代码的人看的
-
书写注释是一个非常好的习惯
-
平时写代码一定要注意规范
Java中的注释有三种
-
单行注释
-
多行注释
-
文档注释
修改注释颜色
有趣的代码注释
** 百度有趣的代码注释,有奇奇怪怪的东西**
标识符与关键字
什么是标识符?
-
所有的东西都有名字,身为代码的造物主,我们需要给每个类、变量、方法等命名,我们给它们的名字称为标识符
-
Java所有组成都需要命名
PS:程序源于生活,要和生活联系起来,标识符要使用看得懂的东西命名,而非abcd
什么是关键字?
-
就是已经被系统使用了的标识符
-
为了保证系统的正常运行,不允许使用关键字名命标识符
常见的关键字如下
数据类型
强类型语言和弱类型语言
编程语言分为强类型语言和弱类型语言,区别如下
-
强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用(Java、C#)
-
弱类型语言:要求变量的使用符合一定规则,可以不定义直接使用(JavaScript)
-
强类型语言更具有安全性,但是运行速度下降
-
强类型语言中一个变量定义后,不进行类型转换类型永远不变,但是弱类型语言不同变量类型直接可以直接赋值转换
Java的两类数据类型
- 基本类型(Primitive type)和引用类型(reference type)
两种类型包含的内容如下
八大基本数据类型用法如下
什么是 位、字节?
-
位(bit):计算机内部最小的存储单位,一位表示一个0或1,如11001100是一个八位二进制数。
-
字节(byte):计算机中数据处理的基本单位,习惯上用大写的B表示
-
转换关系: 1B(byte,字节)=8bit(位)
-
字符:是指计算机中使用的字母、数字、字和符号
拓展
- 从1B开始每1024倍(2^10)为一个新的单位
- 32位电脑和64位电脑指的就是内存大小最大为232B和264B的电脑,因此32位电脑最大内存为4G
数据类型拓展
-
一个数可以用多种进制表示
-
浮点数直接的比较是不精确的
-
字符实际上都能被转换为数字
-
转义字符的使用
-
同一个字符使用对象创建和直接赋值,比较时得到的结果不同
- 之后学到对象时具体解释,new开辟了新的地址空间,比较时比较的是地址
类型转换
-
由于Java是强类型语言,所以进行运算的时候,需要用到类型转换
-
不同类型的数据进行运算需要转换成同一类型才能运算
-
类型容量从低到高排序如下图所示
- 低容量数据类型可以自动转换为高容量类型,而高容量类型转为低容量类型时需要强制类型转换
为什么浮点数是最高容量类型?
我们可以看到,long类型要8个字节,而float类型存储只要4个字节,那为什么long能自动转为float呢?
-
long:占位 8个字节节,范围是:-263~263-1
-
float: 占位四个字节,范围是:一3.403E38~3.403E38
-
原因: float存储机制为 V=(-1)^s * M * 2^E,其中第1位,符号位,即S。接下来的8位,指数域,即E。剩下的23位,小数域,即M,M的取值范围为[1,2)或[0,1)。
-
即,相当于float和double这两个浮点数类型,实际上是用科学计数法表示的,而不是直接存储整数
- 例:整数100000000000000000000 ,用科学技术法表示就可以写成 1*10^20
-
-
但是整数转为浮点数时会失去精度,例下面
PS:因为存储机制不同,及精度降低,所以小数的优先级一定大于整数
变量与常量
变量
-
就是可以变化的量,类似有一元函数方程中的变量
-
Java是强类型语言,每个变量都必须声明其类型。
-
数据通过变量放入内存,以供cpu调用计算
-
Java变量是程序中最基本的存储单元,设计到了变量名、变量类型、作用域等概念
变量定义的注意事项
-
每个变量都要有类型,类型可以是基本类型,也可以是是引用类型
-
变量名必须是合法标识符
-
变量声明是一条完整的语句,因此每个声明都必须以分号结束。
生命周期、变量默认值
常量
-
初始化之后就不能再改变其值。
-
所谓常量可以理解成一种特殊的变量,值被设定后,程序运行过程不允许改变。
-
常量名一般使用的大写字符
变量命名规范
-
所有变量、方法、类目要 见名知意
-
类成员变量:首字母小写和驼峰原则,即 除了第一个单词以外,后满单词首字母大写 (monthSalary)
-
局部变量:首字母小写和驼峰原则
-
常量:大写字母和下划线(MAX_VAELUE)
-
类名: 首字母大写 和驼峰原则(Man,GoodMan)
-
方法名:首字母小写和驼峰原则(run(),runRun())
运算符
-
算数运算符: +,-,*,/,%,++,–
-
赋值运算符:=
-
关系运算符:>,<,>=,<=,==,!=,instanceof(用于判断该对象是否是改类或其子类,用法:obj instanceof Class)
-
逻辑运算符:&&,||,!
-
位运算符:&,|,^,~,>>,<<,>>>(了解!!)
-
条件运算符:?(用法:x?y:z,表示若x为真执行y否则执行z)
-
拓展赋值运算符:+=,-+,*=,/=
运算符优先级
-
就如同 1+23这条数学公式是先算23而不是先算1+2一般,大多数语言都有自己的运算符优先级
- 为了避免优先级混乱,尽可能使用()包裹代码
包机制:对项目文件进行分类
-
为了更好的组织类,Java提供了包机制,用于区别类的命名空间,同一名字的类可以通过不同的包应用。
-
包语句的语法格式为:package pkg1 [.pkg2][.pkg3]
-
要想使用某个包的成员,就需要在Java程序中导入该包,使用“import”语句可以引用包
包的本质就是文件夹,你在写一个类的时候就需要先申明是否用到了其他包(文件夹)里的东西
包的创建方式
注意事项
-
一般使用公司域名倒置作为包名 (com.kuangstudy.www)–>会自动生成三级目录
-
新建包的时候,创建com.baidu.www包
- 如果没有多级目录,则取消下面选项
-
包引用如果删除了就无法使用包内的类了
-
平时使用的String类型也是包,但是系统预置引用了
例如:未引用Date包时,则无法使用Date
如何引用自己写的包?
import 包名/包名…/类
一次性导入某个包中所有类
import 包名/包名…/*
拓展:三元表达式
作业:看完阿里巴巴开发手册
javaDoc
-
三种注释方法的一种,写在类或方法上表明用途、作者等信息
- 特殊点在于,javadoc注释能够通过命令能生成自己的API文档
javaDoc参数
-
@author 作者名
-
@version 版本号
-
@since 指明需要最早使用的jkd版本
-
@param 参数名
-
@return 返回值情况
-
@throws 异常抛出情况
如何自动生成API文档
写一个代码并写上javadoc注释
- 当代码中如同下面代码一样填写了JavaDoc参数的时候,就能自动生成文档了
方法1:CMD中生成
在文件所在路径中使用cmd中执行命令: javadoc -encoding UTF-8 -charset UTF-8 Doc.java
随后会生成html文件,打开index.html就能进入api文档的首页
方法二:使用IDEA生成
-
内容来源:
- 菜菜今天不菜: 用IDEA生成JAVADoc
1.选择生成JavaDoc文档的范围
2.输出目录自己专门设置一个文件夹,方便后期查阅
3.区域设置,决定文档的语言,简体中文就是zh_CN、繁体(台湾)zh_tw、繁体(香港)zh-hk、英语(香港)en-hk、英语(美国)en-
us、英语(英国)en-gb、英语(全球)en-ww
4.设置参数为了显示中文不出现乱码
-encoding UTF-8 -charset UTF-8
流程控制
用户交互:Scanner
之前学的基本语法中并没有实现程序和人的交互,但实际上几乎所有软件的人机交互都是不可或缺的,因此Java这样的一个工具类,我们可以获取用户的输入。
- java.util.Scanner是Java5的新特性,可以通过Scannner类获取用户输入
语法
-
Scanner类的next()和nextLine()可以读取输入的字符串,可以通过hasNext()和hasNextLine()判断是否有输入的数据
-
next()会把空格当成无效字符处理,而无效字符在开头会直接略过,无效字符在有效字符后会被当成结束符。因此 使用next()读区 " Hello World"时,只能读区到Hello
顺序结构
-
Java的基本结构就是顺序结构,除非使用了其他结构语句,否则就会按顺序一句一句执行
-
顺序结构时最简单的算法结构
-
语句与语句之间,框与框之间都是从上到下的顺序执行,顺序结构是任何一个算法都离不开的基本算法结构
选择结构
-
在布尔表达式取值是具体几个值对比时(例:a=b),if选择结构和switch选择结构可以互相替代
-
在布尔表达式取值是来源于范围比较的时候(例:70<a<80),只能用if选择结构
if选择结构
if选着结构可以分为四类: if单选结构、if双选结构、嵌套if结构、if多选择结构
if单选结构
用于判断一个东西是否可行,如果可行我们采取执行,用一个if表示
If双选择结构
那现在有个需求,公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发。这样的需求用一个if就搞不定了,我们需要有两个判断,需要一个双选择结构,所以就有了if-
else结构。
if多选择结构
我们发现刚才的代码不符合实际情况,真实的情况可能存在ABCD,存在区间多级判断。比如90-100就是A,80-90就是B
等等,在我们生活中也不仅仅有两个选项,所以我们需要一个多选择结构来处理这类问题。
resource://database/1605:0)
嵌套if结构
在if选择结构中继续使if选择结构是合法的,也就是说你可以在一个if中继续使用i 语句
拓展:
嵌套结构在二分法时非常高效,100个数中筛选一个数,可以使用多个if嵌套,每次筛选出一半的数据,最多七次就能猜出来。遍历的话可能要100次。
switch多选择结构
多选择结构的另一种实现方式
-
switch的case语句判断一个变量与一系列值中魔偶个值是否相等,每个值称为一个分支
-
支持变量类型,byte、short、int、char,从Java SE7开始支持String
-
case标签必须为字符串常量或者字面量
case支持String的原因
实际上String会被转换成一段hash值(又叫哈希值,为一串数字)对比字符串实际上是对比哈希值是否星等
拓展:反编译class文件
- 找到项目结构
- 找到编译后的文件
- 将编译后的class文件通过 文件资源管理器 拉入源码文件夹中
- IDEA中双击class文件
原文与结果对比
循环结构
-
while循环
-
do…while循环
-
for循环
-
增强型for循环
-
各种循环可以互相替代
while循环结构
最基本的循环
-
只要表示式为true,循环一直执行
-
大多数情况我们需要让循环停止下来,往往会在循环内容中改变布尔值表达式的变量值,使整个布尔表达式在某次循环后能结束
-
极少部分情况,如服务器请求响应监听等我们会用到死循环(永不结束的循环,即 布尔表达式永远为true的循环)
do while循环
与while的差别
- while循环从第一次循环开始每次都判断是否满足条件,而do while循环第一次执行时不判断是否满足条件(即至少执行一次)
For循环
虽然所有的循环都能通过while和do while 表示,但Java提供了另一种循环——for循环,能使一些循环更简单
- for循环提供了迭代条件填写位置与初始变量赋值填写位置,是最有效、最灵活的循环结构
for循环和while对比
增强for循环
Java5引入的用于对数组的遍历的循环结构,会将数组中的每个元素遍历一遍并将当前遍历到的数组元素的值赋值给声明语句中定义的变量。
-
声明语句:声明新的局部变量,该变量类型必须和数组原神的类型匹配,该变量在循环过程中等于当前时刻遍历到的数组元素
-
表达式:填写要访问的数组名,或者能返回数组的方法
break continue
break和continue能用于任何循环结构的主体部分当中
-
break会强制停止当次循环(哪怕循环体内容还没执行完毕),并不在执行之后的循环(哪怕循环体的布尔表达式仍然为true)
-
continue会强制停止当次循环(哪怕循环体内容还没执行完毕),但只会跳过这次循环,若下一次循环时的循环体的布尔表达式仍为true,循环体仍会继续循环执行。
goto关键字
goto关键字在很早的程序设计语言中就出现了,尽管goto关键字是Java的保留字,但并未在Java中正式使用,即Java没有goto。
不过通过带标签的break和continue我们能实现goto的功能
-
“标签”指后面跟着一个冒号的标识符,例: label:
- 完全不用掌握的东西
对于Java来说唯一用到个功能的的地是是在循环语句之前,而在循环之前设置标签的唯一理由是:
-
我们希望在其中嵌套另一个循环
-
普通方法使用的break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断语句直到到存在标签的地方。
练习:利用循环输出三角形
- 实际上就是把上图中空白处两个三角形利用空格表示,阴影处两个三角形利用*表示
方法
何谓方法?
- 例:System.oout.println(),就是一个方法
概括性的来说方法就是语句的集合,这些语句配合执行,完成一个功能
-
解决一类问题的步骤的有序组合
-
包含在类或对象中
-
方法在程序中被创建,在其他狄梵被引用
-
可以有输入和输出也可以没有
注意: 方法的命名也要遵守标识符规范
设计原则
- 方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候最好保持方法的原子性(即 一个方法只能完成一个功能),这样有利于后期拓展维护
方法的定义
- java的方法从功能上来看类似裕C语言的函数
方法调用
方法重载
- 注意事项:仅返回值类型不是判断方法是否重载的依据,只有返回类型改变,不构成方法重载
命令行处传参
-
在哪:main方法中的 args[]参数就是用来存储参数的
- 只有在使用命令行,且带参启动时才使用arg
-
使用方法:
-
在项目文件夹的src文件夹内使用命令行运行有main的class文件
-
在后面输入的参数会依次存放如args[]数组中
-
接下来我们示范一下如何使用
- 注意:要进入正确的文件夹指定到类所在在的位置所在位置后才能运行代码,否者报错如下
可变参数
-
作用: 对于同一个方法可以使用不同个数的参数
-
也叫不定向参数
-
声明:
-
声明形参时在类型后面加上…
-
该形参必必须在最后一个参数位
-
-
使用:
-
调用有可变参数的函数方法时该可变参数对应位可以输入多个参数
-
这些参数会被保存到对应形参的形参名为名的数组中
-
使用可变参数实际上就是使用数组保存多个参数
-
递归
- 方法内部调用自身
递归一定要有递归头(边界条件),否则就会进入死循环
- 如下面的代码就没有限制边界条件,那么最终就会超出内存然后报错
- 正确使用递归的示例
作业
- 加油!
数组
数组的定义
-
相同类型数据的有序集合
-
数组中描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
-
其中,每个数乘坐一个数组元素,每个数组元素可以通过对应下标访问
数组声明创建
内存分析
和普通变量的区别
-
当声明一个变量时,内存中就开出一个只能存储一个值的空间
-
当声明一个10位数的数组时,内存中会开辟一个能存储10个数的数组
java内存简介
-
内存可以分为三块区域,即 堆、栈、方法区
-
堆:存放new出来的引用对象的具体值(如对象和数组),存放后可以被所有线程共享不会存放对象引用
-
栈:存放基本变量类型及其数值、存放引用对象的变量(会存放这个引用在堆里面的具体地址)
-
方法区:可以被所有线程共享,包含了所有的class和static变量
-
数组在内存中的存储
-
在栈中存放数组变量的引用,引用指向栈中的具体地址
-
栈中开辟一串连续的地址
-
存储数组的具体值
代码如下
初始化数组
数组的四个基本特点
-
长度必须是确定的,数组一旦被创建,大小就是不可改变的
-
元素必须是相同类型,不允许出现混合类型
-
数组中的袁术可以是任何数据类型,包括基本类型和引用类型(自定义对象等)
-
数组变量本身属于引用类型,所以可以看成是对象,数组中的每个元素相当于该对象的成员变量
- 数组和对象一样,值都是存储在堆中,因此数组无论保存什么对象都是存储在堆中
数组的边界
-
数组是从0开始计数的,所以有效下标范围为【0,length-1】
- 例如:大小为10的数组,合法区间是 0-9,如果使用了9以外的数就会报错
数组的使用
- 普通for循环用法及 计算数组和、查早数组最大元素的方法
- foreach循环用法 及 数组作为入参、出参
多维数组
多维数组 创建方法如下 ,更高维数组以此类推
声明数组时方括号也能写前面
多维数组可以看成是数组的数组
-
比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
- 例如: int[][] a = new int[3][2],即是一个有三个元素的一维数组,每个元素是一个有两个元素的数组,展示图如下
多维数组的使用
Arrays类
使用代码如下
冒泡排序
-
人尽皆知的一种简单排序,
-
嵌套了两层循环,时间复杂度维O(n2)
- 不懂时间复杂度可以先跳过,不用纠结
交换方法如下git
稀疏数组
稀疏矩阵的使用
- 类似于五子棋这样的矩阵中就可以用稀疏数组表示
- 代码如下
- 结果如下
面对对象编程
什么是面对对象
- OO:面对对象 ,OOP:面对对象编程
面对过程思想
-
步骤清晰,第一步做什么、第二步做什么,即线性思维(或者说是写一个固定流程执行程序)
-
面对过程适合处理一些比较简单的问题
-
例如,下图就是典型的面对过程编程
- 定义了一些方法,再main方法中编写流程控制,在main函数中通过特定的执行顺序调用调用
面对对象思想
利用抽象思维将现实中的对象进行归类,并找出构建系统需要的属性,从而创建出java类,在通过类创建一个虚拟的对象,最后通过流程控制的方式让虚拟之间进行交互,从而完成对现实的模拟,这就是面对对象思想。
-
如现实中学生请假的流程,就是由学生提交申请表给教师审批的。
-
其中的学生和教师等群体我们就可以分别抽象为一个类,甚至请假表也能抽象一个类
-
例如,以归类学生群体为例,我们有如下学生
-
小红
-
属性(班级(1班)、姓名(小红)、学号(123)、爱好(阅读)、饭量(小)、颜值(高)……)
-
动作(打篮球、请假、吃饭、睡觉)
-
-
小明
-
属性(班级(2班)、姓名(小明)、学号(234)、爱好(打球)、饭量(大)、厨艺(高))
-
动作(唱歌、请假、吃饭、睡觉)
-
-
张三
-
属性(班级(3班)、姓名(张三)、学号(345)、爱好(在危险边缘试探)、饭量(中)、好朋友())
-
动作(唱、跳、rap、篮球、请假、吃饭、睡觉)
-
-
-
有了个体我们就要他们归类,他们都是学生,于是给类为学生类之后就胡发现他们都有班级、姓名、学号、爱好这些属性和请假、吃饭、睡觉这些动作
-
学生
-
属性(班级、姓名、学号、爱好、饭量)
-
方法(请假、吃饭、睡觉)
-
-
-
而我们在请假这个事件中只关心,学生的班级姓名学号和请假这个动作,而不关心兴趣爱好饭量吃饭睡觉等东西
-
所以 java中的我们定义的学生类的属性最终为
- 学生群体的共有属性(如班级、姓名、学号等)和共有方法(交申请表等)
-
以此类推教师和请假表java类如下
-
教师群体的共有属性(如姓名)和方法(审表)
-
请假表类的共有属性(如请假学生姓名、请假学生班级、请假学生学号、请假状态)
-
-
-
定义好了类,就相当于订好了一个模板,这个模板可以用来生成一个具体的实例(即对象),如定义了学生类(学生模板)我们就能用学生类(学生模板)生成一个具体的虚拟对象(虚拟学生),如虚拟的学生小明
-
之后,我们就可以通过面向过程编程的方式编写一个流程调用生成的学生,完成一个虚拟请假流程了
-
对现实生活的虚拟化就是我们开发的本质!
代码如下
- main函数(通过面对过程的方式调用对象按照特定流程执行流)
- 运行结果
小结
-
上面的代码就很形象的说明了,面对对象编程实际上就是模拟现实这个道理
-
现实中我们是学生填写申请表,教师审核
-
面对对象编程的代码中我们也是学生填写申请表,教师审核
-
-
当然这里面的学生类、和教师类以及申请表类都还要我们定义,不过最重要的就是 要理解,面对对象编程实际上就是对现实的模拟 这一个概念!
其他类的代码
- 学生类
- r教师类
- 请假表类
小结
-
我们通过代码可以发现
-
从宏观上来看,我们需要区分析整个系统,抽象归纳现实类群所具有的属性与行为,并转为我们需要的java类,这就是面向对象思想
-
而从具体操作来看,我们是调用 生成的对象(小明、表、老师)以我们固定好流程执行(如,请假要学生先填表、然后老师再审批这一过程是不能颠倒的),这个编写固定流程的过程实际上就是面对过程编程思想
-
因此我们可以说,对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
抽象
-
从上面中,我们可以知道, 面对对象编程实际上就是对现实的模拟
-
而我们在这个过程中就需要使用抽象的方法
-
将显示个体抽象为现实群体再提取我们需要的属性和动作抽象为虚拟群体(类),最后对虚拟群体(类)赋值,从而生成一个虚拟的个体(对象) (即面对对象编程)
-
观察现实个体执行构想事情的流程,再抽象为虚拟的请假流程,并编写流程调用虚拟个体(对象)执行流程 (即面对过程编程)
-
-
通过抽象的方式,将面对对象和面对过程的结合,我们就完成对整个事件(学生请假事件)的虚拟化
-
对现实模型(事件)的虚拟化(数字化),也就是我们开发系统的目的
从上面的例子我们也不难发现
面对对象的编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据
-
以类的方式组织代码: 包括学生、教师、请假表,甚至时请假流程的main函数都是写在一个类之中的
-
以对象的方式组织(封装)数据: 一个类(虚拟群体)是没有意义的,我们需要给他赋值一个对象(虚拟个体),才能让他执行事件流程。这个过程中,就是以对象的方式来承载数据。
面对对象编程的三大特征
-
封装:代码数据封装起来,对外留一个出入口
-
继承:子类有父类所有东西
-
多态:同一个事务有多种形态
- 例如:人这个java对象学习方法,小明小红是人,但是他们学习后得到结果(分数)却不一样
方法的回顾和深入
方法的定义
- 修饰符、返回类型、方法名、参数列表[参数类型 参数名]、后面还会学异常抛出
方法的调用
- 静态方法、非静态方法
- 形参和实参
- 值传递和引用传递
值传递时,我们在方法中的操作不影响main函数中的值,引用传递时我们在方法中的操作影响main中的值
类与对象的关系
-
类是一种抽象数据类型,他是某一类事物的整体描述/定义,但是并不能代表某一个具体事务
-
类:动物、植物、手机、电脑、person类、pet类、car类
-
用于描述/定义某一类具体事务应该具备的特点和行为
-
-
对象就是抽象概念的具体示例
-
对象:张三这个人、张三家里养的旺财这条狗
-
能够体现出特点,展现出功能的具体实例
-
我的理解:
如之前说的抽象那个部分内容,我们把现实的事件流程转为电子流程,需要经历 现实个体、现实群体、虚拟群体、虚拟个体的四个步骤转换
执行一个事件,在现实中我们需要现实个体去执行,如现实中小明去跟现实中王老师请假。但是在我们要想把这个流程电子化,那么就需要有虚拟的小明和虚拟的王老师来执行。而我们需要创建一个虚拟的小明或者老王,就需要用虚拟的群体也就是类进行创建并初始化
- 类实际上也就相当于一个用来创建对象(虚拟个体)的模板
创建与初始化对象
- 构造器也叫构造方法
- 一个类即使什么也不写,它也会有一个构造方法,但一旦定义了有参构造,如果还需要使用无参构造就必须定义无参构造
创建对象内存分析
- 下面的图可以看作简单的内存图,实际内存还有类加载器、class对象等,这些东西后面讲反射时再讲
先新建一个类,然后我们分析用它生成对象时的内存结构
-
程序运行要先加载运行模板所以第一步时将application类放入方法区,包括了main()和常量
-
然后会把main放入栈中,main会被放入栈底,当main被弹出时,程序也就结束了
-
然后就会执行new一个pet,这时就会把pet加载进方法区,包括了属性和方法,此时属性都是null
-
随后在堆中new一块空间存放pet对象,此时仍未赋值
-
随后在栈中存入dog引用
-
最后对dog赋值
- 新增一个cat,流程类似
小结
-
方法区也是堆的组成
-
堆存放创建出来的对象
-
栈存放变量引用和方法
更高深的以后再说
- 结社之前的数组内容,我们可以知道对象数组的存储方式如下
回顾
封装
-
就是通过设置属性为private,并设置get/set方法实现的
-
封装更多是对于属性来说的,方法很少用到
当我们使用了private后就能发现,不在能直接通过 对象.属性的方式调用属性了
这时我们要操作这些属性就需要用到方法,get/set
-
get获取属性的值
-
set设置属性的值
使用alt+insert键,然后能快捷生成get/set方法
封装的意义
1.提高程序安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护增加了
我们可以在调用方法时做一些控制,控制值的合法性
- 如我们可以限制,在设置年龄属性时,必须要在0~120之间,否则报错
完整代码如下
继承
-
现实生活中的继承是无处不在
-
动物->哺乳动物、爬行动物->猫/狗、蜥蜴
-
人->国家/肤色
-
-
继承是类和类的关系,子类继承了父类就会拥有父类的全部方法
Student类中并没有写say方法,但是通过继承Person可以直接使用
我们如果设置了public属性,那么也会被子类继承
-
所以为了防止子类使用了父类的属性,往往会将属性定义为private
- 可以发现继承和封装也有关系
按ctrl+h就能看见类的继承关系
- 从中我们也能发现所有的类都继承自Object
测试:即使什么也没定义,类中依旧有方法可以使用,因为所有类都继承了Object类
super
-
使用super能调用父类的属性或方法
-
私有的东西无法被继承
调用用子类构造器时,实际上隐藏执行了 父类构造器,
- 如果要把父类构造器写在子类构造器中,也就是super(),那么必须写在子类构造器第一行
所以我们如果在写了有参构造后一定要写上无参构造,否则子类因为调用不了无参构造就会报错,除非你想下面一样,在子类无参中直接调用父类有参
super注意点
-
super调用父类的构造方法,必须在构造方法第一个
-
super必须只能出现在子类或者构造方法中!
-
super和this不能同时调用构造方法
super和this的区别
-
代表对象不同
-
this:调用这个对象本身
-
super:代表父类对象的应用
-
-
前提
-
this:没有继承也能使用
-
super:只能再继承条件下才能使用
-
-
构造方法
-
this():本类的构造方法
-
super():父类的构造方法
-
方法的重写
-
有继承关系时,能够用父类引用指向子类对象
-
方法的调用只和左边(引用类型)有关
-
调用子类和父类都有的的方法时,静态方法和非静态方法有区别
-
静态方法:只和左边定义的数据类型有关
-
非静态方法:子类会重写父类方法,调用时使用的new出来的对象类型是谁就用谁的
重写方法idea会有提示,在子类中提示重写,在父类中提示被继承
总结
重写:需要有继承关系,子类重写父类的方法!
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大不能缩小 public>protected>Default>private
-
抛出异常:范围可以被缩小但不能扩大(没学到),ClassNotFoundException (小)- >Exception(大)
重写,子类的方法和父类必须一直:方法体不同!
为什么要重写:
- 父类的功能,子类不一定需要,或者不一定满足
快捷键重写:
A;t + Insert–>overrider
多态
- student中没定义run,但是person中定义了run,而student继承了person,那么person引用指向studnet实例时,能调用run方法
- 子类重写了父类方法,则无论引用类型时父类还是子类都是执行子类方法
- 子类定义的方法,父类引用类型无法使用,上图中s2.eat()报错
总结
对象能执行哪些方法主要看对象左边的类型,和右边关系不大
多态注意事项:
-
多态是方法的多态,属性没有多态
-
父类和子类要有联系;否则报错类型转换异常(classcastException)
-
存在条件:继承关系,方法需要重写,父类的引用子项子类对象(例:father f1 = new Son())
不能重写的方法
1.static 方法 属于类,不属于实例,所以不能重写
- final 常量
4.private方法
- 可以实现动态编译,数据类型只有在编译时才确定(现在理解不了,现在知道多态能提高了程序拓展性就好)
- 第一行解释:同样都是run,通过s1和s2可能产生不一样的结果
instanceof和类型转换
-
instanceof是Java的一个二元操作符(运算符),和==,>,<是同一类东西
-
它的作用是判断其左边对象是否为其右边类的实例
- instanceof 判断类型是否相似(有无继承等关系)
- student和teacher类继承了person,所以前三行都是true
- person和String绝对没有关系,所以编译就报错了
- studnet和teacher也没有继承关系,所以false
- 能不能编译通过取决于x和y有没有继承关系
- person类型比student高一级,所以用不了go,那么就要类型转换
- 转换后就可以使用了
- 父类型要调用父类方法只能通过强制类型转换了
总结
1.父类引用指向子类的对象 自动
2.把子类实例转换为父类实例,向上转型(低转高)
3.把父类转子类,向下转型 强制转换(会丢失子类独有方法)
作用
方便方法调用,减少重复代码;不用重新new一个类,把原来的类降级或升级就行
封装、继承、多态!一个比一个抽象
之后更抽象的东西: 抽象类、接口
static详解
静态属性
-
非静态的方法不能直接通过类名调用
-
静态变量推荐使用类名直接调用,代码更易于理解
静态方法
-
非静态方法,不能通过类名直接调用,静态可以
- 此处甚至连类名都可以不要直接使用go(),因为此处main就在lstudnet类中
-
静态方法可以直接调用静态方法,但是不能直接调用非静态方法
-
例:main也是个静态方法,调用非静态方法润报错
-
因为静态方法和类一起加载,而非静态方法要和对象一起加载,所以静态方法调用非静态方法时,非静态方法还没加载出来,所以无法调用
-
之后会学习类加载机制(注解反射模块),具体内容到时候讲
代码块
-
一般不建议这样写
-
代码块:创建对象时自动执行了,在构造器之前
-
静态代码块:在类加载的时候自动执行
-
静态方法只在类加载时执行一次(相当于整个项目运行一次执行一次),非静态方法创建一次对象执行一次
测试代码
增加一个person2
- 可以看见,静态方法只执行一次,非静态方法创建一次对象执行一次
很多人自学半年都学不到这,因为学完之前的他们就觉得能循环输出东西了,很厉害了
新特性
- 每次都要写Math很烦,我们可以利用新特性省略掉Math
很少人会这样玩,主要是告诉你java的东西非常多,只要想学就能一直学下去
final
- 通过final限定的类,就不能被继承了
抽象类
-
子类如果继承了抽象类,就必须实现里面的抽象方法,否则报错
- 除非子类也是抽象类
总结
- 不能new抽象类,只能靠子类去实现它:只是一种约束
2.抽象类可以写普通方法
3.抽象方法必须在抽象类中
-
抽象的抽象:约束
- java类是我们通过现实抽象出来的,抽象类又是我们抽象java类抽象出来的
思考题
抽象类有构造器吗–>有
存在的意义:创建游戏角色,重复创建过于麻烦,因此继承抽象类,但是其中每个角色的特殊点我们要自己去实现(抽象方法)
作用:提高开发效率
- 并不是重要内容,接口才是重要内容,不过理解了抽象类更容易理解接口
接口
在大型系统开发时,我们一般会把所有的接口都先设计好,文档也定义好,之后只要找一些码农(学的不好但是也干程序的)就能实现。
-
希望大家以后不要做这些主要就是做一些实现别人接口的工作
-
做这种工作对自己来说没啥提升,只是能赚点钱
-
主要是外包公司(中软……),经常是帮外国人打工
- 接口的图标是 I ,类的图标是C
-
通过interface定义
-
接口中不允许写方法的实现
-
接口里面的方法默认就是 public abstract,可以直接省略不写
- 类实现了接口必须要实现接口里的所有方法,否则报错
- 一个类可以实现多个接口,但只能继承一个抽象类
-
口里面定义常量一定是静态常量
- 不过一般没人会在接口定义常量
杂谈
企业中的开发、包括后面要学的很多框架,核心是想就是写很多接口然后实现它,包括以后写业务也是
接口实现是很容易的,但是如何把一个系统抽象称多个接口是很难的
-
锻炼抽象思维是特别难的,不是一下能练出来的,
-
这就是为什么有的人能做到架构师有的不行,当你能把一个系统抽象为各个接口的时候你的抽象能力就已经很强了
大部分人都只能默默学习,看自己是否有能力能够持续学习,持续提高
总结
-
作用:约束
- 定义一些方方法,让不容的人实现,(10个员工可以都实现一个接口)
-
方法都是public astract
-
常量都是 public static final
-
接口不能被实例化,接口没有构造方法
-
implement可以实现多个接口
-
必须重写接口的方法
杂谈
大家一定要总结自己的博客 ,才能更好理解学习,如果理解不了你就会发现以后项目都是用的都是这种规约的思想,就是把所有东西都接口化,然后实现它就行
公司里面干活并不难,虽然我们离干活还有很远要走
java学完后去看23种设计模式:面对对象的精髓
内部类
内部类总是让人觉得奇葩,明明可以正常写,非要这样写
成员内部类
- 一般不这样用
- 内部类能直接访问外部类的私有变量和方法
此处狂神表示,多的东西不介绍了,需要更深入了解的可以看他的文章
静态内部类
- 加上static后,id就拿不到了,应为静态类先于对象创建
先认识就好了,以后聊到lambda表达式时再推到
其他
-
下面这种写法不算内部类的,可以看见项目结构中这个文件能展开成两个类
- 一个java文件里面能写多个class类
-
但是一个java文件只能有一个public class ,所以classA不能写成public
局部内部类
- 方法里面定义的类
类的奇怪使用方法
- 匿名对象
匿名内部类
- 之前说了接口不能new,但是实际上new了后会变成匿名内部类
这里只是给给大家拓展,大家一定不要写这样奇奇怪怪的代码,不然真的就是只有你自己能看懂了,具体东西我们再lambda表达式的课程会详细解释
学完面对对象课程应该会的东西
1.面对对象思想,用程序的思维看待世界
2.关键字
3.java学无止境
异常
什么是异常
例:
- a,b无限循环调用,严重错误就是erro
- 被除数为0
- 少写一个分号
这些都是程序中的错误,我们要规避他,异常发生的原因有很多有可能时jvm有可能时程序员疏忽的原因
异常的分类
-
检查性异常:程序员很难避免
-
公司里面有个岗位叫测试,这就是专门去招bug,在某些情况下会不会出现特定问题
-
程序员很难指导用户在使用时输入什么,所以没法完全写出没有bug的代码
-
-
运行时异常:较容易避免,自己写的代码会怎样运行是比较清楚的,如刚才的无限递归调用a()b()
异常体系结构
-
erro我们一般无法预见,exception我们能预见
-
下图只写出了部分
之后我们就要学习,如何捕获异常(当异常出现了,我们发现他并进行处理)
-
上卖弄这些异常如果能力不行,可能排错你都不知道如何排
-
除了运行时异常以外的东西都统称为非运行时异常,通常都是检查性错误
从程序语法上讲,异常必须处理,否则有可能编译都通过不了,如IO异常、sql异常,不过大多数情况下我们不用自定义异常
我们要把每一个报错都当作自己的提升机会,总结到自己博客里面
异常处理机制
例:
解决办法
try、catch是必要的,finally可以不要
- finally一般在执行完必须要关闭的东西里面使用,如IO、资源
- 可以发现,ArithmeticException无法捕获到循环调用导致的异常
- Throwable是最高级的异常类,可以捕获所有异常
所以我们能发现,catch中的类型表示,需要捕获的异常的类型,我们需要捕获什么异常就写什么类型
可以捕捉多种异常
- 捕捉多个异常时要层层递进,如果把Throwable放在最上面,那么永远就只能捕捉带TThrowable
Ctral+Alet+T:选中代码后,能通过快捷选中语句对讲选中代码块包裹起来
主动抛出异常
向上抛出异常
- throw和throws不一样!!
自定以异常
用的不多,java已经定义好了很多异常,开源框架也自定义了很多异常,如果不是写开源框架或者大型系统的话,很少用
修改传递数字为11
总结
对于不确定是否出异常的代码,idea会在代码下面提示图波浪线,我们这时选中并按下Alt+Enter,可以查看可能出现的异常,和处理方法
更多推荐
狂神说java java基础篇 学习笔记
发布评论