继承
作用:缩减代码,简化重复代码
通过关键字extends来实现,格式如:class 子类 extends 父类{}
继承的本质
子类继承父类之后,实例化子类对象的时候,系统会首先实例化父类对象,而此时调用的是父类没有参数的构造函数,如果父类的构造函数带有参数,我们可以使用super给父类构造函数传参数,“super();”必须写在子类构造函数的第一句,传入的参数必须和父类构造函数中参数列表类型匹配;也可以给父类增加一个不带参数的空构造函数。例:
packageextends1;classDialog{protectedString title;//public Dialog(){}改错方法2:不带参数的构造函数
publicDialog(String title){this.title =title;
}public voidshow(){
System.out.println(title+"对话框显示");
}
}class FontDialog extendsDialog{privateString fontName;public FontDialog(String title,String fontName){//报错//super(title);改错方法1:super传参数
this.title =title;this.fontName =fontName;
}
}public classMain {public static voidmain(String[] args){
FontDialog fd= new FontDialog("字体","宋体");
}
}
注:1、如果一个成员要被子类继承之后使用,这个成员不能是 private 的,因为私有的成员不能在类的外部使用,当然也不能被子类使用。一般,成员变量定义为 protected类型,成员函数定义为 public 类型。
2、Java 不支持多重继承,一个子类只能有一个父类,不允许出现:class 子类 extends 父类 1,父类 2 {}
3、Java 中可以有多层继承,比如 A 继承了 B,B 又继承了 C。此时相当于 A 间接继承了 C。
成员覆盖
一般发生在子类继承父类的成员函数之间(成员变量之间一般很少使用),当子类函数的定义和父类相同时(名称相同,参数列表相同,返回类型相同),最后调用的是子类中的方法,这叫做覆盖或重写(Override)。
注:1、如果在子类中定义了一个名称和参数列表与父类相同的函数,但是返回类型不同,此时系统会报错。
2、 在重写时,子类函数的访问权限不能比父类的更加严格。比如,父类的成员函数访问权限是 public,子类重写时,就不能定义为 protected。
3、在覆盖的情况下,如果一定要在子类中调用父类的成员函数,可以使用 super关键字,调用父类的成员函数方法是:super.函数名。
成员覆盖的作用
在不改变源代码的情况下,能够对一个模块的功能进行改造。对父类进行继承时,拥有的一部分功能无法完全满足需要,我们就可以通过覆盖完善。例:
现有:
packageextends2;public classImageOpe {public voidread(){
System.out.println("从硬件读取图像");
}public voidhandle(){
System.out.println("图像去噪声");
}public voidshow(){
System.out.println("显示图像");
}
}
我们需要:
packageextends5;public class MyImageOpe extendsImageOpe{public void read(){//进行重写
System.out.println("从文件读取图像");
}public void handle(){//继承后加改造
super.handle();
System.out.println("图像锐化");
}public void show(){//继承
super.show();
}
}public classMain {public static voidmain(String[] args){
MyImageOpe mio= newMyImageOpe();
mio.read();
mio.handle();
mio.show();
}
}
输出为:
从文件读取图像
图像去噪声
图像锐化
显示图像
原文:https://www.cnblogs.com/541wsy/p/12511827.html