继承的概念
在Java中,类的继承实质在一个现有的类的基础上去构建一个新的类,构建出来的新类被叫做子类,现有的这个类被叫做超类或者父类,子类会自动 拥有父类所有可以继承属性和方法。
在程序中,想要声明一个类继承自另外一个类,需要使用extends关键字
class Animals {
public String name;
public void shout() {
System.out.println("发出叫声");
}
}
class Cat extends Animals{
public void eat(String food) {
System.out.println(name + "正在吃" + food);
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "黑猫";
cat.eat("鱼");
cat.shout();
}
}
运行结果为:
Cat类通过extends关键字继承了Animals类,Cat类就成为了Animals类的子类,从运行结果可以看出,虽然子类没有声明name属性和shout()方法,但是Animals仍然能够访问到两个成员。
子类在继承父类的时候,会自动拥有父类所有公共的成员
(1)在Java中,类只支持单继承,,一个类只能继承一个父类。
(2)多个类可以同时继承一个父类。
(3)允许多层继承,一个类的父类可以再去继承其他的类。
重写父类方法
在继承关系中,子类会自动继承父类中公共的方法,但有时子类需要对继承的方法进行修改,这就是对于父类方法的重写。
重写: 子类中重写的方法需要和父类中被重写的方法具有相同的方法名、参数列表、返回值类型
class Animals {
public void shout() {
System.out.println("发出叫声");
}
}
class Cat extends Animals{
public void shout() {
System.out.println("喵喵~~");
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.shout();
}
}
输出结果:
从运行结果可以看出来调用Cat类对象中的shout()方法时候,只会调用子类重写的方法,并不会调用父类的shout()方法。
注意:子类重写父类方法是,不能使用比父类中被重写的方法更严格的访问权限。
super关键字
当子类继承父类之后,子类会存储父类的数据成员,而当子类和父类有相同名称数据成员的时候,应该使用super来调用父类的数据成员。
(1)可以使用super关键字来调用父类的成员变量和成员方法
class Animals {
public String name = "动物";
public void shout() {
System.out.println("发出叫声");
}
}
class Cat extends Animals{
public String name = "猫猫";
public void printName() {
System.out.println(super.name);
System.out.println(name);
}
public void shout() {
super.shout();
System.out.println("喵喵~~");
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.printName();
cat.shout();
}
}
(2)使用super关键字来调用父类的构造方法
class Animals {
public String name;
public String type;
public Animals(String name, String type) {
this.name = name;
this.type = type;
}
}
class Cat extends Animals{
public int age;
public Cat(String name, String type, int age) {
super(name, type);
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("闹闹","中华田园猫",1);
}
}
特别注意:使用super关键字调用父类的构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,否则编译会报错