java的继承中什么叫方法覆盖,是如何实现的?
方法覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖
Java继承和实现的区别是什么?
表面的区别就是单继承多实现继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类。
实现:如果多个类处理的目标是一样的,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让他们的实现这个接口,各自实现自己具体的处理方法来处理那个目标实际运用中会更复杂,这个得靠自己摸索,不能靠别人的只言片语,书上的几句定义就可以理解这个的,还有就是这些是不能滥用的,别什么都搞个继承,乱实现接口,只会使程序复杂化而已
为什么在应用程序的开发过程中使用接口而不是继承?
需要从两个方面进行考虑,一是接口确实是最好的实现方式,二是很多框架避免使用继承来实现扩展。
继承不是灵丹妙药
继承如果适用于某个场景,那么就应该使用继承。
但是能够适用继承的场景真的太少,除了各种各样很明确的分类,其他的说真的,需要好好考虑继承是否是最合适的实现方式。
与其在后期不停地扩展父类的方法和属性,还不如分成多个类体系。
组合优于继承
如果可以使用组合,一定要使用组合。
把类的体系结构划分得更细点,然后通过组合把各种类的体系组合起来使用,这样我们在扩展类的时候会更加轻松容易。
继承破坏了封装性
子类继承父类,子类就拥有了父类公共或受保护的方法和属性,这没有什么问题,这是继承的优势。
但问题就在于子类可以重写父类的方法和属性,这里就有可能会导致问题了。
父类在定义方法和属性的时候,也同样定义了契约,这需要大家共同遵守。
但是程序员在继承父类的时候,会特别严格遵守这个契约吗?我目前见过大部分的程序员都会有意无意破坏这个契约,这样就违背了里氏替换原则。
继承把父类的大门向所有的子类敞开了,我见过有人在父类中公开方法调用公开方法,后来的扩展中子类重写了被调用的公开方法,结果很多的类都出现了bug,这是灾难性的,花了很多时间排查,最后才发现问题所在。
父类的定义是否合理?
甚至定义的父类契约是否合理都是一个问题,假如不合理,就需要变更,这会影响到所有的子类,需要对每个子类都进行严格的测试。
接口
接口不一定是最优的,但肯定是最难出现问题的。
接口也是有契约的,违法这种契约的行为不再少数,这也是一个问题。
但是接口比继承好的地方在于接口把各个实现分隔开了,即使有问题,影响也不大,至少不会因为子类无意的重写和父类的改造而导致大规模的问题,这对很多的框架来说非常重要,它不能暴露出框架的内部实现。
多层继承对于解偶有很大的伤害,如果功能块比较分散一旦后期需要把现成代码移植到其他项目的时候需要先考虑代码牵扯性,使单一移植某一块功能变的很复杂,也就是常说的拔萝卜带出泥。而使用接口的方式更利于代码的移植和扩展性开发
谢邀。
什么是继承和接口?继承是从父类派生出子类,子类可以获得父类的属性和方法,并可以扩展新的属性和方法。接口是只有方法的特征而没有实现,当接口被不同的类实现时,就会具有不同的行为。
具体先看代码。
public class person{
private int age; //年龄
private String name; //性别
//类面的方法需要实现
public void eat(){
System.out.println("人吃吃吃");
}
public void sleep()
{
System.out.println("人睡睡睡");
}
}
public class student extends person
{
//重写父类方法
public void eat()
{
System.out.println("学生吃吃吃");
}
public void sleep()
{
System.out.println("学生睡睡睡");
}
public void study()
{
System.out.println("学生需要学习");
}
}
public class employee extends person{
//重写父类方法
public void eat()
{
System.out.println("员工吃吃吃");
}
public void sleep()
{
System.out.println("员工睡睡睡");
}
public void getSalary()
{
System.out.println("员工获得薪水");
}
}
public interface person{
void eat();
void sleep();
}
public class student implements person{
//在子类中实现父类方法
public void eat()
{
System.out.println("学生吃吃吃");
}
public void sleep()
{
System.out.println("学生睡睡睡");
}
public void study()
{
System.out.println("学生需要学习");
}
}
public class employee implements person{
//在子类中实现父类方法
public void eat()
{
System.out.println("老师吃吃吃");
}
public void sleep()
{
System.out.println("老师睡睡睡");
}
public void getSalary()
{
System.out.println("员工获得薪水");
}
}
//如果现在是一个在职学生,既需要学习这个方法也需要获得薪水这个方法。Java里面不支持多继承,只支持多重继承。那如果是继承的话应该怎么做呢?
public class s_employee extends student{
//先获得student类中的学习的方法
//然后再在这个类里新建employee的方法。但是这样的话之前employee类就没有用了,导致代码的重复,也失去了继承的意义。
}
//如果是接口呢?
public class student_employee implments student,employee{ //接口一行就搞定
//直接多个组合同时获得学生和员工的方法
}
对于C++,是可以多继承的,但是多继承也会造成代码重复,所以,一般在开发过程中更倾向于使用接口,因为接口中的方法不用实现,只有当子类实现父类接口时才会实现父类中的方法。
java中的接口和继承在面向对象编程中是一个基本的知识点,对于后面的封装多态都具有重要意义,所以,作为一个重要知识点,是需要好好掌握的。
如有其他更好的解释,欢迎私聊。
插图来源于网络,如有侵权,请联系删除,谢谢。