继承与抽象
继承
定义:把所有类相同的属性行为抽象出来,单独定义一个类,使子类可以访问父类中非私有的属性和行为,提高代码复用性。
继承的代码形式
- 父类定义形式和一般类相同
- 子类定义用关键字extends
class 父类 {
...
}
class 子类 extends 父类 {
...
}
子类与父类的关系
重名
-
若是方法重名,则先在本类中进行寻找,找不到自动向父类进行寻找。
-
若是属性重名,则若直接调用本类属性,找不到自动向父类进行查询。
若是使用方法间接调用,则先调用本方法所在的类的属性,若是子类,则找不到后自动向父类进行寻找,若是父类则不在寻找。
- 为区分关系,分别以下用关键字进行区别
局部变量:直接写
本类变量:使用this.关键字
父类变量:使用super.关键字
不重名
- 不重名则直接调用
覆盖重写
- 与重载的区别
重写:子类与父类方法名称相同,参数相同,返回值的类型小于和等于父类的值
重载:名称相同,参数不同。
- 注意事项
1.必须保证父子类之间方法的名称相同,参数列表也相同。
@override:写在方法前面,用来检测是不是有效的正确覆盖重写。
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。2.子类方法的返回值必须【小于等于】父类方法的返回值范围。
小扩展提示:java.Lang.Object类是所有类的公共最高父类(祖宗类),java.Lang.string就是object的子类。
3.子类方法的权限必须【大于等于】父类方法的权限修饰符。
小扩展提示:public>protected>(default)>private 备注:(default)不是关键字default,而是什么都不写,留空。
- 重写的方法中,如果需要调用父类中相同的方法代码,可用super,调用。
继承中的构造方法
继承关系中,父子类构造方法的访间特点:
1.子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。
2.子类构造可以通过super关键字来调用父类重载构造。
3.super的父类构造调用,必须是子类构造方法的第一个语句。有且只能有一个 总结:子类构造方法中必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super必须放在子类构造方法色首位,有且只有一个。
关键字super的用法
- 子类中调用父类成员属性
- 子类调用父类成员方法
- 子类构造方法调用父类构造方法
关键字this的用法
super关键字用来访问父类内容,而this关键字用来访间本类内容。
用法有三种:
1.在本类的成员方法中,访问本类的成员变量。
2.在本类的成员方法中,访问本类的另一个成员方法。
3.在本类的构造方法中,访问本类的另一个构造方法。
在第三种用法当中要注意:
A.this(..…)调用也必须是构造方法的第一个语句,有且只有一个。
B.super和this两种构造调用,不能同时使用,即使用this关键字后,则系统不再赠送super()。
Java继承的三个特点
- 继承是单继承
- 继承是多级继承
- 一个父类可以有多个子类
抽象
抽象方法
-
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
-
定义格式:
修饰符 abstract 返回值类型 方法名 (参数列表);
抽象类
-
抽象方法必然在抽象类中,但抽象类中不一定有抽象方法,同时抽象类中也可包含普通成员方法。不包含抽象方法的抽象类目的就是为了让使用者不能直接创造对象,要间接使用它
-
定义格式:
abstract class 类名字 { }
抽象类的使用
-
抽象类不能直接创建对象,只可以被子类继承使用。
-
抽象中的抽象方法必须全部被子类重写变成具体方法后使用。否则子类包含抽象方法,亦是抽象类,不能直接创造对象,只可以被继承使用。
-
抽象类的调用必须由子类创建对象后,由子类调用。
-
抽象类中可以有构造方法,供子类创建对象时,初始化父类成员使用