【Java语言基础】类的继承
Java语言的三大特性之一
继承的特点
通过继承,在已有类型基础之上进行扩充或改造,得到新的数据类型。
- 已有的数据类型称为父类或者超类。
- 得到的新数据类型,称为子类或派生类。
- 类的继承提高了程序代码的重用性和可扩充性,缩短了软件的开发周期。
继承的分类
- 单继承--------子类只能有一个直接父类
- 多重继承-----
子类可以有多个直接父类
继承的写法
格式:
父类{
父类的内容
}
子类 extends 父类{
子类的内容
}
例:
package NewBolg;
class inherit {
private String blogger = "董小宇";
public String getBlogger() {
return blogger;
}
public void setBlogger(String blogger) {
this.blogger = blogger;
}
public static void main(String[] agrs){
Subclass subclass = new Subclass();
System.out.println("平台:" + subclass.getBlog() + ",博主是:" + subclass.getBlogger());
}
}
class Subclass extends inherit{
private String Blog = "CSDN";
public String getBlog() {
return Blog;
}
public void setBlog(String blog) {
Blog = blog;
}
}
运行结果为:
平台:CSDN,博主是:董小宇
注意:
- 父类里定义的成员变量都被子类继承过来了,但是
private
权限的不能直接访问,其他的都可以直接访问,父类里定义的成员方法也被子类继承过来。 - 覆盖(重写)子类的方法跟父类继承过来的方法完全一样(方法名一样,参数一样,返回值类型一样)。
- 访问控制权限高于等于父类的方法的访问控制权限,子类该方法抛出的异常类型低于父类的。
重写规则:“三同一小一大”规则
- “三同”:即方法名相同,形参列表相同,返回类型相同;
- “一小”指的是子类方法声明抛出的异常类应该比父类方法声明抛出的异常类更小或者相等;
- “一大”指的子类方法的访问权限应该比父类的方法更大或者相等;
- 覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
方法重写和方法重载的区别
- 覆盖是子类和父类直接的关系;而重载是同一类内部多个方法之间的关系。
- 覆盖一般是两个方法间的,而重载看你是多个重载的方法。
- 覆盖的方法有相同的方法名和形参表;而重载的方法只能有相同的方法名,不能有相同的形参表。
- 覆盖时根据调用它的对象来区分方法;而重载是根据形参标来决定调用的是哪个方法。
注意:
super
是Java提供的一个关键字,它是直接父类对象的默认引用。- 正如
this
不能出现在static
修饰的方法中一样,super
也不能出现在static
的方法中。 - 如果子类定义了和父类同名的数学,也会发生子类属性覆盖父类属性的情形。子类的方法直接访问该属性时,都会访问到覆盖属性,无法访问被覆盖属性–通过
super
来访问父类被覆盖的属性。
例:
如果我们在某个方法中访问名为a的属性,但是没有显示指定调用者,系统查找a的顺序为:
- 查找该方法中是否有名为a的局部变量。
- 查找当前类是否包含名为a的属性。
- 查找a的直接父类中是否包含a的属性,依次上溯a的父类,知道
java.lang.Object
类,如果最终不能找到名为a的属性,则系统出现编译报错。
调用父类的构造方法
子类不会继承父类的构造方法,但有的时候子类构造方法里需要调用父类的构造方法的初始化代码。
子类构造方法调用父类构造方法分如下几种情况:
- 子类构造方法执行体的第一行代码使用
super
显示调用父类构造方法,系统将根据super
调用里传入的实参列表调用父类对应的构造方法。 - 子类构造方法执行体中的第一行代码使用
this
显示调用本类中冲裁的构造方法,系统将根据this
调用里传入的实参列表调用本类的另一个构造方法。执行本类中另一个构造方法时会调用父类的构造方法。 - 子类构造方法执行体中既没有
super
调用,也没有this
调用,系统将会执行子类构造方法之前,隐式调用父类无参数的构造方法。
注意:
super
调用和this
调用很像,区别在于super
调用的是其父类的构造方法,而this调用的是同一个类中承载的构造方法。因此使用super调用父类结构也必须出现在子类构造执行提到第一行,所以this
调用和super
调用不会同时出现。
例:
public class AA {
public static void main(String[] args){
//输出A
//分析:AA为父类,则无影响
AA aa = new AA();
//输出A,B
//分析:BB为子类,调用无参BB,super无参父类,输出A,然后输出无参BB输出语句
BB bb = new BB();
//输出A,AA,BB
//分析:BB为子类,调用含参BB,super带参父类,带参父类中含有this(),先执行不带参父类,然后执行带参父类的输出语句,最后执行带参子类的输出语句
BB bb = new BB(1);
}
AA(){
System.out.println("A");
}
AA(int i){
this();
System.out.println("AA");
}
}
class BB extends AA{
BB(){
super();
System.out.println("B");
}
BB(int i){
super(i);
System.out.println("BB");
}
}
编程我也是初学者,如若有理解错误的地方,希望大家看完之后,发现错误可以评论出来,谢谢大家