java基础——第十六章:java基础(总结、设计模式、java新特性)

 

本章概述:

第一部分:java基础部分总结

第二部分:设计模式

第三部分:java新特性

 

 

 

 

 

 

第一部分:java基础部分总结


1、面向对象

 

 

 

抽象:即对自然界事物的简单描述,计算机语言的出现就是为了解决生活中的一些具体问题,把生活中和该问题有关的属性和行为封装起来,忽略与问题无关的细节,就是我们计算机体系中描述的对象,只面向问题处理的结果而无需关注问题的处理过程就是面向对象。如:洗衣机洗衣服,我们面向的是洗衣机这个对象,如果我们要洗衣服就只需要给它传入水电和洗涤剂然后启动它就行了,至于它具体什么时候加水什么时候洗涤什么时候漂洗什么时候脱水以及具体是怎么实现的我们不需要关心,这就是用面向对象的方式处理着生活中的事件。

(1)对象的五大基本设计特性:

万物皆对象

程序是对象的集合,他们通过发送消息来告诉彼此所要做的

每个对象都有自己及其他对象构成的存储

每个对象都有其类型

某一特定类型的所有对象都可以接收同样的消息

(2)面向对象的本质:以类的方式组织代码,以对象的方式组织数据。

(3)类和对象:

类为某一类具有共同性质的事物提供一个统一的标准模型,所有对象都是以某个具体的类作为模型创建出来的,对象具有属性和行为(方法),对象之间通过方法来进行通讯,用相同类创建的对象可以接收同一种消息,提供同一种服务

(4)继承

某一类事物又派生出新类,这些新类在原有类的基础上作了更具体的实现,或扩展了更丰富的功能,就让这些新类继承原有类,直接复用原有类定义的功能,简化类的书写;继承使类与类之间产生了关系,有利于程序功能的扩展,java语言只支持单继承,不可以一个子类继承多个父类,但支持多重继承,即父类还可以继承父类的父类。

 

(5)抽象

 

可以存在抽象方法的类称为抽象类,抽象方法即没有实现功能的具体细节的方法,当多个类中存在一些共同的方法定义而实现细节又各不相同时,这些类向上抽取建立父类时,可以只抽取这些方法的功能定义而不实现这些方法的具体细节,就把这些方法定义成抽象方法,抽象方法的实现是没有意义的,所以定义了抽象方法的类必须定义成抽象类,抽象类不能创建对象。

 

(6)接口

 

 

接口是内部定义的方法都是抽象方法的类型,这点跟抽象类有些共性有有所不同,抽象类是类与类之间的从属关系,接口是用于给程序提供功能扩展用的,而接口是实现类的功能补充,使类的功能进一步扩展,由于子类实现接口或抽象类时必须实现它们的抽象方法,所以接口中的方法不应该定义的过多,尽量一个接口定义一种类型的功能,否则会使该体系过于臃肿,java允许多实现,即一个子类即可以实现多个接口,也可以一个接口被多个子类实现,接口中的成员都是有固定格式的(补充:JDK1.8中提供了接口的默认方法,使接口中也能定义了非抽象的方法(包括静态方法))。

 

(7)匿名对象

即不定义名字的对象,通常有两种用法,对象的只使用一次某个方法或者该对象可以作为参数传递。

(8)内部类

即定义在类中成员位置或局部位置上的类,当分析事物时发现事物中还有事物就用内部类,匿名内部类是没有名字的内部类,匿名内部类需要继承一个类或实现一个接口,内部类中有成员是静态的该内部类就一定要定义成静态的,非静态内部类创建对象要先有外部类对象。

(9)多态(可互换对象)

事物存在的多种形态,使用父类应用指向子类对象可以实现多态,多态的实现使程序的扩展性和可维护性得到增强,当出现新的子类时,不需要修改接口的实现,多态的弊端就是只能使用父类中定义的方法。

(10)内存机制(堆、栈、引用)

java的内存机制中主要分堆内存、栈内存和方法区等,堆内存是用于存放程序中创建的对象的区域,栈内存是java程序的主要运行代码存放的区域,栈内存中存放的代码在运行结束后会自动释放,在java程序中创建出来的对象会在栈内存中保存着它的堆内存地址值,以便对对象的调用,方法区保存着java的字节码文件对象和一些常量,java有比较实用的垃圾回收机制,大大减轻了开发人员的维护成本,在栈中没有引用的对象会被java的垃圾回收机制不定期的清理掉,以保持运行内存的充裕。

封装、继承和多态是面向对象的三大基本特征。

 

2、多线程

(1)两种实现方式

继承Thread类,复写run方法,创建对象,调用start方法开启新线程

