1. 继承: 两个类之间存在"is-a"关系,就可以用继承来表示。
使用关键字extends来指定。
子类继承父类时,子类自动拥有父类的所有属性和方法(不包括构造器)。
父类中私有的成员,子类继承了,但没有访问权限。
只支持单根继承。
创建子类对象时,首先需要调用父类的构造器对父类中定义的属性进行初始化,然后才会调用自己的构造器对自己特定的属性进行初始化。
2. super关键字:
1)用来在子类中显示访问父类的成员(实例属性,实例方法)
super.属性名; super.方法名(实参列表);
子类和父类存在同名方法,在子类中要显示调用父类的同名方法时,一定要用super来调用。
2) 用在子类构造器中第一条语句,用来显示调用父类中的构造器。
3. 访问控制符:四种访问权限,三种访问控制符
公有的: public 一切皆可见
受保护的:protected 本类,本包,子类可见
默认的:无访问控制符 本类,本包(不建议使用)可见
私有的:private 本类可见
常用方式:属性私有,公开方法
4. 方法的重写(方法覆盖Override)
1)在子父类之间有两个方法的方法名,参数列表相同。返回值类型匹配,访问权限没有缩小时,这两个方法就构成了覆盖。
2)当父类的某个方法的功能不满足子类的需求时,就需要进行方法覆盖
3)方法的覆盖是为了多态。也就是为了提高代码的可扩展性。
5. java.lang.Object类:是Java中所有类的根类。它提供的方法在任何一个类中都可以使用。
1) public String toString(): 返回对象的字符串表示
2) boolean equals(Object obj): 比较两个变量所引用的对象是否相等。默认是比较两变量是否引用自同一个对象。
3) int hashCode():返回该对象的哈希码值。(一般都是对象内存地址传值)
在自定义的类中,经常会重写这三个方法。
6. final修饰符
1) final修饰变量,最终变量。只能赋值一次,必须在构造方法调用完毕之前。之后就不能再更改了。
最常用做法:public static final组合修饰变量-->常量。
2) final修饰方法,最终方法。不能被子类重写。
3) final修饰类,最终类。不能被继承。
4) final修饰参数,最终参数。
7. 多态
1) 向上转型:把子类对象的引用直接赋值给父类变量。父类变量指向子类对象。只能访问父类中定义的属性和方法。不能访问子类中特有的成员。
2) 向下转型:父类对象的引用不能直接赋值给子类变量。需要强制类型转换。为了防止出现ClassCastException,在强制类型转换之前,用instancenof进行类型判断。
3) instanceof的语法:boolean flag = 对象变量名 instanceof 类型名;
4) 方法的多态:在运行期间,判断变量所引用的对象的实际类型,根据其实际类型调用其相应的方法。动态绑定,延迟绑定。
5)多态发生的条件
a) 继承
b) 方法的重写
c) 向上转型
d) 父类变量调用被子类重写的方法
8. 为了提供程序的可扩展性,应该尽量使用多态。一种方式就面向父类编程。声明属性的类型时尽量用父类类型。方法的参数类型也尽量用父类类型。
9. abstract关键字
1)修饰方法,抽象方法,没有方法体。
2)一个类有一个抽象方法时,必须定义成抽象类。(抽象类可以没有一个抽象方法)。抽象类中可以构造方法。
3)一个类继承抽象类,要么实现抽象类中所有的抽象方法,要么定义成抽象类。
4)抽象类可以声明变量,但不能实例化。
5) 抽象类变量可以指向具体子类的对象。
10. 接口是一套规范,功能的声明。用interface来定义。
1) 接口中的所有方法都是public abstract的。
接口中的所有属性都是public static final的。
2) 接口中不能有构造方法,不能实例化。
3) 一个类实现某一接口,要么实现接口中的所有方法,要么定义成抽象类。
4) 接口可以声明变量,接口变量可以指向实现本接口的具体子类的对象
5) 一个类可以实现多个接口,接口间用逗号分隔。
6) 接口和接口之间可以多重继承。
11. 在编程过程中,尽量面向接口编程。属性的类型尽量定义成接口类型。方法的参数尽量定义成接口类型。