继承
关键字: extends
格式:
public class 子类名 extends 父类名
{
子类的类体;
}
定义:
继承是类的层次模型,子类可以复用父类中的属性和方法,继承提倡代码的复用,子类可以扩展父类中的行为/方法/功能,将共同的属性和方法在父类中定义,这样类的关系就是继承。
package com.wlx.day505;
/**
* 父类
*/
public class Animal
{
//定义Animal的属性
String aname;
int aage;
String asex;
//定义动物的行为
/**
* 动物吃的行为
* @param food
*/
public void eat(String food)
{
System.out.println("吃"+food);
}
/**
* 动物跳的行为
*/
public void jump(double height)
{
System.out.println("跳"+height+"厘米");
}
}
package com.wlx.day505;
/**
* Animal的子类
* 鱼类属于动物类
* 鱼类继承动物类
*/
// 子类 父类
public class Fish extends Animal
{
/**
* 鱼游的行为
*/
public void swim()
{
//复用父类中的eat()方法
eat("水草");
//复用父类中的aname属性
System.out.println(aname+"鱼在水中游的行为");
}
}
package com.wlx.day505;
/**
* Animal的子类
* 猫属于动物类
* 猫继承动物类
*/
// 子类 父类
public class Cat extends Animal
{
/**
* 猫爬树的行为
*/
public void pa()
{
//复用父类中的aname属性
System.out.println(aname+"猫爬树的行为");
}
}
1、super关键字
super表示当前类的父类的实例对象的引用。
继承的时候,默认情况下子类的无参数的构造方法调用父类无参数的构造方法。
用法:
1、在子类的构造方法中使用super()调用父类的构造方法,默认情况下调用父类的无参数的构造方法,必须在构造方法体除注释以外的第一行,当this()和super都要写时,只要写this即可,super编译器和JVM会自动处理。
2、当子类中重写/覆盖了父类中的方法,那么此时子类可以通过super.父类实例方法名()调用父类被覆盖的方法。
3、当子类中的全局变量和父类中的全局变量同名时,子类通过super.父类实例属性名调用父类同名的属性。
package com.wlx.day505;
/**
* Animal的子类
* 猫属于动物类
* 猫继承动物类
*/
// 子类 父类
public class Cat extends Animal
{
String aname = "加菲猫";
/**
* 无参数的构造方法
*/
public Cat()
{
//调用父类有一个整数参数的构造方法
// super(12);
}
/**
* 单独写猫跑的行为
*/
public void run()
{
System.out.println("猫使用四条腿跑");
}
/**
* 猫爬树的行为
*/
public void pa()
{
//复用父类中的aname属性
System.out.println(super.aname+"猫爬树的行为");
//使用当前子类中的aname属性
System.out.println(aname+"爬树的行为");
// Animal animal = new Animal();
//通过super.父类实例方法名()调用父类被覆盖的方法
super.run();
}
public static void main(String[] args)
{
new Cat().pa();
}
}
1.2、方法重写/覆盖
定义:
如果子类中的实例方法名和父类中的实例方法同名,参数列表和返回值类型也一样,此时构成方法的重写/覆盖。
重写约束条件:
1、子类中的实例方法名、参数列表、返回值类型必须和父类中的一致。
2、当在能够访问到的情况下,子类可以扩大重写父类中的方法的访问权限,但是不能缩小。
3、父类中的静态方法不能被子类重写为非静态方法。
4、父类中的非静态方法不能被子类重写为静态方法。
5、重写只能发生在继承类中的实例方法/非静态方法中。