类变量和类方法与类相关联,并且每个类都会出现一次。使用它们不需要创建对象。实例方法和变量会在每个类的实例中出现一次。
静态方法不与任何特定的类实例关联,而实例方法(不带static关键字声明)必须在特定对象上调用。
1.接口(interface):Java的接口是一种用于设计和表达ADT的有用语言机制,其实现方式是实现该接口的类。接口之间可以继承,一个类也可以实现多个接口,一个接口也可以有多个实现。ADT由Interface和class定义和实现。其中接口用于确定ADT规约,类用于实现ADT。
打破了抽象边界,接口定义中没有包含constructor,也无法保证所有实现类中都包含了同样名字的constructor。故而,客户端需要知道该接口的某个具体实现类的名字
接口的优点:接口仅仅指定了客户端的合同;抽象数据类型的多个不同表示可以共同存在于同一个程序中,与实现接口的不同类相同。
多种实现的原因:由不同的表现能选择最适合您使用的实施方案;由不同的行为能选择你想要的实现;通常,性能和行为都有所不同。
2.封装和信息隐藏
区分精心设计的模块和不好的模块的唯一最重要的因素是其隐藏内部数据和其他模块的其他实施细节的程度
设计良好的代码隐藏了所有实现细节,将API与实现完全分离,模块只通过API进行通信,彼此的内在运作没有联系。
信息隐藏的优势:对构成系统的类进行分解;加快系统开发;减轻维护负担;启用有效的性能调整;增加软件重用。
3.继承和重写
可重写方法:允许重新实现的方法。在Java方法中默认是可重写的,即没有特殊的关键词。
严格继承:子类只能添加新方法,无法重写超类中的方法。子类只能向超类添加新的方法,它不能覆盖它们;如果某个方法不能在Java程序中被覆盖,则必须以关键字final为前缀。
方法重写是一种语言功能,它允许子类或子类提供已由其超类或父类之一提供的方法的特定实现。
- 相同的名称,相同的参数或签名,以及相同的返回类型。
- 执行的方法的版本将由用于调用它的对象决定。实际执行时调用哪个方法,运行时决定。
- 如果父类的对象用于调用该方法,则会执行父类中的版本;
- 如果子类的对象用于调用该方法,那么将执行子类中的版本。
父类型中的被重写函数体不为空:意味着对其大多数子类型来说,该方法是可以被直接复用的。但对某些子类型来说,有特殊性,故重写父类型中的函数,实现自己的特殊要求。如果父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写。
注意在重写的时候不能改变原方法的本意。
抽象类
抽象方法:有签名但没有实现的方法(也叫做抽象操作),由关键字抽象定义。
抽象类:包含至少一个抽象方法的类称为抽象类。
接口:只有抽象方法的抽象类接口主要用于系统或子系统的规范。该实现由子类或其他机制提供。
具体类 -> 抽象类 -> 接口
如果某些操作是所有子类型都共有,但彼此有差别,可以在父类型中设计抽象方法,在各子类型中重写。
所有子类型完全相同的操作,放在父类型中实现,子类型中无需重写。有些子类型有而其他子类型无的操作,不要在父类型中定义和实现,而应在特定子类型中实现。
4.多态性,子类型和重载
多态有特殊多态、参数化多态和子类型多态、包含多态。
特殊多态:当函数适用于几种不同的类型(可能不会显示公共结构)并且可能以不相关的方式表现每种类型时。
重载:多个方法具有同样的名字,但有不同的参数列表或返回值类型。可方便客户端调用,客户端可以用不同的参数列表,调用同样的函数。
重载是一种静态多态,函数调用使用“最佳匹配技术”解决,即根据参数列表解析函数。 函数调用中的静态类型检查静态类型检查,在编译阶段时决定要具体执行哪个方法(静态类型检查)。与之相反,重写的方法是在运行时进行动态类型检查。
函数重载中的规则:重载函数必须因参数或数据类型而有所不同。
5.泛型
参数多态性是在函数在一系列类型上工作时获得的; 这些类型通常具有一些共同的结构。它能够以通用的方式定义函数和类型,以便它能够在运行时传递的参数基础上工作,即允许在没有完全指定类型的情况下进行静态类型检查。这是Java中所谓的“泛型(泛型)”。
泛型编程是一种编程风格,其中数据类型和函数是根据待指定的类型编写的,稍后将在需要时作为参数提供的特定类型进行实例化。
泛型编程围绕从具体,高效的算法中抽象出来以获得可与不同数据表示形式结合的泛型算法来生成各种各样有用软件的想法相关。
Wildcards通配符,只在使用泛型的时候出现,不能在定义中出现 ,如: List<?> list = newArrayList<String>(); List<? extends Animal>;List<? super Animal>
6.Java中一些重要的Object方法
equals()- 如果两个对象“相等”,则为true
hashCode() - 用于哈希映射的哈希代码
toString() - 一个可打印的字符串表示
equals&hashCode - 身份语义,如果你想要值语义,你必须重写 - 否则不要。