关于面向对象的一些区别(重写与重载,抽象类与接口,成员变量和局部变量,的区别汇总)

重写和重载的区别

1.重写(Override)
在子类中把父类本身有的方法重新写一遍,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
1.1重写的注意事项
参数列表必须完全与被重写方法的相同。

返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

父类的成员方法只能被它的子类重写。

声明为 final 的方法不能被重写。

声明为 static 的方法不能被重写,但是能够被再次声明。

子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。

子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。

重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

构造方法不能被重写。

如果不能继承一个方法,则不能重写这个方法

2.重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。

2.1重载规则:

被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。

3区别点: 重载方法 重写方法
参数列表 必须修改 一定不能修改(重载方法名相同参数列表不同,重写参数列表方法名必须相同。)
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

1区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
2重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
3重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

抽象类和接口的区别

1抽象类(abstract class)
概念:在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。(使用abstract修饰符修饰的类。)
特点:抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;抽象类不能实例化;抽象类的子类,要么重写抽象类中的所有抽象方法要么是抽象类。

2接口(interface)
概念:接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。Java中的接口更多的体现在对行为的抽象。
接口的特点:接口用关键字interface修饰,类实现接口用implements表示;接口不能实例化;接口的子类要么重写接口中的所有抽象方法要么子类也是抽象类。

3类和接口的关系
类与类的关系: 继承关系,只能单继承,但是可以多层继承。
*类与接口的关系:*实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
*接口与接口的关系:*继承关系,可以单继承,也可以多继承。

抽象类和接口的区别
成员区别:
抽象类: 变量,常量;有构造方法;有抽象方法,也有非抽象方法。
接口: 常量;抽象方法。

关系区别:
类与类:继承,单继承
类与接口:实现,可以单实现,也可以多实现
接口与接口:继承,单继承,多继承

设计理念区别:
抽象类:对类抽象,包括属性、行为。

接口:对行为抽象,主要是行为。

成员变量与局部变量区别

类中位置不同
成员变量(类中方法外)局部变量(方法内部或方法声明上)

内存中位置不同:
成员变量(堆内存)局部变量(栈内存)

生命周期不同:
成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)

初始化值不同:
成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>