什么是继承
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
继承格式
class 子类名 extends 父类名 { }
实例运行:
代码实现
可以看到 子类“布偶猫”继承了“猫”的抓老鼠与动物的“吃饭”、“喝水”
子类“哈士奇”继承了“狗”的看家与动物的“吃饭”、“喝水”
public class Animal_test {
public static void main(String[] args) {
buou yunyun = new buou();//创建一个布偶猫对象
yunyun.eat();
yunyun.drink();
yunyun.zhualaoshu();
yunyun.haokan();
System.out.println("-------------------");
hashiqi erha=new hashiqi();//创建一个哈士奇对象
erha.drink();
erha.eat();
erha.kanjia();
erha.chaijia();
}
}
运行结果
哪些内容可以被继承 ?
1.构造方法(构造器)不可继承
编写一个类时,被 public 修饰的方法必须与文件名一致,当子类继承这个类时,如果开始构造方法,则子类构造的类名违背了构造方法的规则,所以构造方法不能被继承
例如:我编写了一个GirlFriend 类
public class GirlFriend {
private int age;
private int length;
public GirlFriend() {
}
public GirlFriend(int age,int length) {
this.age = age;
this.length=length;
}
我让子类 Animal_test 继承父类 GirlFriend,此时new一个对象Animal,可以看到带参方法a1报错,而a2不报错的原因是a2并不是继承下来的,如果一个类中没有构造方法,那么系统会自动给你添加一个默认的构造方法,这个a2就是子类默认原有的方法,并不是继承自GirlFriend
public class Animal_test extends GirlFriend{
public static void main(String[] args) {
Animal a1=new Animal(12,34); //报错
Animal a2=new Animal(); //不报错
}
}
2.成员变量可以继承
Animal_test 继承 GirlFriend 后可以对 GirlFriend 的成员变量age、lenght进行调用
public class Animal_test extends GirlFriend{
public static void main(String[] args) {
Animal_test a1 = new Animal_test();
a1.age=18;
a1.length=15;
System.out.println(a1.age);
System.out.println(a1.length);
}
}
父类中被 private 修饰的成员变量也可被子类调用,方法仍为set、get
public class Animal_test extends GirlFriend{
public static void main(String[] args) {
Animal_test a1 = new Animal_test();
a1.setAge(18);
a1.setLength(15);
System.out.println(a1.getAge());
System.out.println(a1.getLength());
}
}
3.成员方法 虚方法 可以继承
虚方法的特征:
非private修饰、非static修饰、非final修饰
在所有子类的默认父类 object 中有5个虚方法,所以任何类都可调用object中的5个方法
在父类中编写一个方法run
public void run()
{
System.out.println("她正在跑");
}
因为run是只由public定义的虚方法,所以子类可以调用父类方法run
public class Animal_test extends GirlFriend{
public static void main(String[] args) {
Animal_test a1 = new Animal_test();
a1.run();
}
}
运行结果
成员变量继承的特点 this、super
输出成员变量时,变量打印寻找顺序为就近原则:本方法成员>本类成员>父类成员。使用 this 为优先输出本类中的成员变量,super 为优先输出父类中的成员变量,啥都不加即为就近原则
public class Animal_test {
public static void main(String[] args) {
Zi z = new Zi();
z.ziShow();
}
}
class Fu {
String name="父类中的name";
}
class Zi extends Fu{
String name="本类中的name";
public void ziShow()
{
String name="此方法中的name";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
运行结果:
方法的重写
当父类中的方法,不能满足子类现在的需求时,我们就需要把这个方法进行重写。
子类中重写的方法上面需要加上@override
比如说下图的 “buou” 类继承了父类 “cat” 的方法,使buou也可以进行 “猫在抓老鼠”,但是buou还有一个 “上蹿下跳” 的特性,而从父类继承的方法显然没有“上蹿下跳”,无法满足需求,此时可以使用@override对方法 “zhualaoshu” 进行重写,为其添加一个 “上蹿下跳” 的方法
父类:
public class Cat extends Animal{
public void zhualaoshu()
{
System.out.println("猫在抓老鼠");
}
}
子类:
public class buou extends Cat{
public static void main(String[] args) {
buou q = new buou();
q.zhualaoshu();
}
@Override
public void zhualaoshu()
{
super.zhualaoshu();
System.out.println("猫在上蹿下跳");
}
}