背景
代码中创建的类, 主要是为了抽象现实中的一些事物.有的时候客观事物之间就存在一些关联关系, 那么在表示成类和对象的时候也会存在一定的关联.
例如, 设计一个类表示动物
代码语言:javascript复制class Animal{
public String name;
public void eat(){
System.out.println("Animal::eat()");
}
public void sleep(){
System.out.println("Animal::sleep()");
}
}
class Cat{
public String name;
public void eat(){
System.out.println("Cat::eat()");
}
}
class Bird{
public String name;
public void eat(){
System.out.println("Bird::eat()");
}
public void fly(){
System.out.println("Bird::fly()");
}
}
以上代码可以看出,代码思路虽然没有问题,但是有很多冗余的地方,为了简化代码,我们引出继承
语法规则
class 子类 extends 父类 { }
使用继承之后,代码变成
代码语言:javascript复制class Animal{
public String name;
public void eat(){
System.out.println(this.name "Animal::eat()");
}
public void sleep(){
System.out.println("Animal::sleep()");
}
}
class Cat extends Animal{
//把以下代码屏蔽,依然可以执行
// public String name;
// @Override
// public void eat(){
// System.out.println(this.name "Cat::eat()");
// }
}
public class TestDemo {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "mimi";
cat.eat();
}
}
以上代码的输出结果为:
mimiAnimal::eat()
继承遇到构造方法
由于在给子类构造的时候,要先帮助父类进行构造,利用以下关键字:
super() //必须放到第一行
> super代表父类对象的引用 super():调用父类的构造方法 super.data():访问父类的属性 super.func():访问父类的成员方法
代码修改为:
代码语言:javascript复制class Animal{
public String name;
//添加构造方法
public Animal(String name) {
this.name = name;
}
public void eat(){
System.out.println(this.name "Animal::eat()");
}
}
class Cat extends Animal{
public Cat(String name){
super(name);//显式调用//写道第一行
}
// public String name;
// @Override
// public void eat(){
// System.out.println(this.name "Cat::eat()");
// }
}
class Bird extends Animal{
public Bird(String name){
super(name);
}
// public String name;
//
// public void eat(){
// System.out.println("Bird::eat()");
// }
//
public void fly(){
System.out.println("Bird::fly()");
}
}
public class TestDemo {
public static void main(String[] args) {
Cat cat = new Cat("haha");
cat.eat();
Bird bird = new Bird("bage");
bird.eat();//访问Animal的
bird.fly();//访问自己的
}
}