1.概念
多各类中含有相同的概念,把相同的内容放到一个新的类中,为了保证原来的类还能拿到相同的内容,让原来的类通过extends关键字产生关联关系——继承,原来的类称之为子类或者派生类、新类的父类或者超类,子类可以继承父类部分信息。
1.2继承举例
下面我们拿两端代码来具体说明
class Docter{
String name;
int age;
char gender;
public void treat(){
System.out.println(this.name+"在治病救人");
}
}
这是一个医生类的例子。
class Nurse{
String name;
int age;
char gender;
public void treat(){
System.out.println(this.name+"在治病救人");
}
}
这是一个护士类的例子,但是这两端代码发生重复,降低了开发效率,为了避免发生这样的情况,我们就用到了继承来解决这个问题。首先我们把内容相同的部分放进一个类,起名为医疗人员类。
class MedicalStaff{
String name;
int age;
char gender;
public void treat(){
System.out.println(this.name+"在治病救人");
}
}
然后我们建立医生类和护士类来继承这个医疗人员类,使用到关键字extends。
//继承了父类的属性
class Docter extends MedicalStaff{
//重写
public void treat(){
System.out.println(name+"拿着手术刀治病救人");
}
}
class Nurse extends MedicalStaff{
public void treat(){
System.out.println(name+"拿着针管子治病救人");
}
}
2.使用方法
2.1继承方式
一个父类可以有多个子类,但一个子类只能有一个父类。
2.2关键字——extends
如果子类想要继承父类的信息需要在子类后面加上extends关键字和父类名,如:
class Zi extends Fu{
}
2.3方法重写
在父子类出现了方法签名一致的方法时java规定如果父子类想要进行方法重写需要遵循一下原则。
1)方法签名一致
2)如果父类的方法返回值类型是基本数据类型或者void,那么子类的方法返回值要与父类一致
3)如果父类的方法返回值类型是引用数据类型,那么子类的方法返回值类型要么是父类的方法返回值类型要么是子类的方法返回值类型
class A{}
class B extends A{}
class C{
public A m(){
return null;
}
}
class D extends C{
public A/B m(){
return null;
}
}
4)子类的方法访问权限修饰父要么和父类相等要么比父类的范围大。
//父类
class A {
void m(){
}
}
class B extends A{
默认/或者public void m(){
}
}
2.4super关键字
super关键字代表父类对象(在子类可以调用父类属性跟方法)、super语句可以在子类的构造方法调用父类的构造方法。
1)所有子类的构造方法都会默认加一个午餐的super构造语句调用父类的无参构造
2)通过super语句在子类的构造方法中可以调用任意形式的构造方法
3)如果父类没有提供无参构造,子类需要通过super语句去调用其他形式的构造方法
4)super一定要写在首行
//构造动物类
class Animal{
String name;
//父类无参狗仔
public Animal(){
System.out.println("父类的无参构造");
}
//父类有参构造
public Animal(String name){
System.out.println("父类的无参构造");
}
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("睡");
}
}
//构造猪类
class Pig extends Animal{
public Pig(){
//如果子类没有手动调用父类的构造方法JVM则是默认加上一个父类的构造方法
super();
System.out.println("子类的构造方法");
}
public Pig(String name){
super("佩奇");
System.out.println("子类的构造方法");
}
//重写父类吃的方法
public void eat(){
System.out.println("快乐地吃");
}
//调用父类睡的方法
super.sleep();
}
5)父类的优先级高于子类