1.实例成员和类成员
实例成员中是属于对象的,包括实例成员变量和实例成员方法,只有创建了对象之后才能访问实例成员变量和实例成员方法.
类成员是属于类的,类成员需要用关键字static标识,也称为静态成员,类成员包括类成员变量和类成员方法,通过类名可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也能够引用类成员,类成员也可以通过对象引用.
接下来讲讲类变量和实例变量的区别:
(1): 声明的差别: 没有使用static声明的为实例成员变量,用static 声明的为类成员变量
(2):存储结构的差别: 对于实例变量而言,为每个对象的每个实例成员变量分配一个存储单元使得不同对象的实例成员变量具有不同的值,而对于类成员变量只分配一个存储单元,使得所有的对象共同使用一个类成员变量.
(3):引用方式的差别: 实例成员变量对于对象,通过对象进行访问;类成员变量属于类,既可以通过对象,也可以通过类访问.
2.equals 方法解析:(《JAVA核心技术》176页)
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。“equals()”比较字符串中所包含的内容是否相同。
(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其
对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
下面给出编写一个完美的equals方法的建议:
1)显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量
2)检测this与otherObject是否引用同一个对象:if(this == otherObject) return true;
3) 检测otherObject是否为null,如果为null,返回false.if(otherObject == null) return false;比较this与otherObject是否属于同一个类
如果equals的语义在每个子类中有所改变,就使用getClass检测:if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测:if(!(otherObject instanceof ClassName)) return false;
4) 将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;
5) 现在开始对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase.
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)
3.toString方法(《JAVA核心技术》179页)
用于返回表示对象值的字符串。绝大多数toString方法都遵循这样的格式:类的名字,随后是一对方括号括起的域值。
设计子类的程序员也应该定义自己的toString方法,并将子类域的描述添加进去,如果超类使用了getClass().getName(),那么子类仅调用super.toString()就可以了。
4.ArrayList:
使用起来有点像数组,但在添加或删除元素时,具有自动调节数组容量的功能
下面声明和构造一个保存Employee对象的数组列表:
ArrayList<Employee>staff=new ArrayList<Employee>();
使用add方法可以将元素添加到数组列表中:
staff.add(new Employee("Harry Hacker",...));
使用get和set方法实现访问或改变数组元素的操作,要设置第i个元素可以使用:
staff.set(i,harry);等价于对数组a的元素赋值:a[i]=harry;
使用下列格式获得数组列表的元素:
Employee e=staff.get(i);等价于:Employee e=a[i];
5.签名:方法名和参数类型的统称。
6.继承设计技巧
(1)将公共操作和域放置在超类。
(2)不要使用受保护的域
(3)使用继承实现“is-a”关系
(4)除非所有继承的方法都有意义,否则不要使用继承
(5)在覆盖方法的时候,不要改变预期的行为
(6)使用多态,而非类型信息
(7)不要过多地使用反射。
7.接口技术
这种技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现。是一组对类的需求描述,这些类要遵从接口描述的统一格式进行定义。
接口中的所有方法自动地属于public
接口绝不能含有实例域,也不能在接口中实现方法。
让类实现一个接口,通常需要下面两个步骤:
(1)将类声明为实现给定的接口。
(2)对接口中的所有方法进行定义。需要使用关键字implements: class Employee implements Comparable
8.回调
回调是一种常见的程序设计模式,在这种模式中,可以指出某个特定事件发生时应该采取的动作。
9.内部类
定义在另一个类中的类,原因有以下三点:
内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
可以对同一个包中的其它类隐藏起来。
当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
几种内部类的共性:
A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
10.Spring框架简介
Spring框架由一个容器,一个配置和组织组件的框架,和一组内置的为事务、持久化和Web用户接口提供的服务组成。作为一种轻量级的J2EE框架,Spring提供了一种有效的方式来建立和组织J2EE应用程序。
IoC(Inversion of Control;控制反转);又称DI(Dependency Injection;依赖注入);是面向对象领域新兴的编程思想;也是Spring的精髓所在。简单地说;IoC就是指程序之间的关系由容器来控制;而不是传统实现中由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码转到外部容器,控制权的转移,也就是所谓的反转。IoC将控制创建的职责搬进了框架中;并把它从应用代码脱离开来。当使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它。
Spring IoC,借助于依赖注入设计模式,使得开发者不用理会对象自身的生命周期极其关系,而且能够改善开发者对模式的使用。对于一个对象的管理不是什么困难,难就难在对整个对象群的管理。依赖注入可以让容器管理对象,即“Don’t call me, I will call you”。这样对象本身的生命周期以及对象之间的关系就不再让开发者费神了。
Spring AOP,借助于Spring实现拦截器,开发者能够实现以声名方式使用企业级服务,比如安全性服务、事务服务。AOP 合理的补充了OOP,借助于Spring AOP,开发者能够高效的使用J2EE服务。
Spring服务抽象,借助于各种J2EE API抽象,使得开发者能够一致地使用J2EE 技术,而不管具体是使用什么J2EE API,借助于Spring服务抽象,使代码大大减少,满足“更少代码,更少BUG”的软件设计原则。
Spring IoC+Spring AOP+Spring服务抽象,一起形成Spring,这样一个有机体,使构建轻量级J2EE成为可能。
分享到:
评论