实现Runnable接口,复写run方法,创建Thread对象,构造传入Runnable子类,调用start方法开启新线程

(2)线程间通讯

多个线程共用一个资源,但操作的方式不同。

(3)线程安全问题

多个线程操作资源时,一个线程正在对资源进行操作,而另一个线程又参与进来导致资源错乱,就产生了安全问题,解决线程安全问题的方法就是给操作资源的代码块添加同步,使用synchronized或Lock锁,但要避免死锁的发生。

3、集合框架

(1)List、Set、Map(增删改查)

集合是对象的容器,可以对对象进行存储,和数组的区别是集合没有固定长度,集合中可以存入不同的对象,集合由于有不同的数据结构,所以有丰富的操作方式和比较、排序等功能。

List

元素存取有序,元素可重复,元素存取具有索引

ArrayList:数组数据结构,线程不同步,增删慢,查询快

LinkedList:链表数据结构,线程不同步,增删快,查询慢

Voctor:同ArrayList,但线程同步,都慢

Set

元素存取无序,元素不可重复

HashSet:哈希表数据结构(通过hashCode和equals方法判断重复),线程不同步

TreeSet:二叉树数据结构(通过比较器判断重复和排序),可以给元素进行特定排序,线程不同步

Map

存取键值对,元素键不可以重复

HashMap:哈希表数据结构,可以存入null键null值,线程不同步

TreeMap:二叉树数据结构,线程不同步

HashTable :哈希表数据结构,不可以有null键null值,线程同步(子类有个Properties很好用)

JDK1.7中增强了集合的功能,使集合可以用[]、{}来表示而不需要具体的集合类型了

(2)迭代

可以通过迭代器Iterator进行迭代(Map不能直接通过迭代器迭代,可以将键集或键值对关系转换成Set进行迭代),List由于有索引,还可以用ListIterator迭代器迭代,它提供了用索引操作元素的更多操作功能

还可以用高级for循环进行迭代,高级for也能迭代数组,但高级for不能直接对容器中的元素进行操作,所以数组的迭代还是建议使用传统for

(3)泛型

泛型是一种安全机制,可以将运行时可能发生的类型转换异常转移到编译时期,让开发人员提前发现程序中的问题以便进行修复

泛型可以定义在类、方法、接口中,给类、方法、接口提供类型的限定,使它们只可以操作特定的类型,提高了程序的安全性,泛型作用在编译时期,如果在运行时动态添加的对象类型不受限制

定义泛型的方式是定义在类型的后面,用一个<>括起来表示,泛型中还可以限定类型的范围,如某一类型及其父类或某一类型及其子类。

(4)工具类

就是集合框架的工具类,里面封装了大量的静态方法,为集合提供更丰富的操作

4、IO流

IO流是java用来实现设备间的数据传输的体系

(1)字节、字符流

字节流可以操作任何的计算机数据,字符流是专门用于操作文本数据的流,提供了特定的操作文本数据的功能,字节流和字符流都分输入流和输出流,两者实现了数据的双向传输,这些流有它们的四大基类,即Writer、Reader、InputStream、OutputStream

(2)操作思路

明确源和目的,明确操作的数据类型(文本或非文本)

(3)其他流

缓冲流用于提高数据的传输效率及提供更高效的操作方法,用到了装饰设计模式,打印流可以将数据原样打印出去,File是一个用于将文件封装成文件对象的类,还有ObjectStream可以持久化对象,但要求对象需要实现Serializable接口,SequenceStream是合并多个流为一个流传输数据的流,PipedStream是结合了多线程技术的流,Properties是结合了结合技术的流,RandomAccessFile(随机读取文件流),还有一些操作内存中数据的流···

(3)IO异常

关闭流资源是一定要做的事情,所以在finally中写关闭流资源操作,判断如果流没有创建成功则不用关

5、字符串操作

(1)字符串操作是开发中比较频繁的操作,涉及到查找、获取、判断、替换等操作,在String类中有其对应的操作方法,String是一个特殊的类,它的对象不可以被修改,对象存在字符串常量池中,但不保证相同的字符串一定指向同一个内存地址。

(2)StringBuffer和StringBuilder是字符串缓冲类,它们里面的字符串是可以更改的,如果对字符串有频繁的操作建议使用字符串缓冲类,StringBuilder和StringBuffer的区别是StringBuffer是线程同步的,所以效率偏低

(3)正则表达式

正则表达式的出现是为了使字符串操作的复杂性降低,使用一系列的规则定义可以免去大量的操作代码的书写,但正则的弊端就是当操作比较复杂的时候阅读性稍差

正则对象

Pattern,将正则规则封装成对象

