一、什么是继承?
日常生活我们理解的继承:子女继承父母的财产;徒弟继承师父的功夫/衣钵等等;
计算机中的继承:
1、子类继承父类的属性和行为;如,小猫、小狗都属于动物,具有高度相似的属性和行为(属性:名字、毛色、年龄等;跑、吃东西等)
2、子类也可以拥有自身的特性
3、Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类
二、为什么引入继承?(简答:共性抽取)
以上述小猫、小狗为例,如果各自定义一个类,我们会发现代码具有高度的重复性;
小猫类:
public class Cat {
String name;
int age;
String color;
public void eat(){
System.out.println("吃东西呢");
}
public void run(){
System.out.println("撒欢");
}
}
小狗类:
public class Dog {
String name;
int age;
String color;
public void eat(){
System.out.println("吃东西呢");
}
public void run(){
System.out.println("撒欢");
}
}
而如果我们定义一个它们的父类:动物类,并定义属性及方法
然后我们通过继承的方式,小猫、小狗就可以继承动物类的属性和行为,这部分相同的代码只需写一次,提高了复用性,后期维护成本也会相对降低;
三、继承的格式
关键字:extends
格式:
1、首先定义一个父类:如动物类Animal
2、定义子类:public class 子类名称 extends Animal{}
如:
public class Cat extends Animal{
//继承父类中的属性及方法
//同时也可以有自身的特性
public void catchMouse(){
System.out.println("猫捉老鼠");
}
}
四、方法的重写Override
重写与重载的区别:
重写(Override):在继承关系当中,方法的名称一样,参数列表一样;也称为覆盖、覆写
重载(Overload):方法的名称一样,参数列表不一样
方法覆盖重写的注意事项:
1、必须保证父子类中的方法名称一样,参数列表也一样
@Override 写在方法前面,用来检测是不是有效的正确覆盖重写
2、子类方法的返回值必须 【小于等于】 父类方法的返回值范围
ps:Object类是所有类的公共最高父类(祖宗类)
3、子类方法的权限必须 【大于等于】 父类方法的权限修饰符
ps:public > protected > 未写权限修饰符 > private
五、super 与 this 关键字
super关键字:访问父类内容。我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:访问本类内容。
/*
super关键字用法:
1、子类的成员方法中,访问父类成员变量
2、子类的成员方法中,访问父类的成员方法
3、子类的构造方法中,访问父类的构造方法
*/
public class Zi extends Fu{
int num = 20;
public Zi(){
//如果不写,编译器会默认赠送一个
super();//必须是第一个语句,否则会报错
System.out.println("子类构造方法");
}
public void methodZi(){
System.out.println(num);//子类中的num
System.out.println(super.num);//父类中的num
}
public void method(){
super.method();//访问父类中的method方法
System.out.println("子类方法");
}
}
/*
this关键字用法:
1、在本类的成员方法中,访问本类的成员变量
2、在本类的成员方法中,访问本类的另一个成员方法
3、在本类的构造方法中,访问本类的另一个构造方法
*/
public class Zi extends Fu{
int num = 20;
public Zi(){
// super和this两种构造调用,不能同时使用
// super();
//this调用也必须是构造方法的第一个语句
this(2);
}
public Zi(int num) {
this.num = num;
}
public void showNum(){
int num = 100;
System.out.println(num);//局部变量
System.out.println(this.num);//本来中的成员变量
System.out.println(super.num);//父类中的成员变量
}
public void methodA(){
System.out.println("AAA");
}
public void methodB(){
//在本类的成员方法中,访问本来的另一个成员方法
this.methodA();
System.out.println("BBB");
}
}
万丈高楼平地起。