JAVA两天速成极客战记赞助
找工作的时候发现某公司在线编程题只支持JAVA和C家族,作为一个天天python的我简直是灾难,两天速成一下!
第一部分:Java基础
一.1封装与接口
在一个.java文件中,有且只能有一个类带有public关键字。不带关键字的也是可见的,后面会说到。
一.1.1 Interface接口
?更易于管理
?一个类可以使用多个interface
1.2包
?在.java文件的第一行写上package com.vamei.society
?一个Java文件中只能有一个public的类,这个类要和文件同名!
?一个Java类的完整路径由它的包和类名共同构成,比如com.vamei.society.Huma n。相应的Human.java程序要放在com/vamei/society/下。
?一个类可以没有public关键字,它实际上也表示一种权限: 该类在它所在的包中可见。
1.3包的调用
?我们只需要将Human.java编译的Human.class放入相应的文件夹就可以了。比如,我将Human.class放入com/vamei/society/中。实际上,你也可以把.java文件放入相应路径,Java会在使用时自动编译。
?如果整个包(也就是com文件夹)位于当前的工作路径中,那么不需要特别的设置,就可以使用包了。
?可以这样import
?也可以直接提供完整路径使用,则不需要import
?如果包没有放在当前工作路径下,我们在使用包时,需要通知Java。设置系统的C LASSPATH环境变量。
1.4继承
?基类和衍生类
?衍生类不能访问基类的私有对象,public的是一样的都可以访问,衍生类可以访问自己的private,外部不能访问衍生类的private。
?protected表示自己不能被外部访问,但是可以被衍生类访问。
?super和this类似,但是super指父类,比如父类有个getHeight()方法,那么在子类定义新的getHeight()时可以在内部先执行super.getHeight()。当子类和父类有同样方法时(参数都一样),那么对外呈现子类的,内部可以用super或者this区分。
?调用父类的构造方法直接输入super即可。
1.5 static 类数据与类方法
?带static的成员变量是类成员变量,被所有对象共享
?如果一个方法声明为static,那么它只能调用static的数据和方法,而不能调用非s tatic的数据和方法。
?调用类方法时,我们可以通过class.method()的方式调用,也可以通过object.meth od()的方式调用。
?如果变量前加final,那么这个变量一旦赋值不能更改(当然如果这时类的实例,这个实例可以照常操作)
1.6接口的继承与抽象类
?接口可以继承接口,而且可以多重继承,但是类不行。
?抽象类
?抽象类中有抽象方法,继承的时候一定要覆盖这些抽象方法,抽象类与接口不同的是它也有具体方法以及具体变量。
1.7对象引用
?首先看等号的右侧。new是在内存中为对象开辟空间。具体来说,new是在内存的堆(heap)上为对象开辟空间。这一空间中,保存有对象的数据和方法。
?再看等号的左侧。aPerson指代一个Human对象,被称为对象引用(reference)。实际上,aPerson并不是对象本身,而是类似于一个指向对象的指针。aPerson存在于内存的栈(stack)中。
?当我们用等号赋值时,是将右侧new在堆中创建对象的地址赋予给对象引用。
?这里的内存,指的是JVM (Java Virtual Machine)虚拟出来的Java进程内存空间。?new关键字的完整含义是,在堆上创建对象。栈比较快。
?基本类型(primitive type)的对象,比如int, double,保存在栈上。
?一个对象可以有多个引用(一个人可以放多个风筝)。当程序通过某个引用修改对象时,通过其他引用也可以看到该修改。
1.8垃圾回收
?随着方法调用的结束,引用和基本类型变量会被清空。由于对象存活于堆,所以对象所占据的内存不会随着方法调用的结束而清空。进程空间可能很快被不断创建的对象占满。
?Java内建有垃圾回收(garbage collection)机制,用于清空不再使用的对象,以回收内存空间。
?当没有任何引用指向某个对象时,该对象被清空。
1.9参数传递
?基本类型变量的值传递,意味着变量本身被复制,并传递给Java方法。Java方法对变量的修改不会影响到原变量。
?引用的值传递,意味着对象的地址被复制,并传递给Java方法。Java方法根据该引用的访问将会影响对象。
?就是new出来的是引用传递,普通的是值传递,普通的是存在栈中的。
1.10类型转换与多态
?Java是一种强类型(strongly typing)语言,它会对类型进行检查。比如奖Cup类的对象赋给Human类的引用就会报错。
?为什么python也是强类型?
?python看起来是弱类型因为它的引用不用指定类型!!
1.11基本类型变换
?注意,只是基本类型!!!
?widening可以不加变量类型的
1.12 upcast与多态
?我们随后调用了aCup(我们声明它为Cup类型)的addWater()方法。尽管aCup是C up类型的引用,它实际上调用的是BrokenCup的addWater()方法!也就是说,即使我们经过upcast,将引用的类型宽松为其基类,Java依然能正确的识别对象本身的类型,并调用正确的方法。Java可以根据当前状况,识别对象的真实类型,这叫做多态(polym orphism)。多态是面向对象的一个重要方面。
?Java告诉我们,一个衍生类对象可以当做一个基类对象使用,而Java会正确的处理这种情况。
downcast
?我们可以将一个基类引用向下转型(downcast)成为衍生类的引用,但要求该基类引用所指向的对象,已经是所要downcast的衍生类对象。比如可以将上面的hisCup向上转型为Cup类引用后,再向下转型成为BrokenCup类引用。
object类
?Java中,所有的类实际上都有一个共同的继承祖先,即Object类。
第二部分
第二部分:JA V A进阶
2.1 String
?String也是引用传递,不过它不需要new
?String是不可变对象,即使用replace也只是返回一个新的String ?常用String的方法
2.2异常处理
?下图中红色的是unchecked错误,应该由程序员编程解决。蓝色的是由于和编程环境互动产生的错误,应该做异常处理。
java异常处理
?抛出异常
?我们在useBattery()中有异常处理器。由于test()方法不直接处理它产生的异常,而是将该异常抛给上层的useBattery(),所以在test()的定义中,我们需要throws Excepti on来说明。
?我们可以自定义异常类,只要继承现有异常类就可以了。
2.3 IO基础
?基本操作,读文件,文件要在project目录下
?BufferedReader()是一个装饰器(decorator),它接收一个原始的对象,并返回一个经过装饰的、功能更复杂的对象。
?基本操作,写文件
2.4内存管理与垃圾回收
?在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame)。在frame中,保存有该方法调用的参数、局部变量和返回地址。
?Java的参数和局部变量只能是基本类型的变量(比如int),或者对象的引用(referenc
e)。因此,在栈中,只保存有基本类型的变量和对象引用。引用所指向的对象保存在堆
中。(引用可能为Null值,即不指向任何对象)
?当被调用方法运行结束时,该方法对应的帧将被删除,参数和局部变量所占据的空间也随之释放。线程回到原方法,继续执行。当所有的栈都清空时,程序也随之运行结束。
2.5循环引用
?我们以栈和static数据为根(root),从根出发,跟随所有的引用,就可以找到所有的可到达对象。也就是说,一个可到达对象,一定被根引用,或者被其他可到达对象引用。
java循环引用.png
JVM垃圾回收
?JVM的垃圾回收是多种机制的混合。JVM会根据程序运行状况,自行决定采用哪种垃圾回收。
?我们先来了解"mark and sweep"。这种机制下,每个对象将有标记信息,用于表示该对象是否可到达。当垃圾回收启动时,Java程序暂停运行。JVM从根出发,找到所有的可到达对象,并标记(mark)。随后,JVM需要扫描整个堆,找到剩余的对象,并清空这些对象所占据的内存。
?另一种是"copy and sweep"。这种机制下,堆被分为两个区域。对象总存活于两个区域中的一个。当垃圾回收启动时,Java程序暂停运行。JVM从根出发,找到可到达对象,将可到达对象复制到空白区域中并紧密排列,修改由于对象移动所造成的引用地址的变化。最后,直接清空对象原先存活的整个区域,使其成为新的空白区域。
?可以看到,"copy and sweep"需要更加复杂的操作,但也让对象可以紧密排列,避免"mark and sweep"中可能出现的空隙。在新建对象时,"copy and sweep"可以提供大块的连续空间。因此,如果对象都比较"长寿",那么适用于"mark and sweep"。如果对象的"新陈代谢"比较活跃,那么适用于"copy and sweep"。
?上面两种机制是通过分代回收(generational collection)混合在一起的。每个对象记录有它的世代(generation)信息。所谓的世代,是指该对象所经历的垃圾回收的次数。世代越久远的对象,在内存中存活的时间越久。
容器
数组
List
?输出可以用Iterator
?List是接口,ArrayList是实现集合Set
Map 如HashMap