继承要讲授8个知识点,分别是①类、超类和子类②Object:所有类的超类③泛型数组列表④对象包装器与自动装箱⑤参数变量可变的方法⑥枚举类⑦反射⑧继承设计的技巧
一、类、超类和子类
1、定义子类
extend表明构造的类派生于一个已存在的类,这个已存在的类称为超类或者父类,新构造的类称为子类。
public class Mananger extend Employee{
}
子类可以获取父类已经定义好的属性、方法,除此之外,还可以定义自己的特有成分,子类是对父类功能的扩展,当父类定义的是私有属性/方法时,子类同样可以获取得到,只不过由于封装性,不可以直接调用。
2、覆盖方法
父类中的方法可能并不适用于子类,在子类中需要对方法进行重新覆盖(重载)
如在父类中有get.salary()方法
在子类要重新定义salary()方法,除了可以调用原父类的方法外,也可以在里面
public class Mananger extend Employee{
public double getSalary(){
double baseSalary= super.getSalary//super关键字调用超类的方法,也可以调用超类的构造器
//super(name,salary,year,month,day)
return baseSalary+bouns
}
}
3、子类构造器
Mannger类的构造器不能访问Employee类的私有域,所有必须利用Employee的构造器对这部分进行实例化,可以通过super实现对超类构造器的调用,使用super调用构造器的语句必须是子类构造器的第一条语句。
如过子类中没有显示的调用构造器,那么就会默认调用不带参数的构造器,如果父类中没有不带参数的构造器,并且在子类的构造器中又没有显示的调用调用父类中的其它构造器,则会产生编译错误。
4、继承层次
由一个公共类派生出来的所有类的集合被称为继承层次,在继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链。
5、多态
概念:允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的方式,
实现多态的技术称为动态绑定,它是在执行期间判断所引用对象的实际类型,根据实际类型调用相应的方法。
其实质就是多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。
多态的作用:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性
例子:
比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
6、理解方法
①编译器会首先查看对象的声明类型和方法名。(列举该类中的方法名f和父类中被修饰为public的方法名f)
②编译器查看调用方法时提供的参数类型(找一个参数类型匹配的,先找子类,再找父类)
③如果是private方法,static、final方法或者构造器,那么编译器可以准确的知道调用哪个方法,这种方式称为静态绑定。当调用方法以来一遍隐式参数的实际类型,并且在运行时实现动态绑定
④当程序运行采用动态绑定时,虚拟机会查找的与该参数相对应的方法,虚拟机预先为每个类创建一个方法表。
如在运行e.getSalary()方法时,虚拟机提取e的实际类型方法表,接下来虚拟机会搜索定义getSalary签名的类,此时的虚拟机已经知道应该调用那个方法,最后,虚拟机调用方法。
在覆盖一个父类的方法时,子类的方法的可见性不得低于父类的可见性。
7、阻止继承:final类和方法
如果将一个类声明为final,其中的方法会自动的成为final,不包括域。
被final定义的类不可以被继承。
8、强制类型转换
不仅基本数据类型可以强制转换,对象也可以
定义类Employye,它的子类Mannger
①向上转型(父类对象引用子类的对象)
Employe e=new Mannger();
e.getSalary(),调用的是子类的方法
②向下转型
会出现错误,在向上转型时,可以说麻雀是鸟,但不能说鸟是麻雀。
9、抽象类
当父类中的方法不具有通用性时,需要将父类中的方法定义为抽象方法,则这个类就需要定义为抽象类,抽象方法没有方法体,类即使不含抽象方法,也可以定义为抽象类。
public abstarct class Mananger extend Employee{
private String name;
public String getName(){
this.name=name;
}
public abstract double getSalary();
}
10、受保护访问
Private: 仅对本类可见
Public:对所有类可见
protected:对本包和所有子类可见
默认:对本包可见
二、Object、所有类的超类
1、概念
Object类时所有java类的祖先,每个类都使用Object类作为父类,所有对象(包括数组)都实现这个类的方法。
Object类有一个默认构造方法 public Object(),在构造类的实例时,都会调用这个构造器方法。
2、方法
①Object默认构造器
②equals()
判断两个对象是否相等,它是比较对象的内存地址,==比较内存中存放的地址(即比较值)
③hashcode(返回该对象的哈希码值)
hashCode 的常规协定是(重写equals()时,必须重写hashcode()并保证此协定):
如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等
如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false
如果两个对象的hashcode值相等,则equals方法得到的结果未知
④toString() 返回该对象的字符串表示
Object类中的toString()方法会打印出类名和对象的内存位置。几乎每个类都会覆盖该方法,以便打印对该对象当前状态的表示。
⑤clone()
浅克隆仅拷贝对象本身和对象的基本变量,而不拷贝对象包含的引用指向对象。
深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。