JAVA-LEARNING 第一阶段小结
零.前言
一段学习时间下来,发觉java是一门功能非常强大的语言.系统非常完善,思想非常严谨,这是在之前学习C语言和数据结构的时候所没有感受到的.
原来学习编程的方向仅仅是学会使用工具解决问题,而Java的学习是通过从构思项目,考虑实际效率后续维护等为目的为方向等等,算是更高的角度思考.
以下是这几个阶段的总结.
一.思想理解(我又打开了第一次的总结的博客)
这些原则思想都是前人经历过无数的Bug后总结出的经验,可以帮助我们新手或以后可以避免走很多弯路.我要做的是理解原则的核心是什么,尽量少避免一些错误.而这些原则我认为都不是我们编程的规则和束缚,我们大可逆道而行只要运行出即可.但是谁会和未来即将秃头的自己作对呢?还是将这些原则融入到平时的编程习惯当中,把他当作习以为常并不断总结改进吧.
l 开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
理解:
对外开放,极大的方便我们使用已经完成的类,充分利用了之前的劳动的成果,极大的省略了许多不必要的操作,能方便就方便.
对修改关闭,是保证了程序的稳定性,有一句话这样说修改一个bug就会产生256个bug,所以Java尽量对修改关闭.如果想要修改之前的程序可以通过利用多态性多写几个类进行继承修改.
l 组合/聚合复用原则
定义:就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的.
理解:一开始学习了继承觉得继承是非常好的复用的方法.但是经过后面的学习发现了继承的一些局限性.
比如直接继承基类时会破坏封装性,会将基类的内部细节暴露给子类.所以这里强调了组合/聚合复用.
怎么实现的呢?之前已经通过基类实现了一些对象,而新的对象想要建立时组合的就是这些已有的对象的功能.,此时我们还是不知道基类的细节,所以达到”黑箱效果”.
l 单一职责原则
定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责.
理解:一个类只负责一项职责,减少了多项功能的赘余.这个原则在日常习题中多次训练过
一个类写起来容易简洁->可读性就增加了->后期维护就更容易了->更改的几率就更小了
l 里氏代换原则
定义:子类可以扩展父类的功能,但不能改变父类原有的功能。
理解: 如果通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大.如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。
l 依赖倒转原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程
理解:万物之源都是抽象的,因为最开始项目的设计都是抽象的,倘若一开始分析细节将会很难分析下去.记得写过一个雨刷的题目.通过中心一套抽象逻辑不断向外部扩展功能,是这个原则很好的例子.
l 接口隔离原则
定义:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
l 迪米特法则
迪米特法则其根本思想,是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响,也就是说,信息的隐藏促进了软件的复用。
二.学习历程
刚开始配置jdk,下载编译器,dos编译运行等等比起学习c语言要麻烦很多,还有jdk,jvm等等感觉很复杂.但还好没有劝退我.
真正开始学习Java的时候发现并没有那么复杂,并不需要重新学习语法,又没有指针结构体,最重要的是不用自己写数据结构.这是我学习之前都没有想象到的,算是Java给我的惊喜.
在熟练了一些语法之后才发现真正Java的魅力在于面向对象的思想.清晰的那节课讲的是农夫过河问题,老师让我们思考怎么去分析,之后给我的感觉就像是发现了新大陆.之后的学习中构思UML图变成了更难的一个过程,一个好的结构确实简化了很多后续的编程
每次大作业只有几次比较容易的可以自己独立完成.其他的都多多少少问了同学.这说明程序员之间的交流是必不可少的,这也是为什么有那么多人热衷写博客.这是个积累的过程,写的bug多了自然就更强了.
后续阶段也就是最近学习通过Java进行界面图形设计,不得不说Java功能非常强大,好像没有它做不成的. 这是我随便在某个网页后面的代码.都是通过java实现的
三.之后规划
由于是物联网工程专业的,之后不知道还有没有有关java后续的学习.但是学习Java对于软件方面确实有极大的帮助.如果没有的打算把课本看一遍,毕竟学习的时候都没有课本参照,但课本上面确实知识比较全面,可以当作复习和补充.之后再看课程安排,学习有关更系统的编程技巧.
四.知识梳理(主要来源菜鸟驿站,挺神奇的网站,即使看了很多遍但每次看都有新的收获)
由于疫情原因,整个几个月Java的学习都是在网上进行的.然后每次写作业都是在网上的知识东拼西凑没有经过一个系统的整理,脑子里比较乱.所以我花费了一些篇幅梳理了下知识点.
1.JDK,JVM,JRE
第一个节课老师主要讲了Java的作用和现处的地位,同时关于JDK,JVM(虚拟机),JRE讲了三者之间的关系.同时区别于其他语言的垃圾回收机制:垃圾自动回收开了一个集线程自动检测那些内存不用然后回收机制.
学习C语言时指针和结构体是最难的也没学怎么明白.而Java正是抛弃了这两个难上手易用错的语法,所以我对Java语言一直保持着好感,java给我的印象是特别人性化,每个语法不像是强行施加的条条框框,而是简化操作者的难度.
2.HelloWord
第二节课正式上手编程.从通过记事本+dos系统运行Java文件,再到用eclipse编译器进行编译编写了第一个程序HelloWord.
接触到Java核心类这个概念.许多事物可以将其总结一个类, 这样就将一个物体总结的很精炼非常形象.
如许许多多的人组成的人这个类(简称人类).
类只包括属性和方法:属性指身高体重等,方法指人能够做成的事如吃饭碎觉等.
但是有了人类的概念,但怎么产生活灵活现的人呢?
这里就引出了对象的概念:对象是对类的实例化.
3.语法(区别于c语言)
1)数据类型转换,boolean类型,关键字标识符命名规则,输入输出流,异常处理,static,public,private区别
2)String的用法,非常重要的且常用的语法.
StringBuffer(速度有优势) 和 StringBuilder(要求线程安全时必须使用) 类的对象能够被多次的修改,并且不产生新的未使用对象.注意:大部分方法和String方法不一样,使用时需要查表.
3)数组
int[] array = new int[100];//实验了创建,初始化和赋值变量给arrar
For-Each 循环遍历
for (double element: array) {
System.out.println(element);
}
public static int[] array(int[] array) {//数组作为函数的返回值和返回值
Array常用方法array.sort()//默认数组升序排列,可后续重写
4)重载和重写(@Override )
重载是在一个类中,同名的方法如果有不同的参数列表则视为重载.
重写是继承时重写父类的方法.在方法名,参数列表,返回类都相同的情况下,对方法体进行修改或重写.但要注意子类函数的访问修饰权限不能少于父类的。
5.继承(提高了类之间的耦合性)
1)子类通过extends继承父类后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性.
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔),
public interface A {}
public interface B{}
public class C implements A,B { };
2)Java不支持一个子类继承多个父类(即多继承)
继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差
3)super关键字:通过super关键字来实现对父类成员的访问
this关键字:指向自己的引用。
4)构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表.
6.接口(不是类, 类描述对象的属性和方法,接口则包含类要实现的方法。感觉和抽象类是一个维度的)
Java不能多继承怎么办,所以引出了接口概念变相实现多继承.
l 接口(英文:Interface),是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
l 接口中的成员变量只能是默认的 public static final 类型的。
public interface Sports {
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
总体来说理解不是很深,以后想到再补充.
7.多态(可以使程序有良好的扩展,并可以对所有类的对象进行通用处理)
1)存在的三个必要条件
继承+重写+父类引用指向子类对象
(Parent p = new Child();//如果父类有调用的方法则调用子类的方法,否则报编译错误)
区别就是编译时会到父类中调用编译,但运行时虚拟机调用的是子类中的方法
2)实现方法
重写/接口/抽象类抽象方法
8.抽象类
l 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
既然人类我们熟知是可以形象化的,那么对于不确定的物种(如外星人)获取信息不够时需要对它抽象化.既然外星人未知,所以我们就不能对他实例化,只能通过已捕获的外星人的特征,然后继承这个抽象类才能实例出和已捕获的外星人特征相似的其他外星人.抽象类中的抽象方法必须实现.
Ps:其实还有很多想写的东西没有写,以后想到在再写吧.