父类和子类
在java术语中,如果类C1拓展自另一个类C2,那么就将C1称为子类(次类,拓展类,派生类),将C2称为父类(超类,基类)。
子类从它的父类中继承可访问的数据域和方法,还可以添加新数据域和新方法。
父类中的私有数据域在该类之外是不可访问的。
一个java类只可能直接继承自一个父类(单一继承)。
super关键字
关键字super是指这个super关键字所在的类的父亲,super关键字可用于调用父类的构造方法和方法。
1.调用父类的构造方法
语句super()调用父类的无参构造方法,而语句super(arguments)调用与参数匹配的父类的构造方法。语句super()和super(arguments)必须出现在子类构造方法的第一行,这是显示调用父类构造方法的唯一方式。
2.构造方法链
构造方法可以调用重载的构造方法或父类的构造方法。如果它们都没有被显式地调用,编译器就会自动地将
super()作为构造方法的第一条语句。在任何情况下,构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止,这就是构造方法链。
一般情况下,最好能为每个类提供一个无参构造方法,以便于对该类进行扩展,同时避免错误。
3.调用父类的方法
super.方法名(参数);
方法重写
方法重写:子类从父类中继承方法,子类修改父类中定义的方法的实现。
当实例方法是可访问时,它才能被覆盖。因为私有方法在它的类本身以外是不能访问的,所以它不能被覆盖。如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。
与实例方法一样,静态方法也能被继承。但是静态方法不能被覆盖。如果父类中定义的静态方法在子类中被重新定义,那么在父亲中定义的静态方法将被覆盖。可以使用语法:(父类名.静态方法名)调用隐藏的静态方法。
方法重写与重载
方法重写发生在通过继承而相关的不同类中;方法重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。
方法重写具有同样的签名和返回值类型;方法重载具有同样的名字,但是不同的参数列表。
为了避免错误,可以使用一个特殊的Java语法,称为重写标注,在子类的方法前面放一个@Override,该标注表示被标注的方法必须重写父类的方法,编译器将报告一个错误。
多态
子类型:子类定义的类型
父类型:父类定义的类型
多态:父类型的变量可以引用子类型的对象
动态绑定
方法可以在沿着继承链的多个类中实现。JVM决定运行时调用哪个方法。
声明类型:一个变量必须被声明为某种类型
实际类型:被变量引用的对象的实际类
动态绑定:实例化对象o的声明类型是Object,实际类型是
String,因为o指向使用new String()创建的对
象。o调用哪个toString()方法由o的实际类型决定。
对象转换和instanceof运算符
隐式转换:Object o = new Student();
显式转换(向上转换):Student b = (Student)o;
在尝试转换之前确保该对象是另一个对象的实例,可以使用
运算符instanceof来实现的。
Object类,ArrayList类
访问控制修饰符
参考链接
防止拓展和重写(final)
一个被final修饰的类和方法都不能被拓展。被final修饰的数据域是个常数。
小提示
面向对象程序设计的三大支柱是封装,继承,和多态。