第一篇:给Java新手的一些建议——Java知识点归纳(Java基础部分)
北大青鸟华美官网: www.xiexiebang.com
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java。
这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的、和Java中各个框架相关的内容。
我觉得对于J2SE方面主要就是要掌握以下的一些内容。1.JVM相关(包括了各个版本的特性)
北大青鸟华美官网: www.xiexiebang.com
对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。
JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。我在面试有超过3年Java经验的开发者的时候,JVM几乎就是一个必问的问题了。当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。
在JVM这个大类中,我认为需要掌握的知识有:JVM内存模型和结构GC原理,性能调优调优:Thread Dump,分析内存结构class 二进制字节码结构,class loader 体系,class加载过程,实例创建过程方法执行过程Java各个大版本更新提供的新特性(需要简单了解)2.Java的运行(基础必备)
这条可能出看很简单,java程序的运行谁不会呢?不过很多时候,我们只是单纯通过IDE去执行java程序,底层IDE又是如何执行java程序呢?很多人并不了解。
这个知识点是最最基本的java开发者需要掌握的,初学java,第一个肯定是教你如何在命令行中执行java程序,但是很多人一旦把java学完了,IDE用上了,就把这个都忘了。为什么强调要知道这个呢,知道了java最纯粹的启动方式之后,你才能在启动出问题的时候,去分析当时启动的目录多少,执行命名如何,参数如何,是否有缺失等。这样有利于你真正开发中去解决那些奇奇怪
北大青鸟华美官网: www.xiexiebang.com 怪的可能和环境相关的问题。
在这里需要掌握的知识有:javac编译java文件为 class 文件java 命令的使用,带package的java类如何在命令行中启动java程序涉及到的各个路径(classpath,java。library。path,java运行的主目录等)3.数据类型
这条没有什么好多说的,无非就是Java中的基本类型和对象类型的掌握。可以再了解一些JDK如何自动转换方面的知识,包括装箱拆箱等,还要注意避免装箱之后的类型相等的判断
主要知识点:基本类型:int,long,float,double,boolean。。对应的对象类型: Integer 等类型到基本类型的转换,装箱和拆箱Object类型: equals,hashcodeString类型的特点 4.对象和实例,对象的创建
在这方面,开发者需要了解class和instance的概念以及之间的差别,这是java面向对象特性的一个基础。主要知识点有:Class和 Instance 的概念Instance 创建的过程:
1。无继承:分配内存空间,初始化变量,调用构造函数
2。有继承:处理静态动作,分配内存空间,变量定义为初始值,从基类->子类,处理定义处的初始化,执行构造方法
需要注意的点:
静态属性等从基类->子类进行初始化
默认无参构造方法相关的特性
北大青鸟华美官网: www.xiexiebang.com 5.访问控制
这也是java封装特性的一个基础,需要掌握的有:public protected default private 对于class,method,field 的修饰作用 6.流程控制
Java 流程控制的基础,虽然有些语法不一定很常用,但是都需要了解,并且在合适的地方使用它们。需要掌握的有:if,switch,loop,for,while 等流程控制的语法 7.面向对象编程的概念
这是一个java的核心概念,对于任何java开发者都需要熟练掌握。Java中很多特性或者说知识点都是和java面向对象编程概念相关的。在我的理解,一个好的开发者不仅仅需要了解这些特性(知识点)本身,也更需要知道这些对象在java的面向对象编程概念中是如何体现出来的,这样更有利于开发者掌握java这门开发语言,以及其他面向对象编程的语言。在这里只是简单罗列了一下,主要的知识点包括有:面向对象三大特性:封装,继承,多态;各自的定义概念,有哪些特性体现出来,各自的使用场景静态多分派,动态单分派的概念重载的概念和使用继承:接口多实现,基类单继承抽象,抽象类,接口多态:方法覆盖的概念和使用接口回调
北大青鸟华美官网: www.xiexiebang.com 8.Static
静态属性在java日常开发中也是经常使用,需要了解和 static 关键字相关的用法,还有和其他关键字的配合使用,如是否可以和 abstract,final 等关键字联合使用。主要需要掌握的有:静态属性的定义,使用,以及类加载时如何初始化静态方法的定义和使用静态类的定义和使用静态代码块的定义和初始化时机 9.基础知识点
这里主要罗列一些散落的,没有系统归类的一些java知识点。在日常的开发中用到也不少。这块内容其实还有很多,目前只是暂时归纳了这几个在这里:
包括有:equals,hashcode,string/stringbuffer,final,finally,finalize 10.集合框架
这个是一个需要多加掌握的部分,做java开发,可以说没有不用到集合框架的,这很重要。但是这里的知识点并不难,但是对于集合最好要了解内部的实现方式,因为这样有助于你在各个不同的场景选择适合的框架来解决问题,比如有1W个元素的集合,经常要进行contains判断操作,知道了集合的特性或者内部实现,就很容易做出正确的选择。
这里包括了如下内容(并发相关不包含在内):集合框架的体系:基础Collection,Map具体集合实现的内容,List,Set,Map 具体的实
北大青鸟华美官网: www.xiexiebang.com 现,内部结构,特殊的方法,适用场景等集合相关的工具类 Collections 等的用法 11.异常框架
异常在java的开发中可能没有那么被重视。一般遇到异常,直接上抛,或者随便catch一下处理之后对于程序整体运行也没有什么大的影响。不过在企业级设计开发中,异常的设计与处理的好坏,往往就关系着这个系统整体的健壮性。一个好的系统的异常对于开发者来说,处理应该统一,避免各处散落很多异常处理逻辑;对于系统来说,异常应该是可控的,并且是易于运维的,某些异常出现后,应该有应对的方法,知道如何运维处理,所以虽然异常框架很简单,但是对于整个企业级应用开发来说,异常处理是很重要的,处理好异常就需要了解Java中的异常体系。
这部分需要掌握的知识点不多,主要就是:异常的体系:ThrowableExceptionRuntimeExceptionErrorRuntimeException和一般 Exception 的区别,具体处理方法等 12.Java IO
IO 在java中不仅仅是文件读写那么简单,也包括了 socket 网络的读写等等一切的输入输出操作。比如说标准HTTP请求中Post的内容的读取也是一个输出的过程,等等…
对于IO,Java不仅提供了基本Input、Output相关的api,也提供了一些简化操作的Reader、北大青鸟华美官网: www.xiexiebang.com Writer等api,在某些开发(涉及大量IO操作的项目)中也很重要,一般日常的开发中也会涉及(日志,临时文件的读写等)。
在这中的知识点主要有:基本IO的体系:包括有InputStream,OutputStream,Reader/Writer,文件读取,各种流读取等NIO 的概念,具体使用方式和使用场景 13.多线程并发
多线程是Java中普遍认为比较难的一块。多线程用好了可以有效提高cpu使用率,提升整体系统效率,特别是在有大量IO操作阻塞的情况下;但是它也是一柄双刃剑,如果用不好,系统非但提升不大,或者没有提升,而且还会带来多线程之间的调试时等问题。
在多线程中内容有很多,只是简单说明一下Java中初步使用多线程需要掌握的知识点,以后有机会单独再详细介绍一些高级特性的使用场景。多线程的实现和启动callable 与runable区别syncrhoized,reentrantLock各自特点和比对线程池future 异步方式获取执行结果concurrent 包lock..14.网络
Java中也是提供了可以直接操作 TCP协议、UDP协议的API。在需要强调网络性能的情况下,可以直接使用TCP/UDP 进行通讯。在查看Tomcat等的源码中,就可以看到这些相关API的使用情况。不过一般
北大青鸟华美官网: www.xiexiebang.com 也比较少会直接使用TCP,会使用诸如MINA、Netty这样的框架来进行处理,因为这个方面的开发涉及不多,所以就不再详细罗列了。15.时间日期处理
几乎对于每个应用来说,时间日期的处理也是绕不过去的,但是JDK8 之前的时间相关API用法并不友好。在那个时代,可以选择Joda等时间框架。到了JDK8 发布之后,全新的时间API基本融合了其他框架的优点,已经可以很好的直接使用了。
对于Java开发者来说,需要熟练地使用API来对时间和日期做相关的处理。
具体知识点不再罗列,会在以后再写个专门的文章来总结一下JDK8中时间日期API的用法。
16.XML解析/ JSON解析
其实这两块内容都不是J2SE里面的内容,但是在日常开发中,和其他程序交互,和配置文件交互,越来越离不开这两种格式的解析。
不过对于一个开发者来说,能够了解一些XML/JSON具体解析的原理和方法,有助于你在各个具体的场景中更好的选择合适你的方式来使得你的程序更有效率和更加健壮。
XML:需要了解 DOM解析和 SAX解析的基本原理和各自的适用场景
JSON:需要了解一些常用JSON框架的用法,如 Jackson,FastJson,Gson等。
北大青鸟华美官网: www.xiexiebang.com 17.Maven的使用
Maven也不是Java里面的内容,但是maven是革命性的,给java开发带来了巨大的便利。从依赖的引入和管理,开发流程的更新和发布产出,乃至版本的更新,使用maven可以大大简化开发过程中的复杂度,从而节省大量时间。可以说,maven已经成为java开发者的标配了。所以我把maven也作为一个java开发者对于基础必备的知识点。以后会再放上一些我的一些对于maven使用的经验和技巧等,这里就不再细说了。18.泛型
这是JDK5开始引入的新概念,其实是个语法糖,在编写java代码时会有些许便利,一般的应用或者是业务的开发,只需要简单使用,不一定会用到定义泛型这样的操作,但是开发一些基础公共组件会使用到,可以在需要的时候再细看这个部分,一般情况下只要会简单使用即可。19.标注
也是jdk5 之后引入的。spring是个优秀的框架,最开始就以xml作为标准的配置文件。不过到了Spring3 之后,尤其是 spring-boot 兴起之后,越来越推崇使用标注来简化xml配置文件了,对于开发者来说,可以节省不少xml配置的时间。但是劣势是在于标注散落在各个类中,不
北大青鸟华美官网: www.xiexiebang.com 像xml,可以对所有配置有个全局性的理解和管理,所以还没有办法说完全就取代所有的xml。对于一般开发者,会使用标注即可,一些公共组建的开发者可能会需要了解标注的定义和实现,可以在具体需要的时候再细看。20.RMI
RemoteMethodInvocation,Java语言特有的远程调用接口,使用还是比较简单方便。不过需要跨语言的情况下,就需要使用 webservice 等其他方式来支持。一般来说,程序都不需要使用RMI,不过可以在特定的情况下使用,我就在一个项目中,使用RMI来进行程序远程启动停止的控制。21.JNI
Java Native Interface,可以允许Java中调用本地接口方法,一般用于C/C++代码的调用。需要注意的是在java中加载so/dll文件的路径问题,本身调用接口并不复杂,但是经常在是否加载了所需的本地接口库中花费较多时间。
以上也只是简单介绍了下我对于这些java基本知识点和技术点的一些看法和介绍,这些内容都源自于我这些年来使用java的一些总结,希望给刚刚接触Java,或者打算从Java开发的人一些经验,希望能够更有效率地学习和使用java,避免走了弯路浪费了宝贵的时间。这当中还
北大青鸟华美官网: www.xiexiebang.com 有些内容不够完善的地方,会通过以后的文章再添加上。由于个人能力有限,当然其中也会有些错误和疏漏,欢迎指正,一起讨论,共同来把这篇文章再完善下,希望它可以真正帮助到有需要的人。
第二篇:java面试题(基础部分)
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型。数组有没有length()这个方法? String有没有length()这个方法?数组没有length()这个方法,有length的属性。
String有有length()这个方法。Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
24最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException,EmptyStackException, IllegalArgumentException,IllegalMonitorStateException, IllegalPathStateException,IllegalStateException,ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException,NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, Secur
ityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationExceptionerror和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
是否可以继承String类?
String类是final类故不可以继承。
构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
33try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不
会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
编程题: 用最有效率的方法算出2乘以8等於几?<< 3
两个对象值相同(x.equals(y)== true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
36当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
37swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、short、char 或者 byte。long,string 都不能作用于swtich。
Hashtable和HashMap
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必
须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
1.Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是
public static,所有方法默认情况下是public.一个类可以实现多个接口。
2.Java中的异常处理机制的简单原理和应用。
当Java程序违反了Java的语义规则时,Java虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是Java类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
3.垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
4.线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切地唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
5.Error与Exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,Exception表示需要捕捉或者需要程序进行处理的异常。
6.在java中一个类被声明为final类型,表示了什么意思?
表示该类不能被继承,是顶级类。heap和stack有什么区别。
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。
8谈谈final, finally, finalize的区别。
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。9Anonymous Inner Class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
10Static Nested Class 和 Inner Class的不同
Nested Class(一般是C++的说法),Inner Class(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象.
第三篇:JAVA基础知识点总结
1)开发Java语言的公司? Sun(Sun Microsystems)太阳微电子公司开发 2)
Java的3个版本?
J2SE(Java2 Standard Edition)标准版
J2EE(Java 2 Platform,Enterprise Edition)企业版 J2ME(Java 2 Micro Edition)微小版
在5.0以后新版本中称作:JavaSE JavaEE JavaME 3)
Java语言的几个主要特点?平台无关性:能运行于不同的平台上
安全性:去掉了指针操作,内存由操作系统分配 面向对象:利用类使程序更加利于维护
分布式:可以使用网络文件和使用本机文件一样容易 健壮性:检查程序编译和运行的错误 4)
Java的三大核心机制
虚拟机机制:利用虚拟机解释字节码执行java程序实现跨平台 垃圾收集机制:自动内存回收
代码安全性机制:加载代码后校验代码后再执行代码 第2章Java语言的开发环境 1)
JDK是什么?
JDK(Java Development Kit)Java开发工具包。包括了JRE,是开发Java的人员必备的开发运行Java程序的工具。2)
JRE是什么?
JRE(Java Runtime Environment)Java运行环境,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。3)
JVM是什么?
JVM(Java Virtual Machine)Java虚拟机,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。4)
安装JDK的操作系统问题?
必须针对于不同的操作系统下载安装不同的JDK,例如windows下安装针对于windows的JDK,linux下安装针对于linux的JDK。
5)需要配置的相关环境变量? path:用于搜索外部命令,例如编译程序的javac命令,执行程序的java命令
classpath:用于搜索类,即class文件,例如可以在不同的位置执行类文件 6)
配置环境变量的方式? 有两种:临时配置和持久配置
临时配置:在命令行下用set 变量名=变量值,仅在当前命令行窗口有效
持久配置:在我的电脑——属性中配置,持久有效 7)可以编写Java程序的常见开发工具? 记事本,EditPlus,ULTRAEDIT,Eclipse,Jbuilder,NetBeans 8)
Java文件的类型?
有两种:
扩展名为java的文件:是Java源文件,属于编译之前的纯文本文件,存储java源代码。
扩展名为class的文件:是Java类文件,属于编译之后的二进制文件,存储字节码。9)
Java的编译运行原理?
首先编写java源文件,然后编译成class类文件,然后通过虚拟机解释成机器码到硬件执行。
10)Java是编译型语言还是解释型的语言?
既不是完全编译型,也不是完全解释型,是半编译半解释的。第3章Java程序的基本结构 1)
Java语言区分大小写吗?
区分,不管是数据还是标识符或者关键字都区分大小写,例如public不能写成Public,“abc”不能写成“ABC”,int i不能写成INT I等等。2)main方法是作什么用处的? 这是程序的入口方法,是由虚拟机自动调用的。
3)语句必须用分号结束吗? 必须的,但是代码块{}可以用分号结束,也可以不用分号结束
4)
Java中有几种注释,各自的功能
有三种:
单行注释//:加在行首只能注释一行 多行注释/* */:注释多行,但不能嵌套使用
文档注释/***/:用于生成HTML形式的文档,需要配合javadoc命令实现 5)Java语言的数据类型是强类型还是弱类型? 是强类型,意味着每一个变量都必须明确声明数据类型。6)
Java语言中数据类型的划分?有什么区别? 分成基本类型和引用类型两大类。
基本类型:有8种,只能存储单一的值,不以对象的形式存在引用类型:除了基本类型之外其他的都是引用类型,能够存储复杂数据类型,以对象的形式存在 7)
基本类型都有哪8种类型? 布尔类型:boolean 占1字节 字符类型:char 占2字节
整型:byte 占1字节 short 占2字节 int 占4字节 long 占8字节
浮点型:float 占4字节double 占8字节 8)
布尔值可不可以用0或者非0数代替?
不可以,布尔值只能是true和false,不能使用数字,这和C语言是不一样的。9)
直接写个整数10默认是什么类型的?
整型的直接量例如10,100等默认的数据类型都是int型 10)如何让一个整型的直接量变成long型的? 在直接量后面加大写L后者小写l,例如10L 11)整型数据在程序中直接使用可以使用什么进制? 10进制,8进制,16进制,但不能使用二进制 12)浮点运算在Java中有没有误差? 有误差,所以精密运算请使用BigDecimal类 13)直接写一个3.14的直接量是什么数据类型的?
是double型,如果想表示是float的3.14必须写成3.14F或者3.14f,double型的3.14也可以写成3.14D 14)char型采取的是什么类型的字符集?
是Unicode全球统一编码,支持任何世界上官方的语言中的字符
15)常见的转义字符有哪些? 转义序列 名称 b 退格 t 制表 n 换行 r
回车
” 双引号 ’ 单引号 反斜杠
16)常见的Unicode字符对应的编码?
大写的A到Z是对应65到90,小写的a到z是对应97到122,字符0到9是对应48到57
17)空字符是不是用’’(两个并列的单引号)来表示? 不是,空字符用’u0000’来表示,两个并列的单引号什么也不是。
18)点,分号,花括号的各自的作用?
点的作用有两个:一个是使用类或对象中的成员,用对象.成员,再一个就是包名和子包名之间的分隔符,例如顶层包名.子包名 分号的作用是表示语句结束 花括号的作用是代表一个语句块
19)语句和关键字之间可以有任意的空白吗? 可以的,例如System.out.println(100);就是正确的语句,但是关键字本身不能加空白或换行
20)标识符是什么?
标识符就是指在程序中给包,类,接口,方法,变量起的名字 21)标识符有什么起名规则? 1. 应以字母、下划线、美元符开头 2. 后跟字母、下划线、美元符或数字 3. 不能用关键字和保留字
4. 严格区分大小写 5. 名称长度没有限制 22)中文的变量名可以吗?
是可以的,例如 int 数字 = 10;这个语句是正确的。因为java中采取Unicode字符集,所以任何的Unicode中的字符都可以作为标识符的名称,但考虑字符集的支持问题推荐还是使用英文字母命名。
23)关键字和保留字有区别吗?
在1.5后没有区别,都被称作关键字,但是1.5之前认为关键字是在Java中有特殊用途的不允许编程人员擅自改作其他用途,而保留字是在Java中没有特殊用途但不允许编程人员擅自改作其他用途,按此说法goto和const应该是此意义上的保留字。
24)true,false,null可以用作标识符命名吗?
不可以,这3个虽然不是关键字,但都是有特殊用途的值,也不能作为标识符命名
25)一条声明语句可以声明多个变量吗? 可以的,例如以下声明都是正确的int i;int i,j;int i = 10,j;int i,j = 10;
int i = 10,j = 20;
26)变量在没有赋值的情况下可以使用吗?
不可以,变量没有赋值使用会报出变量未初始化的编译错误。27)常量有什么特点?
在声明变量的时候加上final修饰符即为常量,表示这个变量只能被赋一次值。
28)算数运算符有哪些? 基本算数运算符有+-* / % ++--
29)单目运算符,双目运算符,三目运算符都是什么意思? 其实也有叫一元运算符,双元操作符,三元操作符的,指的是
有几个操作数形成一个完整表达式,例如++就是一个单目运算符,只需要一个操作数就可以形成表达式,像i++,而+运算符就是双目运算符,需要两个操作数形成表达式,例如5 + 3,还有三目运算符,例如5 > 3 ? 0 :-1
30)++和--放在前面和放在后面有什么区别?
如果是在一个表达式中,那++放后面表示先运算表达式,然后再进行自增运算,如果在一个表达式中,++放前面,则表示先进行自增运算然后在运算表达式。--同样道理。例如: int i = 10;int j = i ++;//先进行赋值运算然后再进行自增运算j的结果是10
int i = 10;
int j = ++ i;//先进行自增运算然后再进行赋值运算
j的结果是11
31)-5 % 2等于几,5 %-2等于几?
-5 % 2等于-1,5%-2等于1,运算得到是正数还是负数取决于第一个操作数的符号 32)5 / 2 结果是不是2.5?
不是,是2,因为5和2都是int类型,所以不可能得到double型的结果。
33)比较运算符有哪些?
有><>=<===!= 六项基本比较运算 34)任何数据类型都可以使用> < >= <=运算符吗?
不是所有数据类型,例如true>false这个表达式就是编译错误,布尔类型和引用类型的表达式只能用==和!=两个比较运算,例如”abc” <= ”xyz” 这个表达式也是编译错误的 35)’a’ > ’b’这个表达式编译正确吗?
编译正确,’a’和’b’是字符类型,内部用Unicode编码表示的话a是97,b是98,所以实际上比较的是97>98,结果为false 36)逻辑运算符有哪些?
有 &逻辑与,|逻辑或,!逻辑非,^ 异或,&& 短路与,||短路或
37)逻辑与,逻辑或和短路与,短路或有什么区别? 逻辑与和短路与的区别是:
如果是逻辑与&,不管第一个表达式是true还是false,都会执行第二个表达式,例如a > b & x < y,即使a > b为false,也会执行x > y
如果是短路与&&,如果第一个表达式为false,将不会执行第二个表达式
例如a > b && x < y,如果a > b为false,就不会执行x > y
以此类推,逻辑或和短路或的区别是:
如果是逻辑或|,不管第一个表达式是true还是false,都会执行第二个表达式
如果是短路或||,如果第一个表达式为true,将不会执行
第二个表达式
38)与或非三个逻辑运算符的优先级是怎么排列的? “非”优先级最高,“与”其次,“或”优先级最低 39)原码,反码,补码分别是什么意思?
原码:将数字转换为二进制,第一位为符号位,正数为0,负数为1
例如:12的原码是00001100-12的原码是10001100
反码:正数的反码和原码相同,负数的反码将原码符号位之外的位逐位取反
例如:12的反码是00001100-12的反码是11110011
补码:正数的补码和原码相同,负数的补码将反码加1 例如:12的补码是00001100-12的补码是11110100 最后强调一点,计算机存储数据用补码形式来存储。40)位运算符都有哪些?
&与 |或 ^异或 ~非 >>右移 <<左移 >>>无符号右移 41)1<<35怎么理解?
1是int类型是32位,所以需要把35%32=3,所以事实上是和执行1<<3等价的42)数据类型转换需要遵循什么原则?
小类型向大类型转换,是自动转换的,或者说隐式转换的 大类型向小类型转换,是需要强制转换的,或者说显式转换例如:byte b = 1;
short s = b;//自动转换
b =(byte)s;//强制转换
43)byte b = 10这个语句是正确的,为什么10是int型比byte大还不需要强制转换呢?
因为在java中做了特殊处理,其中规定byte,short,char类型可以直接赋予int类型的直接量,例如: byte b = 10;short s = 10;char c = 10;
以上赋值语句都是正确的。
但是不能超出超出类型的范围,例如以下赋值就是错误的: byte b = 128;
如果超出范围,必须得作强制转换,例如以下语句是正确的: byte b =(byte)128;
需要强调的是,必须是int类型的直接量,以下语句就是错误的: byte b = 10L;
10L不是int类型的直接量。
44)byte b =(byte)300;强制转换后的结果是44,是按照什么规律得出来的?
是先把300转换成二进制,然后根据byte类型的大小截取了后8个位
300的补码是00000000 00000000 00000001 00101100
b的结果是:00000000 00000000 00000001 00101100 结果为44 45)byte b =(byte)true;这个转换成立吗?
不成立,布尔值和数字是不兼容的,不能作任何转换。
46)int i =(int)“100”;这个转换成立吗?
不成立,引用类型和基本类型是不能直接强制转换的,需要用包装类的方法来转换。
47)char型和short型哪个比较大?
不能说哪个大,哪个小,这两个类型char的取值是从0~65535,而short类型的取值是-32768~32767,这个两个类型之间的转换都需要强制转换。
48)字符串是不是基本类型?
不是,String是java.lang包中的一个类,是引用类型的,8种基本类型中没有一个是String类型。49)空字符串用什么来表示?
用””(两个并列的双引号)表示,代表0个长度的字符串对象。50)String s = “”;和String s = null;有什么区别?
第一个表示s被赋值,指向了一个字符串对象,第二个表示s没有指向任何对象实例,是真空
51)两个字符串用什么运算符可以连成一个字符串? 用+运算符,例如”abc” + “xyz”最后的结果就是“abcxyz” 52)数学运算符加法和字符串连接符都是+,怎么区分? 是通过运算符两边的操作数来判断的,如果两边的操作数都是数字型的基本类型,则进行数学运算,如果两边的操作数有一个是字符串,则把另一个操作数也转换为则进行字符串连接运算。例如:+ 4 的结果是9 “5” + 4的结果是54
53)判断字符串内容相同用什么方法?
用equals方法判断内容相同,==只能判断引用是否相同 54)提供用户输入使用哪个类 使用javav.util.Scanner类
55)if语句可以用if(-1)形式判断吗? 不可以,数字不能代替布尔值
56)if语句和循环语句的花括号什么时候可以省略?
当执行的语句只有一句的时候 57)switch语句有哪些规则?
表达式expr的返回值必须是下述几种类型之一:int, byte, char, short或枚举常量;
case子句中的值必须是常量,且所有case子句中的值应是不同的,也必须是下述几种类型之一:int, byte, char, short或枚举常量
default子句是任选的;
break语句用来在执行完一个case分支后使程序跳出switch语句块;
58)对于退出循环break和continue有什么区别? break是退出整个循环
continue是退出当前循环继续下一次循环 59)声明数组创建数组的方法? 以下声明都是合法的: int [] a;int a[];String[] a;
以下创建数组对象都是合法的: int[] a = new int[3];int[] a = {1,2,3};int[] a = new int[] {1,2,3};
60)int[] x和String[] s这两个数组对象,哪个是基本类型,哪个是引用类型?
两个都是数组对象,都是引用类型的61)数组元素下标最小是多少,最大是多少,超出范围会怎么样?
最小是0,最大是数组元素个数减一,超出范围将会出现下标越界异常
62)得到数组长度用length属性还是length()方法? 是length属性,得到字符串长度才有length方法
63)声明int[][] a = new int[3][],a是一个二维数组,a[0]本身
是什么类型的?
二维数组的元素都是一维数组,a[0]是int[]类型的 64)数组的大小一经创建可不可以改变大小了? 不可以,数组是定长的,一经创建就不能再改变大小了 65)可以把2个int型,3个double型,4个String型的值放到一个数组中吗?
不可以,数组的元素类型必须是相同类型的。66)java中的多维数组必须是要形成矩阵排列吗? 不一定,也可以是不规则的。67)操作数组比较方便的实用类?
java.util.Arrays类提供了很多关于数组的实用方法。第4章对象和类 1)OOP是什么意思? Object Oriented Programming(面向对象编程)
2)
类和对象的区别?
类:对象的蓝图,生成对象的模板,是对一类事物的描述,是抽象的概念上的定义
对象:对象是实际存在的该类事物的每个个体,因而也称为实例 3)
类之间的3种关系? 依赖关系(uses-a)聚集关系(has-a)继承关系(is-a)4)
一个java源文件可以写多个类吗?
可以,但必须只能有一个公有类,并且文件名和公有类的类名相同。5)类中有哪些成员?
有属性(数据域),方法,构造器(构造方法)
6)
构造方法和普通方法的区别?
构造方法没有返回值,方法名必须和类名相同,需要用new语句调用构造方法。7)
普通方法可不可以也类名作为方法名?
是可以的,因为调用普通方法的语法和调用构造器的语法不一样。8)
一个构造器调用另外一个构造器需要用什么语法? 用this()语法调用另外一个重载构造器,需要注意的是调用语句必须是构造器中的第一句 9)
什么时候虚拟机会自动添加一个默认构造器?
当类中没有显式定义任何构造器的时候,虚拟机会自动添加一个无参的构造器
10)实例成员和静态成员的区别?
实例成员:是属于对象实例的,用对象.成员名称语法调用 静态成员:和对象实例无关,是属于类本身的,用类名.成员名称语法调用
11)静态初始化块statci{}的执行时机是什么时候? 在类被加载的时候,仅执行一次。
12)静态方法可不可以直接调用同一个类中的非静态方法? 不可以,静态方法不能直接调用一个非静态成员,需要用对象调用。
13)包是什么?
包实际上就是物理上的文件夹,可以把类放到不同的包中。14)把一个类放到包中,需要在类中加上什么语句? 需要加上包声明package语句,必须写在源文件的第一句。15)什么时候需要导入类?用什么语句?
当使用的类和当前类并不在同一个包中的时候,用import语句导入。
16)默认包中的类可以导入吗?
不可以,不在默认包中的类无法使用默认包中的类。17)java中哪个包中的类是自动导入的? java.lang包
18)什么叫做完整类名? 顶层包名.子包名.类名
19)静态导入语句有什么作用?
在使用类中的静态成员的时候前面不需要加类名前缀。
20)局部变量和全局变量的区别? 区别 局部变量 全局变量
声明位置 方法或块内部 方法外类内部 访问权限修饰符 没有访问权限 有访问权限
默认值 没有默认值
有默认值
使用形式 直接使用 对象调用
作用域
在方法或语句块内部 整个类
生命周期 进入方法或语句块创建退出方法或语句块销毁 随着对象的创建而创建随着对象的销毁而销毁
21)赋值语句赋给目标的是值还是引用?
如果是基本类型则赋的是值本身,引用类型则赋的是引用地址 第5章继承和多态 1)类的继承是谁继承谁?
是子类继承了父类,子类也称为派生类,父类也称为超类或基
类 2)子类继承了父类的什么东西?
子类可以继承父类的数据域(属性),方法,但构造器不能继
承 3)
私有成员能被子类继承吗?
能继承,但是由于访问权限的控制,在子类中不能直接使用父类的私有成员 4)
Object是什么类?
这个所有类的根类,任何类如果没有写显式的继承语句,默认都是直接继承Object类的 5)java中是单继承还是多继承?
是单继承,一个子类只能有一个父类 6)
访问权限修饰符有几种,访问的范围又是多大? 有四种:
private:私用 只能在被类中被访问 default:默认 只能被同一个包中的类访问
protected:受保护的 只能被同一个包中的类和不同包中的子类
访问
public:公有 可以被任何类访问 7)
覆盖方法的规则有哪些?
子类覆盖方法和父类被覆盖方法的方法返回类型,方法名称,参数列表必须相同
子类覆盖方法的访问权限必须大于等于父类的方法的访问权限
方法覆盖只能存在于子类和父类之间
子类覆盖方法不能比父类被覆盖方法抛出更多异常 8)
参数列表是否相同从哪几方面看?
从三方面看:参数个数,类型和顺序,需要注意的是参数的名字不相同是无所谓的 9)
覆盖方法的规则有哪些? 方法名相同
方法的参数类型,个数,顺序至少有一项不同 方法的返回类型和修饰符均不受限制
10)可变长参数的声明格式是什么?实际上是什么类型的? 类型 „ 变量,实际上是一个一维数组 11)this和super是作什么用处的?
this:本身代表当前的对象引用,可以用this.成员名称调用当前对象的属性和方法,如果属性和局部变量重名,可以用this.属性名和局部变量区分开。也可以用this()语法调用本类重载构造器。
super:本事是一个特殊关键字,可以用super.成员名称调用从父类继承的属性和方法,也可以用super()语法调用父类构造器。
12)super代表子类中的父类对象引用吗?
不,这个错误的说法,super不代表任何对象引用,仅仅是一个关键字
13)什么时候子类构造器会自动调用父类无参构造器? 当子类构造器中没有任何显式构造器调用的时候,即既没有this()调用也没有super()调用的时候
14)一个父类类型的引用变量可以引用一个子类的实例吗? 可以,这个引用变量是一个多态对象 15)多态对象有什么特点?
多态对象只能使用父类的成员,但如果多态对象使用了被子类覆盖的方法,则会动态绑定使用子类的成员,称为虚拟方法调用
16)引用类型之间的类型转换需要遵循哪些规则? 自动转换:从子类到父类的类型可以自动转换 强制转换:从父类到子类的类型要强制转换 无继承关系的类型转换是非法的 17)instanceof操作符是作什么用处的?
可以判断一个对象的类型是否是某一个类的类型或子类,也可以判断这个对象的类型是否是一个接口的实现类 18)toString方法什么时候会自动被调用?
在打印语句中传入引用类型的对象或者对象和字符串作连接时
19)默认的equals方法实现的是比较内容还是比较引用地址?
在Object中是比较引用地址。
20)覆盖equals方法和hashCode方法有什么规则? 必须保证当两个对象equals比较为true的时候,返回的hashCode相同,当比较为false的时候,返回的hashCode不同21)java中有几个包装类?
有8个包装类,正好对应8种基本数据类型。
分别是:Boolean Byte Short Integer Long Character Float Double 22)装箱和拆箱分别是什么意思?
装箱指的是把基本类型包装成包装类的引用类型 拆箱指的是把包装类形式的引用类型转换为基本类型 例如:
Integer objInt = new Integer(10);//装箱
int i = objInt.intValue();
//拆箱
23)JDK1.4和1.5的装箱和拆箱有什么区别?
自动拆装箱,例如: Integer intObj = 10;//自动装箱 int i = intObj + 5;//自动拆箱
24)final修饰符如何使用,使用了final修饰符有什么特点? final修饰符可以修饰类,方法,变量 final类为最终类,不能被子类继承 final方法为最终方法,不能被子类覆盖 final变量为常量,只能赋一次值
25)abstract修饰符如何使用,使用了abstract修饰符有什么特点?
abstract修饰符可以修饰类和方法 abstract类为抽象类,是不能创建对象的abstract方法为抽象方法,只有方法的声明,没有具体的实现 需要注意的是:
有抽象方法的类一定是抽象类 抽象类不一定有抽象方法
抽象类也有构造器,但不能创建对象实例 26)abstract不能和哪些修饰符配合使用? 不能和private,static,final一起使用 27)可以在非抽象方法中调用抽象方法吗? 可以,模板方法设计模式就是典型的这种调用 第6章 泛型程序设计 1)泛型的特点是什么? 主要特点是类型参数化,后期绑定数据类型 2)泛型支持基本类型吗?
不支持,只支持引用类型 3)如果没有传入类型参数,默认是什么类型? 默认是Object类型
4)泛型方法有什么特点?
将泛型参数声明在方法中,调用方法的时候绑定泛型 5)
泛型类声明泛型参数的时候,
么意思?
表示绑定的类型必须是A类型后者是A类型的子类或实现类 第7章 接口和内部类
1)声明一个接口的关键字是什么? interface关键字
2)
接口中的成员有什么特点?
数据域必须是(public static final修饰)公有静态常量 方法必须是(public abstract修饰)公有抽象 没有构造方法 3)接口能创建对象实例吗? 不能,接口没有构造器,不能创建对象
4)
接口和类的关系?
接口和类之间是实现关系,一个类用implements语句实现了某接口,这个类被称为接口的实现类,一个类可以实现多个接口,一个类实现了某接口,必须覆盖这个接口中的所以方法,否则这个类必须是个抽象类 5)
接口和接口的关系?
接口和接口之间是继承关系,一个接口用extends继承另外一个接口,称为这个接口的子接口。一个接口可以继承多个父接口 6)
内部类如何定义?
一个类声明在另一个类的里面,这个类就被称为内部类,而外面的类被称为外部类 7)
内部类可以分成几种?
实例内部类:声明在方法外边没有static修饰符 静态内部类:声明在方法外边有static修饰符 局部内部类:声明在方法里边 8)
如何创建实例内部类的对象实例? 需要用外部类的对象来创建 例如: class A {class B {
}
}
如果像创建B类的实例,则必须用以下语句: A a = new A();A.B b = a.new B();9)
如何在实例内部类中访问外部类的成员?
在实例内部类中可以直接使用外部类的成员,不需要创建外部类的对象实例,但是如果在内部类中的成员名称屏蔽隐藏了外部类的成员(即外部类和内部类的成员名相同),则需要用“外部类名.this.成员名”访问外部类成员 第8章异常处理
1)异常的对象的根类是哪个类? 是Throwable类
2)
Throwable类有哪两个分支?
分成Error类和Excepion类两个分支 Error类表示严重错误
Exception类表示可以在程序中处理的错误 3)
Exception类有哪两个分支?
分成运行时异常和非运行时异常(已检查异常)运行时异常编译不检查,在运行时才会发生异常
已检查异常编译时就会作检查,不处理异常则通不过编译 4)如果在try块中发生异常,那么程序将会跳转到哪? 会跳转到catch语句块 5)catch语句可以用父类类型捕获子类异常吗? 因为有多态特点,是可以的6)处理异常代码finally语句会在什么时候执行? finally代码在任何时候都会执行,不管有没有发生异常。7)
如何声明已检查异常,由谁来处理这个异常? 用throws语句来声明一个已检查异常,由方法的调用者来处理这个异常 8)
如何抛出一个异常? 用throw语句抛出
9)如何创建一个自定义的异常类? 创建一个类,只要让它继承任何一个现有的异常类就可以了 10)覆盖方法对于异常有什么要求? 覆盖方法不能比父类方法抛出更多异常 第9章反射,代理,标注
1)
获得一个类型的Class对象有哪几种途径?
方法1:对象.getClass()方法2:类型名.class 方法3:Class.forName()2)
反射相关的类型都有哪些? Class 代表一个运行时类 Field 代表一个类的属性 Method 代表一个类的方法 Constructor 代笔一个类的构造器 3)
如何声明一个自定义标注? [<修饰符>] @interface <标注名>{ 返回值方法名称(); 返回值方法名称(); „„ } 例如:
public @interface MyComment { int id();String info();} 4)
java有几个内置标注? 有3个
@Override——用于修饰此方法覆盖了父类的方法,而非重载。@Deprecated——用于修饰已经过时的方法。
@SuppressWarnings——用于通知Java编译器禁止特定的警告。第10章 java常用类 1)
字符串String是可变类还是不可变类?
是不可变类,一经创建就不能修改其内容了 2)
字符串的常用方法有哪些? charAt方法:可以返回指定位置的字符 substring方法:可以截取子字符串 length方法:返回字符串长度 indexOf方法:查找子串的位置 lastIndexOf方法:反向搜索字串的位置 replaceAll方法:替换字符串 split方法:分解字符串
toLowerCase, toUpperCase方法:字符串大小写转换 3)StringBuffer类和String类有什么区别? StringBuffer是可变类,String是不可变类
4)StringBuffer类和StringBuilder类有什么区别? StringBuffer类是线程安全的,StringBuilder类是线程不安全的5)Math类主要提供了哪些方法?
Math类提供了大量的和数学运算相关的静态方法 6)Set集合和List集合共同的父接口是什么? 是Collection集合7)
Set集合和List集合有什么区别? Set: Collection的子接口,不记录元素的保存顺序,且不允许有重复元素
List: Collection的子接口,记录元素的保存顺序,且允许有重复元素 8)
ArrayList和LinkedList有什么不同?
ArrayList 的内部实现是基于内部数组Object[],所以从概念上
讲它更像数组
LinkedList的内部实现是基于一组连接的记录,所以它更象一个链表 结构,所以它们在性能上有很大的差别。ArrayList 随机访问比较块,但插入和删除元素比较慢 LinkedList但插入和删除元素比较快,但随机访问比较慢 9)
HashTable和HashMap有什么不同?
HashTable是线程安全的,HashMap是线程不安全的10)Vector和ArrayList有什么不同? Vector是线程安全的ArrayList是线程不安全的 第11章 IO流 1)
流分成哪两类?
按照单位划分分成字节流和字符流。按输入输出分成输入流和输出流 2)
和文件流相关的有那几个类? FileInputStream文件输入字节流 FileOutputStream文件输出字节流 FileReader文件输入字符流 FileWriter文件输出字符流 3)
文件流操作应该用字节流还是字符流? 如果是纯文本文件应该用字符流 如果是二进制文件应该用字节流 4)
文件操作用哪个类? 用java.io.File类 第12章 线程 1)
创建一个线程类的两种方式? 继承Thread类 实现Runnable接口 2)线程体应该放在哪个方法里面? run方法 3)启动新的线程用什么方法?
用start方法
4)一个线程对象能够用start多次启动吗? 不可以,一个线程方法只能start一次
5)线程有哪几种主要状态? 有四种,分别是:新生状态,可运行状态,阻塞状态,死亡状
态 6)
线程的同步需要用什么方法? 旧的方法是用synchronized关键字
新的方法是用ReentrantLock类的lock和unlock方法
第四篇:Java基础知识点总结-Ch1
Java基础知识点总结
第一章 Java语言概述
1.面性对象语言的基本特征。
Java语言的特点。最大优势。
Java语言是区分大小写的。
2.Java虚拟机的核心。
环境变量classpath设置中的“.;”是指可以加载应用程序当前目录及其子目录中的类。环境变量的变量值的最后是以“rt.jar;.;”结束。
3.编写源文件时不可以使用Word编辑器,因为他含有不可见字符。
要用记事本或Edit。源文件的扩展名是java。
4.一个Java应用程序的源文件必须有一个类含有public static void main(String args[ ])的方法,这样类的应用程序叫做主类。
5.源文件的名称必须与有public修饰的类的名称相同。
若源文件有多个类,那么只能有一个是public类;
若只有一个类是 public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java;
若源文件没有public类,那么源文件的名字只要和某个类的名字相同即可,并且扩展名为.java。
6.编译时,Java编译器是什么。
进入某个文件夹的命令是“cd 目录名”;退出某个文件夹的命令是“cd..”。
7.编译源文件后将生成多个扩展名为.class的文件,每个扩展名是.class的文件夹存放一个类的字节码文件,文件名与该类的类名相同。这些字节码文件被存放在与源文件相同的目录中。
8.运行时,Java解释器是什么。
Java应用程序总是从主类的main方法开始执行。
9.在运行字节码文件是不可以带有扩展名。
当Java应用程序有多个类时,Java命令执行的类名必须是主类的名字(不带扩展名)。
10.例子:有一个源文件名字叫Apple.java,其中包括3个类,名字分别是Apple, Banana, Orange,有1个是主类,则主类名是什么,生成多少个字节码文件,字节码文件名称是什么,在编译,运行时语句分别是怎样的。
11.Application程序又称什么,Applet程序又称什么,哪一个是源文件编译时运行的程序。
12.J开发一个Java程序要经过的三个步骤。
13.单行注释,多行注释的标记分别是什么
14.javac *.java的意思。
15.Allmans风格又称什么,Kernighan风格又称什么,两者各自的意思是什么。
第五篇:Java基础学习知识点总结
黑马程序员_毕向东_Java基础视频教程
Java基础学习知识点总结 2016年01月06日
day01
一、基础知识:软件开发
1、什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合。
2、常见的软件:系统软件:如:DOS,Windows,Linux等。应用软件:如:扫雷,迅雷,QQ等。
3、什么是开发?制作软件。
二、基础知识:人机交互方式
4、软件的出现实现了人与计算机之间的更好的交互。
5、交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作。命令行方式:需要有一个控制台,输入特定的指令,让计算机完成一些特定的操作。较为麻烦,需要记录住一些命令。
三、基础知识:常用的DOS命令
6、点击开始在运行栏输入“cmd”进入dos操作界面。
7、课程中常见的命令:
dir:列出当前目录下的文件以及文件夹。md:创建目录。rd:删除目录。
cd:进入指定目录。d:进入盘符。cd..:退回到上一级目录。cd/:退回到根目录。del:删除文件。
exit:退出dos命令行。
8、在dos命令行操作文件夹时,如忘记文件夹全称,可以输文件夹前几个名称后面用*代替。
四、基础知识:计算机语言
9、通过DOS命令行的演示,发现原来操作计算机就如同和计算机说话一样。
10、我们告诉它做什么,它就可以做什么。前提是,我们和它说的内容它必须识别才可以。这就是计算机语言。
11、什么是计算机语言?语言:是人与人之间用于沟通的一种方式。例如:中国人与中国人用中文沟通。而中国人要和韩国人交流,就要学习韩语。
12、计算机语言:人与计算机交流的方式。如果人要与计算机交流,那么就要学习计算机语。计算机语言有很多种,如:C,C++,Java等。这里,我们选择其中一种:Java语言。
五、基础知识:Java语言介绍
13、Java语言概述。是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级编程语言。是一种面向Internet的编程语言。随着Java技术在Web方面的不断成熟,已经成为Web应用程序的首选开发语言。是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
14、Java语言的三种技术架构。J2EE(Java 2 Platform Enterprise Edition)企业版(现更名:JAVAEE):是为开发企业环境下的应用程序提供一套解决方案。该技术体系中包含的技术如Servlet Jsp等,主要针对于Web应用程序开发。J2SE(Java 2 Platform Standard Edition)标准版(现更名:JAVASE):是为开发普通桌面和商务应用程序提供的解决方案。该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。比如Java版的扫雷。J2ME(Java 2 Platform Micro Edition)小型版(现更名:JAVAME):是为开发电子消费产品和嵌入式设备提供的解决方案。该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。
15、Java语言的特点:跨平台性。什么是跨平台性?通过Java语言编写的应用程序在不同的系统平台上都可以运行。原理是什么?只要在需要运行Java应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine)即可。由JVM来负责Java程序在该系统中的运行。
16、Java语言的特点:跨平台性。Java程序:Windows系统:Win版的JVM;Linux系统:lin版的JVM;MAC系统:mac版的JVM。因为有了JVM,所以同一个Java程序在三个不同的操作系统中都可以执行。这样就实现了Java程序的跨平台性。也称为Java具有良好的可移植性。
六、基础知识:Java语言的环境搭建
17、明确什么是JRE,JDK;下载JDK;安装JDK;配置环境变量;验证是否成功。
18、什么是JRE,JDK?JRE(Java Runtime Environment Java运行环境):包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。JDK(Java Development Kit Java开发工具包):JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用再单独安装JRE了。其中的开发工具:编译工具(java.exe)打包工具(jar.exe)等。简单而言:使用JDK开发完成的Java程序,交给JRE去运行。
19、Java6.0 Platform
20、下载JCK(Java Development Kit Java开发工具包)。官方网址:www.xiexiebang.com、java.sun.com。下载完成后,安装在电脑上。然后打开DOS命令行,效验文件是否安装完毕,并利用DOS进行Javac.exe运行测试。为了更方便的使用Java开发工具,需要进行环境变量配置。配置成功后就可以进行Java程序的开发了。
21、环境变量配置。方法一:图形界面操作。我的电脑——属性——高级——环境变量;编辑Path环境变量,在变量值开始处加上Java工具所在目录,后面用分号和其他值分隔开即可;打开DOS命令行,任意目录下敲入javac;如果出现javac的参数信息,配置成功。这种配置方式,一劳永逸。具体流程:右键点击我的电脑打开属性,点击高级系统设置,点击高级,点击环境变量,找到系统变量,新建系统变量(变量名:JAVA_HOME,变量值:安装JKD的地址。如:D:ProgramStudioJDK1.7)点击确定,找到变量名为Path的变量,点击编辑,在变量值栏的最前面(放到前面时,先寻找)加入%JAVA_HOME%bin用分号隔开。方法二:DOS界面操作(可用于临时环境变量配置,借助别人的电脑开发Java程序)。具体流程:利用set命令:设置、查看环境变量的值。Set path:查看path的值。配置Java工具包:set path=D:ProgramStudioJDK1.7bin;%path%回车。测试javac。只对当前窗口有效。定义class路径:Set classpath=.;c:myclass。
七、基础知识:Java程序开发体验
22、Hello World。将Java代码编写到扩展名为.java的文件中;通过javac命令对该java文件进行编译;通过java命令对生成的class文件进行运行。Java文件——javac.exe编译——class文件——java运行——结果。
23、对于初学者,可以用记事本编写。按部就班,一步一步写代码。打开记事本。Java代码是以类的形式来体现的。代码如下: class TestFirstOne //Java定义类+类名(首字母大写){ public static void main(String[] args)//主函数(保证类的独立运行)
{
System.out.println(“hello world”);//输出打印语句
} }
23、classpath配置。临时配置方式:dos配置。Set Classpath=代码路径。回车。Classpath先在环境变量中找,然后在当前路径(结尾没带分号不找)。Path先在当前路径查找,然后去环境变量中查找。一劳永逸方法和上面JDK环境变量配置方法一样。
24、Hello World组成部门。class是java程序中的关键字(关键字只能是小写)。{}类的区间用大括号定义(类中的内容为了增加阅读性,需要有阶梯感,如使用tab键)。public static void main(String[] args)定义主函数(使用大括号确定函数的内容)。
25、注释。三种方式://单行注释,符号以后直到回车键的内容;/*多行注释,符号开始到符号结束以内的内容*/;/**java注释符号,可被提取出来制作软件开发手册*/。注释的作用:增加程序的阅读性;调试程序。
26、写代码要养成写注释的习惯。在写代码前注释相关信息。例如: /* 需求:定义一个Hello World小程序。思路: 1,2,步骤:
1,通过class关键字定义一个类。将代码都编写到该类中。
2,为了保证该的独立运行。在类中定义个主函数。格式public static void main(String[] args)3,保存成一个扩展名为java的文件。
4,在dos控制台中通过javac工具对java文件进行编译。5,在通过java命令对生成的class文件进行执行。作者:ZC 版本:v1.0 日期:2016.01.06 copyright:ZC */ 2016年01月07日
day02
一、基础知识:Java语言基础组成
1、组成:关键字、标识符、注释、常量和变量、运算符、语句、函数、数组
二、基础知识:关键字
2、关键字的定义和特点:定义:被Java语言赋予了特殊含义的单词。特点:关键字中所有字母都为小写。
3、用于定义数据类型的关键字:class、interface、byte、short、int、long、float、double、char、boolean、void。
4、用于定义数据类型值的关键字:true、false、null。
5、用于定义流程控制的关键字:if、else、switch、case、default、while、do、for、break、continue、return。
6、用于定义访问权限修饰的关键字:private、protected、public。
7、用于定义类,函数,变量修饰的关键字:abstract、final、static、synchronized。
8、用于定义类与类之间关系的关键字:extends、implements。
9、用于定义建立实例以及引用实例,判断实例的关键字:new、this、super、instanceof。
10、用于异常处理的关键字:try、catch、finally、throw、throws。
11、用于包的关键字:package、import。
12、其他修饰符关键字:native、strictfp、transient、volatile、assert。
三、基础知识:标识符
13、标识符:在程序中自定义的一些名称;由26个英文字母大小写,数字:0-9,符号_$组成;定义合法标识符规则:数字不可以开头、不可以使用关键字;Java中严格区分大小写;注意:在起名时,为了提高阅读性,要尽量有意义。
14、Java中的名称规范:包名:多单词组成时所有都小写,如:xxxyyyzzz;类名接口名:多单词组成时,所有单词的首字母大写,如:XxxYyyZzz;变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写,如:xxxYyyZzz;常量名:所有字母都大写,多单词时每个单词用下划线连接,如:XXX_YYY_ZZZ。
四、基础知识:注释
15、注释:对于单行和多行注释,被注释的文字,不会被JVM(Java虚拟机)解释执行;对于文档注释,是Java特有的注释,其中注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档;注释是一个程序员必须要具有的良好编程习惯;初学者编写程序可以养成习惯;先写注释再写代码;将自己的思想通过注释先整理出来,再用代码去体现;因为代码仅仅是思想的一种体现形式而已;用于注解说明解释程序的文字就是注释;提高了代码的阅读性。
16、Java中的注释格式:单行注释:格式://注释文字;多行注释:格式:/*注释文字*/;文档注释:格式:/**注释文字*/。
五、基础知识:常量
17、常量表示不能改变的数值。
18、Java中常量的分类:整数常量:所有整数;小数常量:所有小数;布尔型常量:较为特有,只有两个数值:true和false;字符常量:将一个数字字母或者符号用单引号(’’)标识;字符串常量:将一个或者多个字符用双引号(””)标识;null常量:只有一个数值就是null。
19、对于整数:Java有三种表现形式:十进制:0-9,满10进1;八进制:0-7,满8进1,用0表示开头;十六进制:0-9,A-F,满16进1,用0x开头表示。
六、基础知识:进制转换
20、进制的转换特点:八位二进制表示一个字节(基本的数据单元)。三个二进制位表一个八进制位。四个二进制位表示一个十六进制位。ASCII码编码表。
21、二进制和十进制之间的转换:十进制转二进制:原理:对十进制数进行除2运算(除二取余法);二进制转十进制:原理:二进制乘以2的N次的过程。
22、快捷方法:8421法则。
23、负数的二进制表现形式:对应的正数二进制取反加1。负数的最高位都是1。
七、基础知识:变量
24、变量的概念:内存中的一个存储区域;该区域有自己的名称(变量名)和类型(数据类型);该区域的数据可以在同一类型范围内不断变化;理解:变量就如同数学中的未知数;变量:就是将不确定的数据进行存储,也就是需要在内存中开辟一个空间。
25、为什么要定义变量:用来不断的存放同一类型的常量,并可以重复使用。
26、使用变量注意:变量的作用范围(一对{}之间有效);初始化值。
27、定义变量的格式:数据类型变量名=初始化值;注:格式是固定的、记住格式,以不变应万变。
28、Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同打小的内存空间。数据类型:基本数据类型(数值型(整数类型(byte,short,int,long);浮点类型(float,double));字符型(char);布尔型(boolean));引用数据类型(类(class);接口(interface);数据([]))。注意:整数默认:int,小数默认:double。
29、数据类型空间:byte 8位二进制(一个8位二进制或1个字节);short 16位二进制(二个8位二进制或2个字节);int 32位二进制(四个8位二进制或4个字节);long 64位二进制(八个8位二进制或8个字节);float(单精度)32位二进制(四个8位二进制或4个字节);double(双精度)64位二进制(八个8位二进制或8个字节);char 取值:0-65535;boolean取值:true,false。
30、类型转换。不同类型的数据不能进行运算。需要进行数据类型提升,从小往大提升,自动数据类型提升。强制类型转换:格式:变量=(类型名)(需转换的数据);什么时候使用强制转换:如:小数保留整数部分。
31、表达式的数据类型自动提升:所有的byte型、short型和char的值将被提升到int型;如果一个操作数是long型,计算结果就是long型;如果一个操作数是float型,计算结果就是float型;如果一个操作数是double型,计算结果就是double型。分析:system.out.println(‘a’)与system.out.println(‘a’+1)的区别。
八、基础知识:运算符
32、算数运算符:+正号,-负号,+加,-减,*乘,/除,%取模,++自增(前),++自增(后),--自减(前),--自减(后),+字符串相加(字符串数据和任何数据使用+都是相连接,最终都会变成字符串)。
33、转义字符:通过 来转变后面字母或者符号的含义。在Linux系统中换行是一个字符来表示n,windows系统中,换行由nr实现。n:换行。b:退格。相当于backspace键。r:按下回车键。t:制表符。相当于tab键。
34、赋值运算符:符号:=:赋值,+=:a+=5等价于a=a+5,-=,*=,/=,%=。
35、比较运算符:==:相等于;!=:不等于;<:小于;>:大于;<=:小于等于;>=:大于等于;instanceof:检查是否是类的对象。注意:比较运算符的结果都是boolean型,也就是要么是true,要么是false;比较运算符“==”不能误写成“=”。
36、逻辑运算符:&:AND(与)两边的boolean表达式结果,有一个为false,那么结果就是false,只要两边都为true,结果为true;|:OR(或)两边的boolean表达式结果,只要有一个为true,结果为true,只有两边都有false,结果为false;^:XOR(异或)两边的boolean表达式结果相同结果为false,两边不同结果为true;!:NOT(非);&&:AND(短路);||OR:(短路)。逻辑运算符用于连接boolean类型的表达式。&和&&的特点:&:无论左边是真是假,右边都运算;&&:当左边为假时,右边不运算。|和||的特点:|:两边都做运算;||:但左边为真时,右边不运算。
37、位运算符:<<:左移,如:3<<2=12等价于3*2^2=12;>>:右移,如:6>>2=1等价于6/2^2=1;>>>:无符号右移,如:3>>>1=1;&:与运算,如:6&3=2;|:或运算,如:6|3=7;^:异或运算,如:6^3=5;~:反码,如:~6=-7;位运算是直接对二进制进行运算。<<:其实就是乘以2的移动的位数次幂;>>:就是除以2的移动的位数次幂。>>:最高位补什么由原有数据的最高位值而定;如果最高位0,右移后,用0补空位;如果最高位1,右移后,用1补空位。>>>:无论最高位是什么,右移后,都用0补。一个数异或同一个数两次,结果还是拿个数。
38、三元运算符:格式:(条件表达式)?表达式1:表达式2;如果条件为true,运算后的结果是表达式1;如果条件为false,运算后的结果是表达式2。如:获取两个数中大数,int x=3,y=4,z;z=(x>y)?x:y//z变量存储的就是两个数的大数。
九、基础知识:if语句
39、程序流程控制:顺序结构,判断结构,选择结构,循环结构。
40、判断结构:if语句三种格式:一层判断:if(条件表达式){执行语句;};两层判断:if(条件表达式){执行语句;}else{执行语句;};多层判断:if(条件表达式){执行语句;}else if(条件表达式){执行语句;}else{执行语句;}。
41、if else结构间歇格式:变量=(条件表达式)?表达式1:表达式2;三元运算符:好处:可以简化if else代码;弊端:因为是一个运算符,所以运算完毕需要有一个结果。
42、解决DOS命令下,编译无法识别GDK码方法:方法一:使用-encoding参数指明编码方式:javac-encoding UTF-8 XX.java。方法二:保存java文件时,选择编码格式为ANSI。
十、基础知识:switch语句
43、选择结构:switch语句:格式:switch(表达式){case 取值1:执行语句;break;case 取值2:执行语句;break;„„default:执行语句;//break;}
44、switch(表达式):表达式只接收四种类型:byte,short,int,char。
45、if语句与switch语句的区别:if除了能判断数值,还能判断具体区间,switch判断区间很累;对于数字是布尔型时,只有if能判断。
46、if语句与switch语句的用法:如果要对具体数字进行判断,数值不多,而且符合byte、short、int、char这四种类型,虽然两个语句都可以使用,建议用switch完成。因为效率稍高。其他情况一般用if。当结果为布尔型或区间时,用if完成。If的使用范围更广。2016年01月08日day03
一、基础知识:while语句
1、循环结构:代表语句:while、do while、for。
2、while语句格式:while(条件表达式){执行语句;}。
3、do while语句格式:do{执行语句;}while(条件表达式)。Do while特点是条件无论是否满足,循环体至少被执行一次。
4、while和do while的区别:while:先判断条件,只有条件满足才执行循环体。do while:先执行循环体,再判断条件,条件满足,再继续执行循环体。简单一句话:do while:无论条件是否满足,循环体至少执行一次。
二、基础知识:for语句
5、for语句格式:for(初始化表达式;循环条件表达式;循环后的操作表达式){执行语句;}。注意:a:for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。b:while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。c:最简单无限循环格式:while(true),for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
6、for和while的区别:a:变量有自己的作用域。对于一个变量来将,如果这个变量仅仅用于控制循环的次数,用作循环增量时用for语句。循环结束时,该变量在内存被释放。用于优化内存。b:for和while可以进行互换,如果定义循环增量,用for更为合适。
7、什么时候使用循环结构?当要多某些语句执行很多次时,就是用循环结构。
8、循环注意:一定要明确哪些语句需要参与循环,哪些不需要。
9、两种思想:累加思想:原理:通过变量记录住每次变化的结果。通过循环的形式,进行累加动作。计数器思想:原理:通过一个变量记录住数据的状态变化。也通过循环完成。
10、循环嵌套:语句嵌套形式,其实就是语句中含有语句。
11、其他流程控制语句:break(跳出),continue(继续)。Break语句:应用范围:选择结构和循环结构。Continue语句:应用于循环结构。注意:a:这两个语句离开应用范围,存在是没有意义的。b:这两个语句单独存在下面都不可以有语句,因为执行不到。c:continue语句是结束本次循环继续下次循环。d:标号的出现,可以让这两个语句作用于指定的范围。
12、注意:标号只能用于循环语句上,给循环起名字。
13、continue:只能作用于循环结构。继续循环。特点:结束本次循环,继续下一次循环。
14、总结:a:break和continue语句作用的范围。b:break和continue单独存在时,下面可以有任何语句。因为都执行不到。
三、基础知识:函数
15、函数的定义:什么是函数?函数就是定义在类中的具有特定功能的一段独立小程序;函数也称为方法。
16、函数的格式:修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2,„){执行语句;return返回值;}。返回值类型:函数运行后的结果的数据类型。参数形式:是形式参数的数据类型。形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。实际参数:传递给形式参数的具体数值。Return:用于结束函数。返回值:该值会返回给调用者。
17、函数的特点:定义函数可以将功能代码进行封装;便于对该功能进行复用;函数只有被调用才会被执行;函数的出现提高了代码的复用性;对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。注意:函数中只能调用函数,不可以在函数内部定义函数;定义函数时,函数的结果应该返回给调用者,交由调用者处理。
18、重点:函数的应用。如何定义一个函数呢?a:既然函数是一个独立的功能,那么该功能的运算结果是什么先明确。因为这是在明确函数的返回值类型。b:再明确在定义该功能的过程中是否需要未知的内容参与运算。因为是在明确函数的参数列表(参数的类型和参数的个数)。
19、函数的重载(overload):重载的概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。重载的特点:与返回值无关,只看参数列表。重载的好处:方便与阅读,优化了程序设计。重载示例://返回两个整数的和int add(int x,int y){return x+y;};//返回三个整数的和int add(int x,int y,int z){return x+y+z;};//返回两个小数的和double add(double x,double y){return x+y;}。
20、什么时候用重载?当定义的功能相同,但参与运算的未知内容不同。那么,这时就定义一个函数名称以表示其功能,方便阅读,而通过参数列表的不同来区分多个同名函数。
四、基础知识:数组
21、数组的定义:概念:同一种数据类型的集合。其实数组就是一个容器。数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。关键字:new:用来在内存中产生一个容器实体。格式一:元素类型[]数组名=new元素类型[元素个数或数组长度];示例:int [] arr=new int[5];格式二:元素类型[]数组名=new元素类型[]{元素,元素,„};示例:int[] arr=new int[]{3,5,1,7};int[] arr={3,5,1,7}。
22、内存结构:Java程序在运行时,需要在内存中分配空间。为了提高运行效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存的管理方式。A:栈内存(栈区):用于存储局部变量,当数据使用完,所占空间会自动释放。B:堆内存(堆区):数组和对象,通过new建立的实例都存放在堆内存中。每一个实体都有内存地址。实体中的变量都有默认初始化值。实体不在被使用,会在不确定的时间内被垃圾回收器回收。C:方法区,本地方法区,寄存器。2016年01月09日
day04
一、基础知识:数组
1、获取数组中的元素。通常会用到遍历。
2、数组中有一个属性可以直接获得到数组元素个数。length。使用方式:数组名称.length。
3、数组排序:选择排序:内循环结束一次,最值出现头角标位置。冒泡排序:第一圈:最值出现在了最后位。
4、java中排序工具:import.java.util.*;Array.sort(arr)。java中已经定义好的一种排序方式。开发中,对数组排序,要使用该句代码。
5、二维数组:数组中的数组:格式一:int[][] arr=new int[3][2];定义了名称为arr的二维数组;二维数组中有3个一维数组;每一个一维数组中有2个元素;一维数组的名称分别为arr[0],arr[1],arr[2];给第一个一维数组1脚标位赋值为78写法是:arr[0][1]=78。格式二:int[][] arr=new int[3][];二维数组中有3个一维数组;每个一维数组都是默认初始值null;可以对这个三个一维数组分别进行初始化:arr[0]=new int[3];arr[1]=new int[1];arr[2]=new int[2]。
2016年01月10日
day05
一、面向对象:概述
1、理解面向对象:面向对象是相对面向过程而言;面向对象和面向过程都是一种思想;面向过程:强调的是功能行为;面向对象:将功能封装进对象,强调了具备了功能的对象;面向对象是基于面向过程的。让我们的角色从执行者变为指挥者。面向过程是面向对象的基础。
2、一切皆对象,境界:万物皆对象。
3、写程序时:先考虑对象。有对象时,直接用。没对象时,自己造一个对象。
4、人开门:名称提炼法。事物:人、门。示例:人{开门(门){门。开();}};门{开(){操作门轴等。}}。
5、面向对象的三个特征:封装,继承,多态。
6、以后的开发:其实就是找对象使用。没有对象,就创建一个对象。
7、找对象,建立对象,使用对象,维护对象的关系。
8、类和对象的关系:类就是:对现实生活中事物的描述。对象:就是这类事物,实实在在的个体。映射到java中,描述就是class定义的类。具体对象就是对于java在堆内存中用new建立实体。
9、类与对象示例:图纸:汽车,汽车,汽车。可以理解为:类就是图纸;汽车就是堆内存中的对象。
10、描述事物其实就在是描述事物的属性和行为。
11、属性对应是类中的变量,行为对应的类中的函数(方法)。其实定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员函数(方法))。
12、引用变量:类类型变量。记住:类类型变量指向对象。
13、就需要该对象做使用,在java指挥方式是:对象.对象成员。
14、成员变量和局部变量:作用范围:成员变量作用于整个类中。局部变量作用于函数中,或者语句中。在内存中的位置:成员变量:在堆内存中,因为对象的存在,才在内存中存在。局部变量:存在栈内存中。
15、匿名对象:匿名对象是对象的简化形式;匿名对象两种使用情况:当对对象方法仅进行一次调用的时;匿名对象可以作为实际参数进行传递。
二、面向对象:封装
16、封装的定义:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
17、封装的好处:将变化隔离;便于使用;提高重用性;提高安全性。
18、封装原则:将不需要对外提供的内容隐藏起来;把属性都隐藏,提供公共方法对其访问。
19、函数是最小的封装体;类是较小的封装体;包是中级封装体;框架是较大的封装体。20、关键字private:私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。在类中隐藏。私有只在本类中有效。
21、注意:私有仅仅是封装的一种表现形式。
22、之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断语句。对访问的数据进行操作。提高代码健壮性。
23、关键字private:将成员变量私有化。对外提供对应的set,get方法对其进行访问。提高对数据访问的安全性。
三、面向对象:构造函数
24、构造函数的特点:函数名与类名相同;不用定义返回值类型;不可以写return语句。
25、构造函数的作用:给对象进行初始化。注意:默认构造函数的特点;多个构造函数是以重载的形式存在的。
26、构造函数:对象一建立就会调用与之对应的构造函数。构造函数的作用:可以用于给对象进行初始化。
27、构造函数的小细节:当一个类中没有定义构造函数时,那么系统会默认给该类假如一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。
28、构造函数和一般方法(函数)的区别:A:构造函数和一般函数在写法上有不同。B:在运行上也有不同。构造函数是在对象一建立就运行。就对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。C:一个对象建立,构造函数只运行一次。而一般方法可以被该对象调用多次。
29、什么时候定义构造函数呢:当分析事物时,该事物存在具备一些特征或者行为,那么将这些内容定义在构造函数中。30、构造代码块:作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。
31、构造代码块和构造函数区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象进行初始化。
32、构造代码块中定义的是不同对象共性的初始化内容。
四、面向对象:this关键字
33、关键字this:看上去,是用于区分局部变量和成员变量同名情况。
34、关键字this的特点:就代表本类的对象,到底代表哪一个呢?this代表它所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
35、this的应用:当定义类中功能时,该函数内部要用到该函数的对象时,这时用this来表示这个对象。但凡本类功能内部使用到了本类对象,都用this代替。
36、this语句:用于构造函数之间函数互相调用。this语句:只能定义在构造函数的第一行。因为初始化要先执行。
37、this语句只能用于构造函数间,不能用于一般函数。
2016年01月11日
day06
一、面向对象:static关键字
1、static(静态)关键字:用于修饰成员(成员变量和成员函数)。被修饰后的成员具备以下特点:随着类的加载而加载;优先于对象存在;被所有对象所共享;可以直接被类名调用。使用注意:静态方法只能访问静态成员;静态方法中不可以写this,super关键字;主函数是静态的。
2、用法:是一个修饰符,用于修饰成员(成员变量,成员函数)。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名用。类名.成员变量。
3、实例变量和类变量的区别:A,存放位置:类变量随着类的加载而存在于方法区中。实例变量随着对象的建立存在于堆内存中。B,生命周期:类变量生命周期最长,随着类的消失而消失。实例变量随着对象的消失而消失。
4、静态使用注意事项:A,静态方法只能访问静态成员。非静态方法既可以访问静态也可以访问非静态。B,静态方法中不可以定义thsi,super关键字。因为静态优先于对象存在,所有静态方法中不可以出现this。C,主函数是静态的。
5、静态优缺点:优:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。可以直接被类名调用。缺:生命周期过长。访问出现局限性。(静态虽好,只能访问静态。)
6、public static void main(String[] args)主函数:是一个特殊的函数,作用程序的入口,可以被jvm调用。
7、主函数的定义:public:代表着该函数访问权限是最大的。static:代表主函数随着类的加载就已经存在了。void:代表主函数没有具体的返回值。main:不是关键字,但是是一个特殊的单词,可以被jvm识别。(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
8、主函数是固定格式的:jvm识别。jvm在调用主函数时,传人的是new String[0]。
9、什么时候使用静态?要从两方面下手:因为静态修饰的内容有成员变量和函数。什么时候定义静态变量(类变量)呢?当对象中出现共享数据时,该数据静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。
10、什么时候定义静态函数呢?当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
11、静态的应用:A每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。B虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作。但是:1,对象是用于封装数据的,可以ArrayTool对象并未封装特特有数据。2,操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。C这时就考虑,让程序更严谨,是不需要对象的。可以将ArrayTool中的方法都定义成static的,直接通过类名调用即可。D将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象的。为了更为严谨,强制让该类不能建立对象。可以通过将构成函数私有化完成。
12、接下来,将ArrayTool.class文件发送给其他人,其他人只要将该文件设置到classpath路径下,就可以使用该工具类。但是,很遗憾,该类中到底定义了多少个方法,对方不清楚。因为该类并没有使用说明书。开始制作程序的说明书。java的说明书通过文档注释来完成。
13、注释符号:/***/;@author作者;@version版本;@param参数;@return返回值。
14、静态代码块。格式:static{静态代码块中的执行语句。}。
15、静态代码块的特点:随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。
16、重点:对象的初始化过程:Person p=new Person(“zhangsan”,20);该句话都做了什么事情?A因为new用到了Person。Class。所有会先找到Person。Class文件并加载到内存中。B执行该类中的static代码块,如果有的话,给Person.class类进行初始化。C在堆内存中开辟空间,分配内存地址。D在堆内存中建立对象的特有属性,并进行默认初始化。E对属性进行显示初始化。F对对象进行构造代码块初始化。G对对象进行对应的构造函数初始化。H将内存地址付给栈内存中的p变量。
二、面向对象:单例设计模式
17、设计模式:解决某一类问题最行之有效的方法。java中23中设计模式:单例设计模式:解决一个类在内存只存在一个对象。
18、想要保证对象唯一。1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象。2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
19、这三步怎么用代码体现呢?1,将构造函数私有化。2,在类中创建一个本类对象。3,提供一个方法可以获取到该对象。
20、对于事物该怎么描述,还怎么描述。当需要将该事物的对象保证在内存中唯一时,就将以上的三部加上即可。
21、单例设计方法一:这个是先初始化对象。称为:饿汉式。Single类一进内存,就已经创建好了对象。开发一般用饿汉式:安全、简单。
22、单例设计方法二:对象被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式。Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
23、记住原则:定义单例,建议使用饿汉式。但面试时:考懒汉式的多。特别是如何解决懒汉式的缺点。2016年01月12日
day07
一、面向对象:继承
1、继承:1,提高代码的复用性。2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。关键字:extends。
2、注意:千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系才可以继续。所属关系is a。
3、java语言中:java只支持单继承,不支持多继承。原因:因为多继承容易带来安全隐患:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个。但是java保留这种机制,并用另一种体现形式来完成表示,多实现。
4、java支持多层继承。也就是一个继承体系。如何使用一个继承体系中的功能呢?想要使用体系,先查阅父类的描述,因为父类中定义的是该体系中共性功能。通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经可以基本使用了。
5、那么在具体调用时,要创建最子类的对象,为什么呢?一是因为有可能父类不能创建对象,二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
6、简单一句话:查阅父类功能,创建子类对象使用功能。
7、this代表本类对象的引用,super代编父类对象的引用。
8、子父类出现后,类成员的特点:类中成员:A,变量。B,函数。C,构造函数。
9、子父类中的变量:如果子类中出现非私有的同名变量时,之类要访问本类中的同名变量,用this子类要访问父类中的同名变量,用super。super的使用和this的使用几乎一致。this代表的是本类对象的引用。super代表的是父类对象的引用。
10、子父类中的函数:当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。如同父类的函数被覆盖一样。这种情况是函数的另一个特性:重写(覆盖)。
11、修改以往的源码绝对是灾难。
12、单子类继承父类,沿袭了父类的功能,到子类中,但是子类虽具备该功能,但是功能的内容却和父类不一致,这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。
13、注意:覆盖:子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。静态只能覆盖静态。
14、记住大家:重载:只看同名函数的参数列表。重写:子父类方法要一模一样。
15、子父类中的构造函数:发现在对子类对象进行初始化时,父类的构造函数也会运行。那是因为子类的构造函数默认第一行有一条隐式的语句super();super();会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super()。
16、为什么子类一定要访问父类中的构造函数:因为父类中的数据子类可以直接获取,所有之类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所有之类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。注意:super语句一定一定在子类构造函数第一行。
17、子类的实例化过程。结论:子类的所有的构造函数默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内的每一行都有一句隐式的super();当父类中没有空参数的构造函数时,子类必须手动通过super语句或者this语句形式来指定要访问父类中的构造函数。当然:子类的构造函数第一行也可以收到指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
18、关键字:final:final可以修饰类,方法(函数),变量;final修饰的类不可以被继承;final修饰的方法(函数)不可以被覆盖;final修饰的变量是一个常量,只能被赋值一次;内部类只能访问被final修饰的局部变量。
二、面向对象:抽象类
19、当多个类中出现相同功能,但是功能主体不同,这时也可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。20、抽象:看不懂。
21、抽象类的特点:A,抽象方法一定定义在抽象类中。B,抽象方法和抽象类都必须被abstract关键字修饰。C,抽象类不可以被new创建对象。因为调用抽象方法没意义。D,抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。
22、如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
23、抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物中出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体。通过抽象方法来表示。
24、抽象类比一般类多了抽象方法(函数)。就是在类中可以定义抽象方法。抽象类不可以实例化(即不可以new)。特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
25、什么是模板方法呢?在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分。那么这时就将不确定的部分暴露出去。由该类的子类去实现。
三、面向对象:接口
26、接口:格式:interface{}。接口中的成员修饰符是固定的。成员常量:public static final;成员函数:public abstract。接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
26、接口:初期理解:可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。class用于定义类。interface用于定义接口。
27、接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化。否则子类是一个抽象类。接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。用关键字:implements。
28、接口与接口之间支持多继承,类与类之间只支持单继承。
29、接口的特点:接口是对外暴露的规则;接口是程序的功能扩展;接口可以用来多实现;类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口;接口与接口之间可以有继承关系。2016年01月13日
day08
一、面向对象:多态
1、多态的定义:某一类事物的多种存在形态,例:动物中猫,狗。猫这个对象对应的类型是猫类型:猫x=new 猫();同时猫也是动物中的一种,也可以把猫称为动物。动物y=new 猫();动物是猫和狗具体事物中抽取出来的父类型;父类型引用指向了子类对象。
2、多态的体现:父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。
3、多态的前提:必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。
4、多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5、多态的好处:多态的出现大大的提高了程序的扩展性。
6、引用数据类型转换:类型提升。向上转型。如果想要调用猫的特有方法时,如何操作?强制将父类的引用,转成子类类型。向下转型。注意:千万不要出现这样的操作,就是将父类对象转成子类类型。我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变量。
7、关键字:instanceof。判断引用数据类型是否一致。
8、在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
9、在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。
10、object类:是所有对象的直接或者间接父类,传说中的上帝。该类中定义的肯定是所有对象都具备的功能。
11、Object类中已经提供了对对象是否相同的比较方法。如果自定义类中也有比较相同的功能,没有必要重新定义。只要沿袭父类中的功能,建立自己特有的比较内容即可。这就是覆盖。
2016年01月15日
day09
一、面向对象:内部类
1、内部类的定义:将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。
2、内部类访问特点:内部类可以直接访问外部类中的成员,包括私有成员。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。而外部类要访问内部类中的成员必须要建立内部类的对象。
3、访问格式:当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。格式:外部类名.内部类名变量名=外部类对象.内部类对象;Outer.Inner in=new Outer().new Inner()。
4、当内部类在成员位置上,就可以被成员修饰符所修饰。比如,private:将内部类在外部类中进行封装。static:内部类就具备了static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。
5、在外部其他类中,如何直接访问static内部类的非静态成员呢?new Outer.Inner().function()。在外部其他类中,如何直接访问static内部类的静态成员呢?Outer.Inner().function()。
6、注意:当内部类中定义了静态成员,该内部类必须是static的。当外部类中的静态方法访问内部类时,内部类也必须是static的。
7、当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事物在使用外部事物的内容。
8、内部类定义在局部时,1,不可以被成员修饰符修饰;2,可以直接访问外部类中的成员,因为还持有外部类中的引用;但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
9、匿名内部类:1,匿名内部类其实就是内部类的简写格式。2,定义匿名内部类的前提:内部类必须继承一个类或者实现接口。3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}。4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。5,匿名内部类中定义的方法最好不要超过3个。
二、面向对象:异常
10、异常:异常的体系:Throwable:(Error:通常出现重大问题如:运行的类不存在或者内存溢出等;不编写针对代码对其处理。Exception:在运行时运行出现的一起情况,可以通过try catch finally)。Exception和Error的子类名称都是以父类名作为后缀。
11、异常:就是程序在运行时出现不正常情况。
12、异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并进行封装。其实就是java对不正常情况进行描述后的对象体现。
13、对于问题的划分:两种:一种是严重的问题。一种是非严重的问题。对于Error一般不编写针对性的代码对其进行处理。对于严重的,java通过Error类进行描述。对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。
14、无论Error或者Exception都具体有一些共性内容。比如:不正常情况的信息,引发原因等。
15、异常的处理:java提供了特有的语句进行处理。Try{需要被检测的代码;}catch{异常类变量}{处理异常的代码:(处理方式)}finally{一定会执行的语句;}。
15、throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。在函数上声明异常。便于提高安全性,让调用者进行处理。不处理编译失败。
16、对多异常的处理。1,声明异常时,建议声明更为具体的异常。这样处理得可以更具体。2,对声明几个异常,就对应有几个catch块。不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
17、建议在进行catch处理时,catch中一定要定义具体处理方式。不要简单定义一句 e.printStackTrace(),也不要简单的就书写一条输出语句。
18、自定义异常:因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所有对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题,进行自定义的异常封装。
19、当在函数内部出现了throw抛出了异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理。要么在函数上声明让调用者处理。20、如何定义异常信息呢?因为父类中已经把异常信息的操作都完成了。所有子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。
21、自定义异常:必须是自定义类继承Exception。继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
22、只有这个体系中的类和对象才可以被throws和throw操作。
23、throws和throw的区别:throws使用在函数上。throw使用在函数内。throws后面跟的异常类。可以跟多个。用逗号隔开。throw后跟的是异常对象。
24、Exception中有一个特殊的子类异常RuntimeException运行时异常。如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理,编译一样通过。
25、之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序。对代码进行修正。
26、自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。
27、对于异常分两种:1,编译时被检测的异常。2,编译时不被检测的异常(运行时异常,RuntimeException以及其子类)。
2016年01月16日
day10
一、面向对象:异常
1、finally中存放的是一定会被执行的代码。
2、finally代码块:定义一定执行的代码。通常用于关闭资料。
3、记住一点:catch是用于处理异常。如果没有catch就代表没有被处理过,如果该异常时检测时的异常,就必须声明出去。
4、异常在子父类覆盖中的体现:A,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。B,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。C,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
5、异常:是什么?是对问题的描述,将问题进行对象的封装。
6、异常体系:Throwable:|--Error;|--Exception(|--RuntimeException)。
7、异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。
8、throw和throws的用法:throw定义在函数内,用于抛出异常对象。throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
9、当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。注意:RuntimeException除外。也就是说,函数内如果抛出的RuntimeException异常,函数上可以不用声明。
10、如果函数声明了异常,调用者需要进行处理。处理方法可以throws和try。
11、异常有两种:编译时被检测异常:该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被标识,代表着可以被处理。运行时异常(编译时不检测):在编译时,不需要处理,编译器不检查。该异常的发生,建立不处理,让程序停止。需要对代码进行修正。
12、异常处理语句:try(需要被检测的代码;)catch(处理异常的代码;)finally(一定会执行的代码;)。有三种结合格式:try catch;try finally;try catch finally。注意:A,finally中定义的通常是关闭资源代码。因为资源必须释放。B,finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行。
13、自定义异常:定义类继续Exception或者RuntimeException。A,为了让该自定义类具备可抛性。B,让该类具备操作异常的共性方法。当要定义自定义异常的信息时,可以使用父类已经定义好的功能。异常异常信息传递给父类的构成函数。class MyException extends Exception{MyException(String message){super(message);}}。
14、自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。
15、异常的好处:A,将问题进行封装。B,将正常流程代码和问题处理代码相分离,方便于阅读。
16、异常的处理原则:A,处理方式有两种:try或者throws。B,调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。C,多个catch,父类的catch放到最下面。D,catch内需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
17、异常的注意事项:在子父类覆盖时:A,子类抛出的异常必须是父类异常的子类或者子集。B,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
二、面向对象:包
18、包(package):对类文件进行分类管理。给类提供多层命名空间。写在程序文件的第一行。类名的全称的格式是:包名.类名。包也是一种封装形式。
19、关键字protected:/*保护*/权限。权限修饰符。可用于修饰包里的父类。
20、总结:包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。不同包中的子类还可以访问直接父类中被protected权限修饰的成员。
21、包与包之间可以使用的权限只有两种,public protected。
22、public
protected
default
private 同一个类中可以可以可以可以 同一个包中可以
可以可以 不可以 子类可以
可以不可以不可以 不同包中 可以不可以不可以不可以。
23、为了简化类名的书写,使用一个关键字import。import导入的是包中的类。建议,不要写通配符*,需要用到包中的哪个类,就导入哪个类。
24、建议定义包名不要重复,可以使用url来完成定义,url是唯一的。
25、jar包:java的压缩包:方便项目的携带。方便于使用,只要在classpath设置jar路径即可。数据库驱动,SSH框架等都以jar包体现的。2016年01月17日
day11
一、多线程:概述
1、进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
2、线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
3、Java VM 启动的时候会有一个进程java.exe。该进程中至少有一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。
4、如何在自定义的代码中,自定义一个线程呢?通过对API的查找,java已经提供了对线程这类事物的描述。就是Thread类。
5、创建线程的第一种方式:继承Thread类。步骤:1,定义类继承Thread。2,复写Thread类中的run方法。目的:将自定义代码存储在run方法中,让线程运行。3,调用线程的start方法,该方法有两个作用:启动线程;调用run方法。
6、发现运行结果每一次都不同:因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某一时刻,只能有一个程序在运行。(多核除外)cpu在做着快速的切换,以达到看上去是同时运行的效果。我们可以形象把多线程的运行形容为在互相抢夺cpu的执行权。这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说了算。
7、为什么要覆盖run方法呢?Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。
8、原来线程都有自己默认的名称。Thread-编号。该编号从0开始。static Thread currentThread():获取当前线程对象。getName():获取线程名称。设置线程名称:setName或者构造函数。
9、创建线程的第二种方式:实现Runnable接口。
步骤:1,定义类实现Runnable接口。2,覆盖Runnable接口中的run方法。目的:将线程要运行的代码存放在run方法中。3,通过Thread类建立线程对象。4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。为什么要将Runnable接口的子类对象传递给Thread的构造函数?因为,自定义的run方法所属的对象时Runnable接口的子类对象。所有要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
10、实现方式和基础方法有什么区别呢?实现方式好处:避免了单继承的局限性。在定义线程时,建议使用实现方式。两种方式区别:继承Thread:线程代码存放在Thread子类run方法中。实现Runnable:线程代码存放在接口的子类的run方法中。
二、多线程:同步
11、多线程的运行出现了安全问题:问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,汗没有执行完,另一个线程参与进来执行。导致共享数据的错误。解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程过,其他线程不可以参与执行。java对于多线程的安全问题提供了专业的解决方式。就是同步代码块。synchronized(对象){需要被同步的代码;}。
12、对象如同锁。持有锁的线程可以在同步中执行。没有锁的线程即使获取了cpu的执行权,也进不去,因为没有获取锁。
13、同步的前提:1,必须要有两个或者两个以上的线程。2,必须是多个线程使用同一个锁。必须保证同步中只能有一个线程在运行。
14、好处:解决了多线程的安全问题。弊端:多个线程需要判断锁,较为消耗资源。
15、多线程安全问题:如何找到问题:1,明确哪些代码是多线程运行代码。2,明确共享数据。3,明确多线程运行代码中哪些语句是操作共享数据的。
16、同步函数:将关键字synchronized放到函数名称前。即把synchronized当作修饰符使用。
17、同步函数用的是哪一个锁呢?函数需要被对象调用。那么函数都有一个所属对象引用。就是this。所有同步函数使用的锁是this。
18、如果同步函数被静态修饰后,使用的锁是什么呢?通过验证,发现不再是this。因为静态方法中也不可以定义this。静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class 该对象的类型是Class。静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class。
19、死锁:同步中嵌套同步。而锁却不同。
2016年01月18日
day12
一、多线程:线程间通信
1、wait(),notify(),notifyALL(),用来操作线程为什么定义在了Object类中?这些方法存在于同步中。使用这些方法时必须要标识所属的同步的锁。锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。
2、wait()和sleep()有什么区别?wait():释放资源,释放锁。sleep():释放资源,不释放锁。
3、wait:notify:notifyALL:都被使用在同步中,因为要对持有监视器(锁)的线程操作。所有要使用在同步中,因为只有同步才具有锁。
4、为什么这些操作线程的方法要定义在Object类中呢?因为这些方法在操作同步中线程时,都必须要标识他们所操作线程只有的锁。只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。不可以对不同锁中的线程进行唤醒。也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所有可以被任意对象调用的方法定义在Object类中。
5、JDK1.5 中提供个多线程升级解决方案。将同步synchronized替换成现实Lock操作。将Object中的wait,notify,notifyAll,替换了condition对象。该对象可以Lock锁,进行获取。
二、多线程:其他操作
6、停止线程:A:定义循环结束标记:因为线程运行代码一般都是循环,只要控制了循环即可。B:使用interrupt(中断)方法:该方法时结束线程的冻结状态,使线程回到运行状态中来。注意:stop方法已经过时不再使用。
7、如何停止线程?只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构。只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于了冻结状态。就不会读取到标记。那么线程就不会结束。
8、当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。Thread类中提供该方法:interrupt方法。
9、join方法:当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。join可以用来临时加入线程执行。
2016年01月19日
day13
一、String类:概述
1、String类:字符串是一个特殊的对象。字符串一旦初始化就不可以被改变。String str=”abc”;String str1=new String(“abc”)。Str和str1的区别:str在内存中有一个对象。Str1在内存中有两个对象。
二、***重点:String类:常见操作
常见的操作有哪些? “abcd” 1,获取。
1.1 字符串中包含的字符数,也就是字符串的长度。
int length():获取长度。
1.2 根据位置获取位置上某个字符。
char charAt(int index):获取位置上某个字符。
1.3 根据字符获取该字符在字符串中位置。
int indexOf(int ch):获取该字符在字符串中位置。返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf(int ch):反向索引。2,判断。
2.1 字符串中是否包含某一个子串。
boolean contains(str);
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1,表示该str不在字符串中存在。
2.2 2.3 2.4 2.5 2.6 所以,也可以用于对指定判断是否包含。
if(str.indexOf(“aa”)!=-1)而且该方法既可以判断又可以获取出现的位置。字符串是否有内容。
boolean isEmpty(str):原理就是判断长度是否为0。字符串是否是以指定内容开头。boolean startsWith(str);字符串是否是以指定内容结尾。boolean endsWith(str);判断字符串的内容是否相同。复写了Object类中的equals方法。boolean equals(str);判断内容是否相同,并忽略大小写。boolean equalsIgnoreCass();3,转换。
3.1 将字符数组转成字符串。
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。
静态方法:static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset,int count);
static String valueOf(char[]);
3.2 将字符串转成字符数组。//重点**。
char[] toCharArray();3.3 将字节数组转成字符串。
String(byte[])String(byte[],offset,count):将字节数组中的一部分转成字符串。3.4 将字符串转成字节数组。
byte[] getBytes();3.5 将基本数据类型转成字符串。
static String valueOf(int)
static String valueOf(double)
//3+“";//String.valueOf(3);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。4,替换。
String replace(oldchar,newchar);5,切割。
String[] split(regex);6,子串。获取字符串中的一部分。
String substring(begin);String substring(begin,end);7,转换,去除空格,比较。
7.1 将字符串转成大写或者小写。
String toUpperCase();
String toLowerCase();7.2 将字符串两端的多个空格去除。
String trim();7.3 对两个字符串进行自然顺序的比较。
int compareTo(string);
三、String类:StringBuffer
8、StringBuffer类:字符串的注组成原理就是通过该类实现的。StringBuffer可以对字符串内容进行增删。StringBuffer是一个容器。很多方法与String相同。StringBuffer是可变长度的。
9、StringBuffer是字符串缓冲区。是一个容器。
10、缓冲区的特点:1,而且长度是可变化的。2,可以直接操作多个数据类型。3,最终会通过toString方法变成字符串。
11、StringBuffer常见操作: C create U update R read D delete 1,存储。
StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
StringBuffer insert(index,数据):可以将数据插入到指定index位置。2,删除。
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定index位置的字符。3,获取。
char charAt(int index);int indexOf(String str);int lastIndexOf(String str);int length();String substring(int start,int end);4,修改。
StringBuffer replace(start,end,string);void setCharAt(int index,char ch);5,反转。
StringBuffer reverse();6,将缓冲区中指定数据存储到指定字符数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)。
12、JDK1.5版本之后出现了StringBuilder。
StringBuffer是线程同步。单线程使用StringBuffer效率较低。多线程使用StringBuffer保证了安全性。
StringBuilder是线程不同步。单线程使用StringBuilder提高了效率。多线程使用StringBuilder可能存在安全问题,但可以通过自定义锁来解决安全问题。以后开发,建议使用StringBuilder。
13、升级三个因素:1,提高效率。2,简化书写。3,提高安全性。
四、基本数据类型对象包装类
14、基本数据类型对象包装类的最常见作用:就是用于基本数据类型和字符串类型之间做转换。
15、数据类型转换:
A:基本数据类型转成字符串。
基本数据类型+”“ 基本数据类型.toString(基本数据类型值);如:Integer.toString(34);//将34整数变成”34“。B:字符串转成基本数据类型。
静态:基本数据类型包装类.parseInt(字符串);如:xxx a=Xxx.parseXxx(String);
int a=Integer.parseInt(”123“);
double d=Double.parseDouble(”12.23“);
boolean b=Boolean.parseBoolean(”true“);非静态:
Integer i=new Integer(”123");
int num=i.intValue();C:十进制转成其他进制。
toBinaryString();toHexString();toOctalString();D:其他进制转成十进制。
parseInt(string,radix)。
2016年01月22日
day14
一、集合框架:概述
1、集合类:为什么会出现集合类?面向对象语言对事物的体现都是以对象的形式,所有为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
2、数组和集合类同是容器,有何不同?数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。
3、集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
4、为什么会出现这么多的容器呢?因为每一个容器对数据的存储方式有所不同。这个存储方式称之为:数据结构。
5、add方法的参数类型是Object。以便于接收任意类型对象。集合中存储的都是对象的引用(地址)。
6、什么是迭代器呢?其实就是集合的取出元素的方式。
二、集合框架:List类
7、List: 特有方法。凡是可以操作角标的方法都是该体系特有的方法。增
add(index,element);addAll(index,Collection);删
remove(index);改
set(index,element);查
get(index);subList(from,to);listIterator();
8、List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所有,在迭代器时,只能用迭代器的方法操作元素,可以Iterator方法时优先的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法获取。
9、Collection |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询速度稍慢。
|--Vector:底层是数据数据结构。线程同步。被ArrayList替代了。
|--Set:元素是无序的,元素不可以重复。
10、枚举就是Vector特有的取出方式。发现枚举和迭代器很像。其实枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长。所有被迭代器取代了。枚举郁郁而终了。
11、LinkedList:特有方法: addFirst();addLast();
getFirst();getLast();获取元素,但是不删除元素。如果集合中没有元素,会出现NoSuchElementException。
removeFirst();removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException。
在JDK1.6出现了替代方法。offerFirst();offerLast();
peekFirst();peekLast();获取元素,但是不删除元素。如果集合中没有元素,会返回null。
pollFirst();pollLast();获取元素,但是元素被删除。如果集合中没有元素,会返回null。
三、集合框架:Set类
12、HaseSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。
13、注意:对于判断元素是否存在,以及删除操作,依赖的方法时元素的hashcode和equals方法。
2016年1月23日
day15
一、集合框架:Set类
1、Set:无序,不可以重复元素。
|--HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法和return 0。
2、TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现comparable接口,覆盖comparaeTo方法。这种方式也称为元素的自然顺序,或者默认顺序。
3、TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
4、当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
5、当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法。
二、集合框架:泛型
6、泛型:JDK1.5版本以后出现的新特性。用于解决安全问题,是一个类型安全机制。
7、泛型的好处:好处:1,将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时期问题减少。更加安全。2,避免了强制转换麻烦。
8、泛型格式:通过<>来定义要操作的引用数据类型。在使用java提供的对象时,什么时候写泛型呢?通常在集合框架中很常见。只要见到<>就要定义泛型。其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可。
9、什么时候定义泛型类?当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
10、泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。
11、特殊之处:静态方法不可以访问类上定义的泛型。如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
12、? 通配符。也理解为占位符。泛型的限定:
? extends E:可以接收E类型或者E的子类型。上限。? super E:可以接收E类型或者E的父类型。下限。
2016年01月24日
day16
一、集合:Map概述
1、Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。
2、Map框架:
1,添加。
put(K key,V value)
putAll(Map extends K,? extends V> m)2,删除。
clear()
remove(Object key)3,判断。
containsValue(Object value)
containsKey(Object key)
isEmpty()4,获取。
get(Object key)
size()
values()
entrySet()
keySet()
3、Map |--HashTable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。JDK1.0。效率低。
|--HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是不同步的。JDK1.2。效率高。|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。
4、和Set很像。其实大家,Set底层就是使用了Map集合。
5、map集合的两种取出方式:1,keySet:将map中所有的键存入到Set集合。因为Set具备迭代器。所以可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。2,Set
6、Map.Entey 其实Entry也是一个接口,它是Map接口中的一个内部接口。
7、什么时候使用map集合呢?当数据之间存在映射关系时,就要先想到map集合。
8、map扩展知识:map集合被使用是因为具备映射关系。
2016年01月26日
day17
一、集合:Collections
1、fill方法可以将list集合中所有元素替换成指定元素。
二、集合:Arrays
2、Arrays:用于操作数组的工具类。里面都是静态方法。
3、asList:将数组变成list集合。
4、把数组变成list集合有什么好处?可以使用集合的思想和方法来操作数组中的元素。注意:将数组变成集合,不可以使用集合的增删方法。因为数据的长度是固定的。如果你增删,那么会发生UnsupportedOperationException。
5、数组变集合:如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
6、集合变数组:指定类型的数组到底要定义多长呢?当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大于了集合的size,就不会新创建数组,而是使用传递进来的数组。所以创建一个刚刚好的数组最优。
7、为什么要讲集合变数组?为了限定对元素的操作。不需要进行增删了。
8、高级for循环:格式:for(数据类型变量名:被遍历的集合(Collection)或者数组){}。
9、高级for循环、迭代器、ListIterator的区别:
高级for循环对集合进行遍历。只能获取集合元素,但是不能对集合进行操作。迭代器除了遍历,还可以进行remove集合中元素的动作。
如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的操作。
10、传统for和高级for有什么区别呢?高级for有一个局限性:必须有被遍历的目标。建议在遍历数组的时候,还是希望使用传统for。因为传统for可以定义角标。
11、JDK1.5版本出现的新特性:可变参数:其实就是上一种数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。隐式将这些参数封装成了数组。
12、方法的可变参数。在使用时注意:可变参数一定要定义在参数列表最后面。
13、import static:静态导入:例如:import static java.lang.System.*;//导入了System类中所有静态成员。注意:当类名重名时,需要制定具体的包名。当方法重名时,指定具备所属的对象或者类。
2016年01月28日
day18
一、其他对象:System
1、System:类中的方法和属性都是静态的。out:标准输出,默认是控制台。int:标准输入,默认是键盘。描述系统一些信息。
2、获取系统属性信息:Properties getProperties()。因为Properties是Hashtable的子类,也就是Map集合的一个子类对象。那么可以通过map的方法取出该集合中的元素。该集合中存储都是字符串。没有泛型定义。
3、Runtime对象:该类并没有提供构造函数。说明不可以new对象。那么会直接想到该类中的方法都是静态的。发现该类中还有非静态方法。说明该类肯定会提供方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。由这个特点可以看出该类使用了单例设计模式完成。该方式的static Runtime getRuntime()。
4、Math类:ceil方法:返回大于指定数据的最小整数。floor方法:返回小于指定数据的最大整数。round方法:四舍五入。pow方法:幂运算。random:返回0-1之间的随机数。
二、IO流:概述
5、IO(Input Outpu)流:IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。流按操作数据分为两种:字节流与字符流。流按流向分为:输入流,输出流。
6、IO流常用基类:字节流的抽象基类:InputStream,OutputStream。字节流的抽象基类:Reader,Writer。注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀(如:InputStream的子类FilelnputStream,如:Reader的子类FileReader。)。
7、字符流和字节流:字节流两个基类:InputStream
OutputStream。字符流两个基类:Reader Writer。先学习字符流的特点:既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。2016年01月30日
day19
一、IO流:Buffered缓冲区
1、字符流的缓冲区:缓冲区的出现提高了对数据的读写效率。对应类:BufferedWriter;BufferedReader。缓冲区要结合流才可以使用。在流的基础上对流的功能进行了增强。
2、缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。该缓冲区中提供了一个跨平台的换行符。newLine()。
3、字符读取流缓冲区:该缓冲区提供了一次读一行的方法readLine(),方便于对文本数据的获取。当返回null时,表示读到文件末尾。
4、readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
5、装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。
6、装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
7、装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。装饰类因为是增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。
二、IO流:字节流
8、字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流:
InputStream
OutputStream BufferedInputStream
BufferedOutputStream
9、流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。通过两个明确来完成。1,明确源和目的。
源:输入流。InputStream Reader。
目的:输出流。OutputStream Writer。2,明确操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,再明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘。目的设备:内存,硬盘,控制台。
2016年01月31日
day20
一、IO流:File类
1、File类:用来将文件或者文件夹封装成对象。方便对文件与文件夹进行操作。File对象可以作为参数传递给流的构造函数。了解File类中的常用方法。
2、File类常见方法: 1,创建。
boolean createNewFile();在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建对象。而且文件已经存在,会覆盖。
boolean mkdir();创建一级文件夹。
boolean mkdirs();创建多级文件夹。2,删除。
boolean delete();删除失败返回false。
void deleteOnExit();在程序退出时删除指定文件。3,判断。
boolean exists();文件是否存在。
boolean isFile();判断是否是文件。
boolean isDirectory();判断是否是文件夹。
boolean isHidden();判断是否是隐藏文件。
boolean isAbsolute();判断是否是绝对路径。4,获取信息。
String getName();获取文件名称。
String getPath();获取文件相对路径。
String getParent();该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
如果相对路径中有上一层目录那么该目录就是返回结果。
getAbsolute();获取文件绝对路径。
lastModified();返回文件最后一次被修改的时间。
length()。
3、因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。
递归要注意:1,限定条件。2,要注意递归的次数。尽量避免内存溢出。
4、练习:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。建立一个java文件列表文件。思路:1,对指定的目录进行递归。2,获取递归过程所有的java文件的路径。3,将这些路径存储到集合中。4,将集合中的数据写入到一个文件中。
二、IO流:Properties类
5、Properties是hashtable的子类。也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。是集合中和IO技术相结合的集合容器,该对象的特点:可以用于键值对形式的配置文件。
6、那么在加载数据时,需要数据有固定格式:键=值。
三、IO流:其他类
7、打印流:PrintWriter与PrintStream:可以直接操作输入流和文件。打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。字节打印流:PrintStream 构造函数可以接收的参数类型: 1,file对象。File。
2,字符串路径。String。
3,字节输出流。OutputStream。字符打印流:PrintWriter 构造函数可以接收的参数类型: 1,file对象。File。
2,字符串路径。String。
3,字节输出流。OutputStream。4,字符数出来:Writer。
8、序列流:SequenceInputStream:对多个流进行合并。
9、操作对象:ObjectInputStream与ObjectOutputStream:被操作的对象需要实现Serializable(标记接口)。
2016年02月01日
day21
一、IO流:其他类
1、RandomAccessFile:随机访问文件,自身具备读写的方法。通过skipBytes(int x),seek(int x)来达到随机访问。
2、管道流:PipedInputStream和PipedOutputStream:输入输出可以直接进行连接,通过结合线程使用。
3、RandomAccessFile:该类不算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数据的元素进行操作。可以通过getFilePointer获取指针位置。同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,读写rw等。
4、如果模式为只读r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。如果模式为读写rw。操作的文件不存在,会自动创建。如果存在则不会覆盖。
5、IO包中的其他类:
操作基本数据类型:DataInputStream与DataOutputStream。
操作字节数组:ByteArrayInputStream与ByteArrayOutputStream。操作字符数组:CharArrayReader与CharArrayWrite。操作字符串:StringReader与StringWriter。
6、用于操作字节数组的流对象。
ByteArrayInputStream :在构造的时候,需要接收数据源,而且数据源是一个字节数组。ByteArrayOutputStream :在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。这就是数据目的地。因为这两个流对象都操作的数组,并没有使用系统资源。所以,不用进行close关闭。在流操作规律讲解时: 源设备:
键盘 System.in,硬盘 FileStream,内存 ArrayStream。目的设备:
控制台 System.out,硬盘 FileStream,内存 ArrayStream。用流的读写思想来操作数组。
二、IO流:字符编码
7、字符编码:字符流的出现为了方便操作字符。更重要是的加入了编码转换。通过子类转换流来完成:InputStreamReader;OutputStreamWriter。在两个对象进行构造的时候可以加入字符集。
8、编码表的由来:计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。
9、常见的编码表:
ASCII:美国标准信息交换码。用一个字节的7位可以表示。ISO8859-1:拉丁码表。欧洲码表。用一个字节的8位表示。GBK2312:中国的中文编码表。用两个字节的16位来表示。GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是Unicode。
UTF-8:最多用三个字节来表示一个字符。„„
10、编码:字符串变成字节数组。解码:字节数组变成字符串。String-->byte[];str.getBytes(charsetName);byte[]-->String;new String(byte[],charsetName)。2016年02月02日
day22
一、GUI:概述
1、GUI:图形用户界面。
GUI:Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样更方便跟直观。
CLI:Command line User Inteface(命令行用户接口)。就是常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。
举例:比如:创建文件夹,或者删除文件夹等。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
2、Awt与Swing:
java.Awt:Abstract Window ToolKit(抽象窗口工具包),需调用本地系统方法实现功能。属重量级控件。
javax.Swing:在Awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
3、继承关系图:
4、布局管理器:
容器中的组件的排放方式,就是布局。常见的布局管理器:
FlowLayout(流式布局管理器)
从左到右的顺序排列。
Panel默认的布局管理器。BorderLayout(边界布局管理器)
东,南,西,北,中。
Frame默认的布局管理器。GridLayout(网格布局管理器)
规则的矩阵。
CardLayout(卡片布局管理器)
选项卡。
GridBagLayout(网格包布局管理器)
非规则的矩阵。
5、创建图形化界面: 1,创建frame窗体。
2,对窗体进行基本设置。
比如:大小、位置、布局。3,定义组件。
4,将组件通过窗体的add方法添加到窗体中。5,让窗体显示,通过setVisible(true)来完成。
6、建立一个简单的窗体:
Container常用子类:Window Panel(面板,不能单独存在。)Window常用子类:Frame Dialog。简单的窗体创建过程:
Frame f = new Frame(“my window”);f.setLayout(new FlowLayout());f.setSize(500,400);//设置窗体大小。
f.setLocation(300,200);//设置窗体出现在屏幕的位置。f.setVisible(true)。
二、GUI:事件监听机制
7、事件监听机制组成:事件源(组件);事件(Event);监听器(Listener);事件处理(引发事件后处理方式)。
8、事件监听机制流程图:
9、事件监听机制的特点: 1,事件源。2,事件。3,监听器。4,事件处理。
事件源:就是awt或者swing包中的那些图形界面组件。事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中。以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产生的动作进行处理。
2016年02月03日
day23
一、网络编程:概述
1、网络编程:
网络模型:OSI参考模型。TCP/IP参考模型。网络通讯要素:IP地址。端口号。传输协议。
2、网络参考模型:
3、网络通讯要素: IP地址:网络中设备的标识。不易记忆,可用主机名。本地回环地址:127.0.0.1主机名:localhost。端口号:用于标识进程的逻辑地址,不同进程的标识。有效端口:0~65535,其中0~1024系统使用或保留端口。
传输协议:通讯的规则。常见协议:TCP,UDP。
4、UDP和TCP: UDP:
将数据及源和目的封装成数据包中,不需要建立连接。每个数据报的大小在限制在64k内。因无连接,是不可靠协议。不需要建立连接,速度快。
特点:面向无连接。数据会被封包。不可靠。速度快。比如:聊天,视频会议,桌面共享。TCP:
建立连接,形成传输数据的通道。
在连接中进行大数据量传输。
通过三次握手完成连接,是可靠协议。
必须建立连接,效率会稍低。
特点:面向连接。可大数据量传输。比较可靠。稍微有点慢。比如:下载。
5、Socket:
Socket就是为网络服务提供的一种机制。通信的两端都有Socket。
网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。
二、网络编程:UDP
6、UDP传输:
DatagramSocket与DatagramPacket。建立发送端,接收端。建立数据包。
调用Socket的发送接收方法。关闭Socket。
发送端与接收端是两个独立的运行程序。
三、网络编程:TCP
7、TCP传输:
Socket和ServerSocket。建立客户端和服务器端。
建立连接后,通过Socket中的IO流进行数据的传输。关闭socket。
同样,客户端与服务器端是两个独立的应用程序。2016年02月04日
day24
一、网络编程:浏览器客户端
1、视频演示讲解。
2016年02月6日
day25
一、正则表达式
1、正则表达式:符合一定规则的表达式。作用:用于专门操作字符串。
2、正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码操作。这样就简化了书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
3、具体操作功能:
1,匹配:String matchess();方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。2,切割:String split();3,替换:String replaceAll();4,获取:将字符串中符合规则的子串取出。
4、获取:操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。