比较的是对象的地址
Java对象的equals方法和hashCode方法规定如下: 1.相等(相同)的对象必须具有相等哈希码(或者散列码) 2.如果两个对象的hashCode相同,他们并不一定相同
当新对象被创建的时候,构造函数就会被调用。每一个类都有构造函数。如果程序员没有提供构造函数,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数重载和方法重载很类似。可以为一个类创建多个构造函数。每一个构造函数必须有他唯一的参数列表。 Java不支持像c++中那样复制构造函数,这个不同点是因为如果你不自己写写构造函数的情况下,Java不会创建默认的复制构造函数。
Java中方法重载发生在同一个类里面两个或者多个方法名相同但是参数不同的情况下。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问
1.list()方法无法利用一级缓存和二级缓存(对缓方法存只写不读),他只能在开启查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。 2.list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题
1.单一职责原则:一个类只做他该做的事情(想表达的就是“高内聚”,写代码最终极的原则就是“高内聚,低耦合”,高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成她该做的事情,而不涉及与他无关的领域就是践行了高内聚的原则,这个类就只有单一职责;另一个是模块化,一个好的软件系统,它里面的每个功能模块也应该是可以轻易的拿到其它系统中使用的,这样才能实现软件复用的目标) 2.开闭原则:软件实体应当对扩展开放,对修改关闭(在理想的状态下,当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类,不需要修改原来的仍和一行代码。要做到开闭有两要点:1.抽象是关键,一个系统中如果没有抽象类或接口那么系统就没有扩展点。2.封装可变性:将系统中的各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而混乱) 3.依赖倒转原则:面向接口编程。(该原则说的具体一点就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不是具体类型,因为抽象类型可以被它的任何一个子类型所替代) 4.里氏替换原则:任何时候都可以用子类型替换掉父类型(能用父类型的地方就一定能使用子类型,可以检查继承关系是否合理,如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的,子类一定时增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多) 5.接口隔离原则:接口要小而专,绝对不能大而全(臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,Java中接口代表能力、代表约定、代表角色,能否正确使用接口是判断编程水平高低的标准) 6.合成聚合复用原则:优先使用聚合或合成关系复用代码(通过继承来复用代码是面向对象程序设计中被滥用最多的东西,类与类之间简单来说就三种关系,ls—A关系,Has—A关系、Use—A关系,分别代表继承,关联和依赖、任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的) 7.迪米特法则:又叫做最少知识原则,一个对象应当对其他对象有尽可能少的了解,在复杂的系统都可以为用户提供一个简单的门面,Javaweb开发中作为前端控制器的Servlet或Filter就是一个门面,浏览器对服务器的运作方式一无所知,但是通过前端控制器就能根据你的请求得到相应的服务。
可以通过类对象的getDeclareField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。 下面的代码实现了一个反射的工具类,其中两个静态方法分别用于获取和设置私有字段的值,字段可以是基本类型也可以是对象类型。 代码演示:
import java.lang.reflect.Method; class MethodInvokeTest{ public static void main(String[] args) throws Exception{ String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str)); } }方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的运行时的多态性。重载发生在一个类中,同名方法如果有不同的参数列表则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比夫雷被重写方法声明更多的异常。重载对返回类型没有特殊要求
一个内部类对象可以访问创建它的外部类对象的内容,内部类如果不是static的,那么他可以访问创建它的外部类对象的所有属性,内部类如果是static的,即为nested class,那么他只可以访问创建它的外部类对象的所有static属性,一般普通类只有public和package的访问修饰,而内部类可以实现static,protected,private等访问修饰。当从外部类继承的时候,内部类是不会被覆盖的,他们是完全独立的实体,每个都在自己的命名空间内,如果内部类中明确的继承,就可以覆盖原来内部类的方法
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每一个异常都是一个对象,它是Throwable的类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过五个关键词实现的,一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常“的程序,紧跟在try程序后面,应该包含一个catch子句来指定你想要捕获的”异常“类型。throw语句用来明确的抛出一个”异常“。throws用来标明一个成员函数可能抛出的各种”异常“。Finally为确保一段代码不管发生异常都被执行一段代码。可以在一个成员函数调用的外部写一个try语句,在这个成员函数内部另写一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到了堆栈上面,直到所有的try语句都完成。如果下一级try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制不能满足要求。 与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public,一个类可以实现多个接口
值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的
Static Nested Class是被声明为静态(Static)的内部类,他可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能 实例化。Static-Nested Class的成员,即可以定义为静态的(static),也可以定义为动态的(instance)。Nested Class的静态成员(Method)只能对Outer Class的静态成员(static member)进行操作(ACCESS),而不能Access Outer Class的动态成员(instance member),而Nested Class的动态成员(instance method)却可以 Access Outer Class的所有成员,因为静态方法(Static method)总是跟CLASS相关联(bind CLASS),而动态方法(instance method)总是跟 instance object相关联,所以,静态方法(static method)永远不可以Access跟object相关的动态成员(instance member),反过来就可以,一个CLASS的instance object可以Access这个CLass任何成员,包括静态成员(static member)