匹配引擎

可以通过正则对象中的方法传入要操作的字符串获得正则匹配引擎,从而对字符串进行频繁的匹配和获取操作

6、异常

(1)异常分可处理异常和不可处理异常,我们通常对异常的处理仅限于可处理的异常,可处理的异常又分为运行时异常编译编译时异常,运行时异常在编译时不报异常,在运行时如传入了不正确的参数、类型错误、资源找不到等都会发生异常,这类异常不建议编译时处理,有利于将问题暴露出来,从而将其解决,编译时异常在编译时会报告出来,如不进行处理则编译无法通过,这类异常通常都是影响程序正常功能的异常,所以一定要处理掉才能使程序正常运行

(2)异常处理

异常处理的两种方式:将异常声明抛出或捕获并处理异常

声明抛出异常在方法声明后面用throws关键字声明抛出,如果程序执行过程中有可能发生异常则用throw关键字抛出一个new出来的异常

处理异常时要先catch子类异常,父类异常放到子类异常的后面处理,这样可以先处理有针对性的异常,否则子类异常永远也执行不到(程序会报错),处理子父类继承上的异常,父类没有声明异常子类也不能声明异常,如果子类可能发生异常应该子类内部处理掉,不能抛出,如果父类抛出异常,那么子类只能抛出该异常或该异常的子集

(3)自定义异常

在开发过程中,可能会遇到特定环境下的异常,这时我们要创建一个自定义异常类来描述该异常,以对这类异常以特定的方法进行处理,自定义异常的方式是继承异常体系,使该类具备可抛性(java中只有异常体系中的类具备可抛性)

7、GUI

GUI即图形化用户界面,GUI是相对于CUI(命令行式用户界面)而言的,与CUI相比,GUI具备外形美观,操作直观,偶尔毁毁三观等特点,所以GUI已称为目前计算机操作界面的主流

(1)容器、组件

GUI主要由组件构成,容器也属于组件的一种,但容器可以添加其他组件,GUI还有布局管理器的概念,为界面提供各种布局方式,常用的组件有Frame、Button、Text、Label、Menu等等

(2)事件监听

事件监听是图形化用户界面中的重要内容,它为组件提供了一套监听机制,可以得知用户在组件上进行的操作。事件监听机制由事件源、事件、监听器等构成,组件提供事件源,当用户在组件上进行了操作就会触发事件,如果该类事件注册了监听器,那么程序就会感应到该类事件的发生,从而进行一系列程序设计者预先定义的操作

8、网络编程

网络编程是java提供的面向网络连接的设备进行数据传输的一套机制,其中比较重要的机制是网络协议,设备间只有遵从了一些相同的网络协议才能进行通讯,就像人的语言一样,只有双方遵从了相同的语言机制两者才有可能进行沟通。

(1)IP地址

IP地址是网络通讯的基础,设备通过IP地址确定另一个具体的设备,IP地址由四段0~255之间的数字组成,java将IP地址封装成InetAddress对象,通过该对象可以对IP地址进行操作

(2)UDP

UDP是一种网络通讯协议,该协议是面向无连接的,速度快、数据不安全,发送数据前接收端要先开启,否则数据会丢失,java中UDP的实现是先将数据和发送地址封包(DatagramPacket对象),在将包通过端口发送出去(DatagramSocket对象)

(3)TCP

TCP是面向连接的网络通讯协议,要通过”三次握手“建立数据通道,数据在通道中传递,速度稍慢,数据安全,java中TCP分客户端(Socket)和服务端(ServerSocket),建立连接时需要服务端先开启等待连接

(4)URL

URL把实现网络连接的过程封装在了内部,我们只需要传入资源名称就可以获取到连接好的数据传输对象,直接传输数据,这使的创建连接的操作简化了,使开发人员直接面向应用层实现网络连接而不是传输层


                                                                                                                                                                                                                 
 

 



 

第二部分:设计模式

 


1、设计原则:
(1)

 

 

 

 

逻辑代码独立到单独的方法中,注重封装性--易读、易复用(单一职责原则)。

(2)

写类,写方法,写功能时,应考虑其移植性,复用性(要考虑相关性):防止一次性代码!

(3)

熟练运用继承的思想:

找出应用中相同之处,且不容易发生变化的东西,把它们抽取到抽象类中,让子类去继承它们;

继承的思想,也方便将自己的逻辑建立于别人的成果之上。

熟练运用接口的思想:

找出应用中可能需要变化之处,把它们独立出来,封装成一个扩展功能,更有利于日后的变更。

 

(4)设计的六大基本原则:单一职责原则;里氏替换原则;接口隔离原则;迪米特法则;依赖倒置原则;开闭原则。

 

