Java面向对象之继承

“种瓜得过,种豆得豆”、“有其父必有其子”,这些都是现实世界中的遗传现象,而“一母生九子,连母十个样”、“青出于蓝而胜于蓝”则体现了现实世界的变异现象。在Java语言中,继承充分体现了遗传和变异的特点。

  • 继承的定义:多个类(子类)中存在相同属性和行为时,将这些内容向上抽取到一个单独的类(父类)中,而这几个类只需要继承这个类,无需再定义这些属性和行为。在子类和父类之间存在着明显的“is-a”关系。
  • 继承的语法规则
    修饰符 子类名 extends 父类名 {}
  • 继承的特点
    Java只支持单继承,不支持多继承,但支持多层继承。
  • 继承的优势

a.提高了代码的复用性

b.提高了代码的维护性

c.类与类之间产生了关系,是多态的前提

  • 继承的弊端
    由于类与类之间产生了关系,这也导致了类的耦合度增加了,而我们在开发是的原则是:高内聚,低耦合。
  • 继承注意事项

a.不要为了部分功能而刻意的去继承。

b.子类只能继承父类所有非私有的成员(成员变量和成员方法)

c.子类不能继承父类的构造方法,但是可以通过super关键字去调用父类的构造方法。1

public class Fu {
    private String name;
    private int age;
    public Fu(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Zi extends Fu {
        public Zi(String name,int age){
            super(null,0);
        }
}
  • 继承中构造方法的注意事项

1.子类中所有的构造方法默认都会访问父类中的空参构造方法,因为在子类初始化之前一定要先完成父类数据的初始化。

2.而如果父类中没有无参构造方法时:

a.在父类添加一个无参的构造;

b.子类通过super关键字去显式的调用父类的其他的带参的构造方法;

c.子类通过this去调用本类中其他的构造方法,前提是本类的其他构造必须首先访问了父类构造。

public class Zi extends Fu {
    public Zi() {
        this(null,0);
    }

    public Zi(String name, int age){
            super(null,0);
        }
}

3.super(…)和this(…)必须位于子类构造方法语句的第一条。

  • 方法重写
    子类需要父类的功能,同时有自己特有的功能时,就需要方法重载(子类中出现和父类中一模一样的方法声明)
  • 方法重写注意事项

a.父类私有的方法不能被重写(继承都不可以);

b.子类重写父类方法时,访问权限不能更低,最好一致;

public class Fu { 
    public void eat(){
        System.out.println("吃饭");
    }
}
public class Zi extends Fu {
    //void eat(){       访问权限:public>protected>缺省的>private
    public void eat(){
        System.out.println("吃晚饭");
    }
}

c.父类静态方法,子类也必须通过静态方法进行重写。

public class Fu {
    public static void eat(){
        System.out.println("吃饭");
    }
}
public class Zi extends Fu {
    public static void eat(){
        System.out.println("吃晚饭");
    }
}

  1. 由于子类的构造器不能直接访问父类的私有域,所以必须利用父类的构造器对这部分私有域进行初始化,我们可以通过super关键字实现对父类构造器的调用。 ↩︎

你可能感兴趣的:(Java面向对象之继承)