首页 > 代码库 > Java 面向对象
Java 面向对象
1、对象与实例
对象与实例之间的区别:对象是同类事物的抽象形式,实例是对象的具体化。对象可以实例化很多实例。
无需实例化也可以使用的是对象的静态方法。也就是说这个方法适用于同类事物的所有对象。
当获取或设定同类事物不同属性的时候,就需要对对象进行实例化,这些实例之间相互区分。
2、嵌套类
对于C++来说,嵌套类是合成型聚集关系的另一种表达方式,在代码生成时映射成inline class。Java的内部类与C++的嵌套类的区别在于:是否有指向外部的
引用。Java的内部类以为着:创建一个static内部类的对象,不需要一个外部类对象,不能从一个内部类的对象方位一个外部类的对象。
关于非GUI的内部类,这篇文章蛮好:http://lavasoft.blog.51cto.com/62575/179484/
关于GUI编程的内部类(事件监听),这个文章可以作为参考,大致的套路都差不多:http://blog.sina.com.cn/s/blog_78e96ce70100tr9c.html
3、集合类
Java的容器类型有两种:Collection、Map。
Collection:
(特定次序存放)List :ArrayList,LinkedList,Vector
(每个值只能保存一个对象,不能含重复的元素)Set:HashSet<散列函数>,TreeSet<红黑树>,LinkedHashSet<链表+散列>。
Queue: PriorityQueue。
Map:
HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用
null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashTable:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null
对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,
用作键的对象必须实现 hashCode
方法和 equals
方法。
TreeMap:基于红黑树(Red-Black tree)的 NavigableMap
实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator
进行排序,具体取决于使用的构造方法。
(1)容器类与数组的区别
容器类只是能够持有对象的引用,而不是对象的副本,一旦将对象置于容器内,对象的类别信息就损失掉了。
所有的容器中,ArrayList应当作为默认的选择。
插入、删除频繁时使用LinkedList。
插入和查找较多时,HashSet优于HashTree,只有需要一个有序输出时采用TreeSet。
HashMap用于快速查找。
4、构造函数和析构函数
1、构造函数可以被重载,这样允许多种方式初始化一个类。
2、构造函数没有返回值。
3、存在继承关系时,子类构造函数调用前,父类构造函数调用。
4、多个构造函数存在时,可以决定调用其中某一个,但是不可以不调用;不显式的调用,那么就会调用无参构造函数。
5、存在继承关系时,析构函数的调用顺序与构造函数相反。
5、多态性
首先区分重载和覆盖。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序
(参数类型必须不一样;
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
编译器对于重载的函数,在编译阶段就会进行区分,所以重载并非多态性的一部分,因为这些函数都是静态的。而所谓的多态,核心思想是晚绑定,即运行时
绑定,是动态的。
覆盖:子类重写父类的同名函数。
多态,一言以蔽之:允许将子类的指针或者引用赋给父类。
1、使用父类类型的引用指向子类的对象;
2、该引用只能调用父类中定义的方法和变量;
3、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
4、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。