JavaAPI
-
ArrayList等不能保存基本数据类型:应为编译器编译时会将泛型对象转化为所有对象的顶层Object类,基本数据类型非对象不能转化成Object。
-
ArraryList动态数组,因此在创建时无需指定数组的大小。
java中import只是帮助省下每个类前面的包名称:程序不会 变大,不同于c语言
include。,Java.lang和Java.String不必import,因为常用而被预先引用好了。
构造器与垃圾回收器
- 堆:对象的生存空间(实例变量存在于所属的对象中)
- 栈:方法调用和局部变量的生存空间
非基本数据类型的变量保存的只是对象的引用,对象本身一直存在于堆上,基本数据类型和对象的引用放在栈上。
一个对象的实例变量会分配相应所需的内存空间,当对象的实例变量是对象引用类型时,也是只留下引用的空间而非对象本身的空间,该引用的对象是否在堆中取得空间取决于它是否被new出来。
对象的创建:1.声明引用变量,2.创建对象-new Cat()-调用的就是Cat类的构造函数,3.连接对象与引用。
在创建对象时,调用对象的构造方法,父类也需要构造出来,一直延申到object类的构造函数都会被调用。
-
对象的生命周期:当最后一个对该对象的引用消失时,该对象就会变成可回收的。三种消失:
- 引用永久的离开了它的范围: void go(){Cat z=new Cat();}当方法结束时,该对象就会消失
- 引用被赋值给其他对象 Cat z=new Cat ; z=new Cat
- 引用设定为null Cat z=new Cat z=null
-
静态方法用类的名称来调用 而不是用对象引用变量-不用实例化出一个对象再调用
-
静态变量为类成员所共享。
泛型
-
public void takeThing(ArrayList list)的含义:表示接收的参数为ArrayList 或者继承自Animal的集合。
-
在多态中,对于普通数组,一个方法接收Anmial类型数组,则也可以接收cat类型数组,而对于集合泛型ArrayList animals 不允许接收ArrayList类型的,因为如果传入一个Cat的ArrayList给该方法,再animals.add(new Dog()),则在cat集合中加入了dog
此时引入万用字符<? extends Animal> 此时可以接收ArrayList类了,因为它不允许再添加除Cat类的到集合中了。
public void takeThing(ArrayList<?extends Animal> list)等同于
public void takeThing (ArrayList list)
-
ArrayList对象类型比较方法:对于非直接可比较的如Song集合,其ArrayList的sort排序需要实现Comparable接口。Song类内部重写compareTo方法。但一般的,会需要多种比较方式,前者只能有一个,故ArrayList有以不同的Comparator的参数进行排序的sort方法,只需要创建不同的类实现不同的Comparator比较器即可。 如以歌手对歌曲进行排序:
class ArtistCompare implements Comparator{
public int compare(Song one, Song two){
return one.getArtist().compareTo(two.getArtist())}}
创建实例传入sort方法即可。
Art artistcompare=new Art .sort(songList,artistcompare)
对象相等性判断:
-
hashCode()方法:返回的序号默认为根据内存位置计算得来的,所以任何对象实际上不会有相同的hashcode,HashSet就是以此判断对象是否重复的。(但通过重写hashCode方法可能会因为算法的问题计算出相同的hashcode来)
-
==:一般用以判断值相等,在对象相等判断中判断两个引用是否引用的同一个对象。
-
.equals():判断两个不同的对象是否相等,默认为执行==,即比较是否引用堆上同一个对象,因此若希望把两个不同的对象视为相等,必须重写equals和hashCode()方法。
-
示例:
-
此中,通过对象的Title调用equals代替对象的equals进行判断,其中title为自然就重写过的String类型。
在HashSet集合中,使用对象的hashcode来判断,如果hashcode不同,HashSet认为对象不同,所以必须重写hashCode()来确保对象有相同的值–避免两个认为相同的对象却在HashSet中不同,但是有相同的hashCode()的对象也不一定相等,所以找到了hashcode相等的两项,也会调用一个的equals来判断是否真的相等。
两个对象相等,其hashcode必须相等,所以若重写equals()方法,则一定要重写hashCode()方法。有相同的hashcode值的两个对象不一定相等,还要看equals。
应用程序部署
三种方式:
-
本机部署,以可执行JAR包的方式。如下载的单机游戏等,要求用户机有java环境。
-
半本机半远程,分客户端和服务端。如网络游戏等。
-
远程部署,如浏览器等。
Executable Jar:JAR就是一种压缩文件,它将项目运行需要的类文件(.class)包装起来,Java虚拟机从JAR包中载入类,调用其main()方法。JAR包需要暴露在classpath下,虚拟机才能找到,所以一般将jar放在工作目录下。
JWS - Java Web Start :通过网络来发布的应用程序
RMI - Remote Method Invocation 远程程序调用:一般来说,对象的方法调用都是在相同的虚拟机上面进行的,两个对象处于同一堆上。
RMI远程调用过程:如何从一台计算机上获取另外一台计算机的信息?通过Socket和输入输出流。远程过程调用的设计:服务器,客户端,服务器辅助设备,客户端辅助设备。
- 客户端对象对客户端辅助设备对象调用方法do()。
- 客户端辅助设备把调用信息打包通过网络发送到服务器的辅助设备上。
- 服务端的辅助设备解开来自客户端辅助设备的信息,以此调用服务器的真正服务。
RMI创建好辅助设备等等,让客户端对辅助设备的调用看起来就是本地调用,因此客户端无需关注socket或者输入输出细节。
Servlet:其并非java标准函数库的一部分,必须要有支持servlet的Web服务器才能运行,如Tomcat。一般的Servlet是通过继承HttpServlet并覆盖doGet()和doPost()方法来实现的。