1、java知识框架概要
2、java基础
1. 虚拟机:
Java是解释性语言(C/C++是编译性语言),因为有了虚拟机的机制,java可以实现,一次编译,多平台运行。类似分层的思想。
2.垃圾回收机制
这和C#类似,一个经典的理解,就是满3退1的例子中,也就是链表中的指针脱离链表后,java会自动=回收那些垃圾,垃圾的实质是在栈中和堆中失去引用的对象。
3、内存分析
C c1 = new C();
C c2 = new C();
内存大致可以分为三个区域:栈、堆、data数据区、code segment。 8种基本的类型存放在栈中,其他的引用类型,放在堆中,大小可以变化。堆中是通过new关键字new出的对象,该对象封装了类的属性,但不包含类中定义的方法;Data segment数据区存放常量和静态变量;code segment存放方法代码,静态的方法,通过类直接调用,非静态方法,通过对象的引用也就是new出的对象,来调用。
二维数组中,一维中的内存中存放的是对二维数据的引用,二维对象是对一维的引用。
通过赋值的临时变量,形参一旦使用完后,在栈中会自动销毁;返回值在栈中占用临时的空间,等方法执行完后,这个空间就没有了。
多态与内存,一个对象可以封装其他的对象,这样就具有了多重身份,反映到内存中就是,可以有多个对象引用,多态的实质,就是在栈中通过不同的引用,调用堆中的对象的相关方法。
4、面向对象
java中是单继承,区别于C#,java通过实现多个接口,来避免C++中双重继承的问题。接口在java中有更大的用途。
super是继承父类的构造函数的关键字,需要放到子类构造函数的首位。
override(write)重写, 是继承关系,重载是在一个类中,不同的函数签名,具有相似的功能。在重载中, 因为当函数名,参数都相同,只有返回值不同的时候,编译器无法识别是调用的哪个函数,所以,这是一种错误的做法,编译不通过。
重写的方法,的权限不能比父类的方法更加严格,如果父类是protected,而集继承的方法,就不能是private。java的default关键字的权限是同一个包级别的。
java对大小写敏感,所以,仅仅是大小写不同的两个方法,不能是重写,而是两个方法。
抽象类,是包含抽象方法的类,使用abstract关键字声明,java中的抽象类,类似C++中的纯虚函数,需要被继承和重写。
Final相当于C#中的Constant常量,一旦被定义好后,就不可修改。
匿名类,适用于比较固定的简单的场合,但是编译的时候还会编译成一个class。
对象的equals方法和基本类型是不一样的,因为对象是在堆中创建的空间,而基本类型的数据只在栈中开辟空间,比如说两个值相同的整型数据,在栈中指向同一个地址,具有相同的hashCode,而通过两次new出来的对象,在堆中占有不同的空间,在栈中又不同的引用,不同的指针(java中没有指针的概念)。
5、异常处理
在处理程序中的某些业务的时候,很有可能会遇到一些错误,而这些错误越早发现,越早处理越好,所以,java的语法规定,在调用这样的方法的时候,必须带有异常处理的相关操作。而这一点额方法在定义的时候都是带有throws关键字的。比如,流相关的操作(FileInputStream)等。
java中错误分为三类:Error(无法处理)、Exception(必须要处理的)、Runtime Exception(可以不处理)。
错误的处理,按照先小后大、及早抓取、不可扩大和缩小范围的原则,如果某个方法无法对错误处理,那么需要显示的将潜在的错误抛出。
通过继承java.lang.Exception类,可以自定义异常可以为错误定义id号。
6、值得借鉴的设计思路——多态和外观模式的结合
在java的事件监听机制中,MouseAdapter类实现了mouseListener接口,我们自定义的Monitor类,直接从MouseAdapter继承,解决了省去书写接口中没有必要的方法,代码显得比较简洁。
也就是事先用一个类实现了某个接口内部复杂的方法,当我们在不同的场合,需要的时候,我们通过自定义类继承这个类,只去重写我们需要的方法,这样编码就简化了很多,这充分利用了面向对象的多态的思想和设计模式中外观模式,值得借鉴。