继承
继承的理解
继承的类叫做子类,或派生类。由多个类抽取出来的这个类称为父类、超类或基类。
继承描述事物的所属关系——>is-a。
继承就是子类继承父类的属性和行为,使子类拥有和父类相同的属性与行为。
继承的好处
提高代码的复用性
提高代码的扩展性
类与类产生了关系,是多态的前提。
继承的格式
通过extends关键字来声明一个类是另一个类的子类
class 父类类名 { ... } class 子类类名 extends 父类类名 { ... }
eg:
package com.ryan.animals;
//被继承类
public class Animal {
//姓名
public String name;
//年龄
public int age;
//吃
public void eat(){
System.out.println(age +"岁的"+name+"在吃东西");
}
}
//继承类
public class Cat extends Animal {
public void catchMouse(){
System.out.println("抓老鼠");
}
}
//测试类
public class CatTest{
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "Tom";
cat.age = 2;
cat.catchMouse();
cat.eat();
}
}
继承的特点一:成员变量
私有化(private)
-
父类中的成员,无论是共有还是私有,均会被子类继承。
-
但子类不能直接对父类的私有成员进行访问,可通过公有方法访问(get/set)
成员变量重名
子父类的成员变量不重名对访问时没有影响的。
当字符变量重名时,要使用super关键字来标明(非私有)父类变量,类似于this。
格式:
super.父类成员变量
继承特点二:成员方法
方法不重名
调用不受影响,对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
方法重名
这是一种特殊的情况,叫做方法的重写(Override)
重写
子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
class Phone {
public void sendMessage(){
System.out.println("发短信");
}
public void call(){
System.out.println("打电话");
}
public void showNum(){
System.out.println("来电显示号码");
}
}
//智能手机类
class NewPhone extends Phone {
public void sendMessage(){
System.out.println("发短信");
System.out.println("发彩信");
}
}
public class ExtendsDemo06 {
public static void main(String[] args) {
// 创建子类对象
NewPhone np = new NewPhone();
// 调用父类继承而来的方法
np.call();
// 调用子类重写的方法
np.showNum();
}
}
在父子类的继承关系当中,创建子类对象,访问成员方法的规则: 创建的对象是谁,就优先用谁,如果没有则向上找。 注意事项: 无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的。 重写(Override) 概念:在继承关系当中,方法的名称一样,参数列表也一样。 重写(Override):方法的名称一样,参数列表【也一样】。覆盖、覆写。 重载(Overload):方法的名称一样,参数列表【不一样】。 方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。 方法覆盖重写的注意事项:
重写的应用
子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。
注意事项:
必须保证父子类之间方法的名称相同,参数列表也相同。
@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类)。小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。
子类方法的权限必须【大于等于】父类方法的权限修饰符。小扩展提示:public > protected > 缺省 > private
备注:缺省不是汉字缺省,而是什么都不写,留空
构造方法
-
子类无法继承父类的构造方法
-
子类初始化过程中,必须先执行父类的初始化动作。
-
子类的构造方法中用super(),表示调用父类的构造方法,初始化父类成员变量后,子类才能用
eg:
class Fu {
private int n;
Fu(){
System.out.println("Fu()");
}
}
class Zi extends Fu {
Zi(){
// super(),调用父类构造方法
super();
System.out.println("Zi()");
}
}
public class ExtendsDemo07{
public static void main (String args[]){
Zi zi = new Zi();
}
}
输出结果: Fu() Zi() 11
继承的注意事项
Java只支持单继承,不支持多继承————一个类只能有一个父类。
Java支持多层继承,A ex B,B ex C。
继承的顶层是Object,Object是所有类的默认父类。
子父类是一种相对概念。