2、单例设计模式:

单例模式是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只存在一个实例。

单例的好处:

(1)某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

(2)省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

(3)有些类如交易所的核心引擎,控制着整个系统的流程,如果该类可以创建多个对象的话,系统就会发生混乱。(好比一个军队出现了多个司令同时指挥),所以只有使用单例模式,才能保证核心服务独立控制整个系统流程。


实现方法:

将构造函数私有化或用枚举定义单个枚举类

懒汉式(延迟加载)

定义引用时不创建对象,只在构造时创建该类对象,但当多线程对该对象进行操作时,容易发生线程安全问题,需要添加同步机制限定对象的创建过程

饿汉式

定义和构造对象同时进行,不会产生线程安全问题,但稍为消耗内存资源

3、装饰设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

装饰类通常都是定义在原有类的体系当中的,相比于继承,装饰类具有更灵活的设计,当不再需要装饰的增强功能或增强功能有异常时,可以轻易从体系中去除而不影响原有类的功能。

4、享元设计模式:

当一个应用中使用了大量的对象,这些对象造成了很大的存储开销,而对象的大部分状态或参数都是相同(内部状态)的时候,可以考虑使用享元模式,使用享元模式可以使这些对象的引用都共享相同的实例,降低存储开销,而对象之间的不同的状态参数(外部状态)则使用外部参数传入来实现。

应用场景:

(1)一个应用程序使用了大量的对象。

(2)完全由于使用大量的对象,造成很大的存储开销。

(3)对象的大多数状态都可以变为外部状态。

(4)如果删除对象以外的状态那么可以用相对较少的共享对象取代很多组对象。

(5)应用程序不依赖于对象标识。

                                                                                                                                                                                                                 





 

第三部分:java新特性


一、JDK1.5新特性:
 
1.自动装箱与拆箱:

 

 

 

自动装箱:基本类型自动封装到它对应的包装类型中,将基本类型赋给它的包装类型引用,java会自动创建一个包装类对象。

自动拆箱:自动地提取基本类型包装类中的值,将该对象值赋给它的基本类型引用即可实现自动拆箱。

java的基本类型包装类对应:Double(double)、Float(float)、Long(long)、Integer(int)、Short(short)、Character(char)和Boolean(boolean)

 
2.枚举

把集合里的对象元素一个一个提取出来。枚举类型使代码更具可读性,理解清晰,易于维护。枚举类型是强类型的,从而保证了系统安全性。而以类的静态字段实现的类似替代模型,不具有枚举的简单性和类型安全性。

简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。

复杂用法:Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象。

 
3.静态导入

通过使用 import static,就可以不用指定 Constants 类名而直接使用静态成员,包括静态方法。

import xxxx 和 import static xxxx的区别是前者一般导入的是类文件如import java.util.Scanner;后者一般是导入静态的方法,import static java.lang.System.out。

 
4.可变参数(Varargs)

可变参数的简单语法格式为:

methodName([argumentList], dataType...argumentName);

 
5.内省(Introspector)

是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter /setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。

一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。

 
6.泛型(Generic) 

C++ 通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。

 
7.For-Each循环 

For-Each循环的加入简化了集合的遍历操作。


二、其它新特性:

JDK1.6

JDK1.6中的新特性比较抽象,我只概括我看得懂的

1.使用Compiler API (动态编译Java源文件)

2.对脚本语言的支持如: ruby, groovy, javascript


JDK1.7

1.对Java集合(Collection)的增强支持(使用[]和{}对集合进行操作而不需要具体的集合类型)

2.在Switch中可用String

3.数值可加下划线  如:10_000_000

4.支持二进制文字  如:0b10_000

5.简化了可变参数方法的调用


JDK1.8

1.接口的默认方法(接口中允许使用非抽象方法,使用default关键字或static关键字)

2.Lambda 表达式(简化了函数式接口和匿名对象的书写)

3.函数式接口(只有一个抽象方法的接口)

4.方法与构造函数引用(使用“::”引用方法)

5.隐式final

6.Date API

7.Annotation 注解



 

 

 

 

本章总结:
1、对java基础知识的重点部分进行梳理和总结,用自己的语言概括出来,有利于知识理解的加深和运用的流畅。
2、初步对设计模式的思想进行认识和理解,了解设计模式在程序设计中的积极作用,梳理先前接触到的三种简单的设计模式,提高程序简洁性、编写的高效性和管理维护的便捷性和简易性的思维。
3、新特性是为了解决原有问题,提高编程的工作效率而出现的,所以应该实时掌握JDK新特性的应用以使编程工作向高效性和编写代码的健壮性发展。
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(java编程)