- 继承是面向对象三大特性之一,所谓继承,可以简单理解为子类继承父类,子类拥有父类的属性和方法,子类可以对父类的属性和方法进行修改,子类也可以增加方法和属性;
- 通过继承,我们可以简化类的设计,从而直接拥有某个类的方法和属性
- 通过继承,我们可以将一些类中具有相同属性和行为特征(方法)抽取出来,抽象成一个父类,让这个父类拥有这些属性和方法,从而在定义其他子类时,通过继承父类的方法来简化设计,达到继承这个特性;
- 比如,现实生活中的很多例子,我们在动物园中肯定会见到各种各样的动物,这些动物都有一些特征(可以理解为java中的属性)和行为(可以理解为java中的方法),比如,动物都有年龄,名字等属性,有吃、喝、睡觉等行为特征,我们把这些属性和方法定义为一个animals类,然后让各种动物(猫,狗)继承animals这个类,从而简化了类的设计,在写代码的同时可以简化;
//动物类
public class Animals {
String name;
int age;
String sex;
public Animals() {
}
//父类中的方法
public void eat(){
System.out.println(this.name+"正在吃饭");
}
public void drink(){
System.out.println(this.name+"正在喝水");
}
public void sleep(){
System.out.println(this.name+"正在睡觉");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Animals(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public Animals(String name) {
this.name = name;
}
}
public class Cat extends Animals {
public Cat(String name, int age, String sex) {
super(name, age, sex);
}
public Cat(String name) {
super(name);
}
//重写方法
@Override
public void eat() {
super.eat();
}
@Override
public void drink() {
super.drink();
}
@Override
public void sleep() {
super.sleep();
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("波斯猫");
cat.eat();
System.out.println("吃饱了,喝点水");
cat.drink();
System.out.println("吃饱喝足之后,躺会");
cat.sleep();
}
}
运行结果为:
-
以上实例我个人觉得可以很好的理解继承这个特性吧
-
关于java中继承的特点
- java中是单继承,所谓单继承,就是子类只能继承一个父类,不能继承多个父类
- java中支持多层继承关系,一个类可以是多个类的父亲,也可以是一个类的子类
-
使用继承时,子类应该是更加详细具体的父类,我们可以使用is关键字来判断是否可以使用继承
-
重写方法
在继承关系下,子类覆盖父类的方法;- 方法名相同,
- 参数相同
- 返回值类型兼容,父类的类型一定要能包容子类的类型
-
关于继承
- 父类有的,子类一定有;
- 父类没有的,子类可以增加;
- 父类有的,子类可以修改重写
-
super关键字
super关键字代表父类的对象引用,在子类中,通过super可以访问父类对象的属性和方法;
在上面创建Cat这个类的时候,我使用了一个只有name参数的构造方法,而父类animals中我没有写只有name的构造方法,所以报错了,我才发现继承中构造方法有几个需要特别注意的地方 -
关于继承中构造方法的说明
- 在继承关系中,构造方法是不能被继承的;
- 在子类调用构造方法时,首先会调用父类的构造方法;
- 如果在子类中调用构造方法时没有指定父类的构造方法,会默认使用父类的无参构造方法
- 可以使用supper(参数)来指定调用父类的构造方法,super()语句必须放在第一行来执行
-
方法重载与方法重写的区别
- 方法重载是在一个类中,方法名相同,方法参数不同的一些方法;
- 方法重写是在继承关系下,,子类覆盖父类的方法,要求名字相同,参数相同,返回值类型小于父类的返回值类型,可以兼容返回值类型;