浅谈继承
今天网上遇到一个继承题 大概这样
//类A public class A { public void test(){ } } //类B继承类A public class B extends A{ private void test(){ } }
问这样有什么问题
答 报错 因为B类范围修饰符比A小
//类A public class A { public int test(){ } } //类B继承类A public class B extends A{ public long test(){ } }
问这样有什么问题
答 返回值不同 会报错
那么咱们回顾一个继承的知识
1 什么是继承
Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。通过extends关键字来实现。
这就和进化差不多 父亲会的 儿子也会 但是由于进化 儿子有些特殊的技能 父亲不会
2 继承在java中的作用
(1)使用继承可以有效实现代码复用,避免重复代码的出现。
(2)父类的功能不能满足需求 需要扩展 。
当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。
3、 如何实现继承?
在类名后用extends(扩展)关键字来表示一个类继承了另一个类。
在父类中只定义一些通用的属性和方法。
子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法。或子类重新定义父类的属性、重写父类的方法可以获得与父类不同的功能。
4、子类从父类中可以继承什么
子类可以获得除private权限以外的所有父类属性,但是:
1、在子类继承父类的时候,子类必须调用父类的构造函数。
2、如果父类有默认构造函数,子类实例化时自动调用,但如果父类没有默认构造函数,即无形参构造函数,子类构造函数必须通过super调用父类的构造函数。
3、还有在java的继承当中子类是不可以继承父类的构造函数只能调用,这是肯定的。
5、 什么是方法重写?
如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配且范围修饰符比父类相等或增大,那么可以说,子类的方法重写了父类的方法。
方法重写在不同类,是实现多态的必要条件。
6.子类重写的条件
1.父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖。
2.子类和父类的方法必须是实例方法,如果父类是static方法而子类是实例方法,或者相反都会报错。 如果父类和子类都是static方法,那么子类隐藏父类的方法,而不是重写父类方法。
3.子类和父类的方法必须要具有相同的函数名称、参数列表,并且子类的返回值与父类相同或者是父类返回类型的子类型(jdk1.5之后)。
如果方法名称相同而参数列表不同(返回类型可以相同也可以不同),那么只是方法的重载,而非重写。
如果方法名称和参数列表相同,返回值类型不同,子类返回值类型也不是父类返回值类型的子类,编译器就会报错。
4.子类方法的访问权限不能小于父类方法的访问权限(可以具有相同的访问权限或者子类的访问权限大于父类)。 访问权限由高到低:public、protected、包访问权限、private。如果子类方法的访问权限低于父类,则编译器会给出错误信息
5.子类方法不能比父类方法抛出更多的编译时异常(不是运行时异常),即子类方法抛出的编译时异常或者和父类相同或者是父类异常的子类。
7重写和重载的区别
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
8 什么是隐藏
隐藏发生在子类与父类之间,隐藏是针对父类中的成员变量和静态方法而言。当子类声明了与父类相同的变量名的变量时就实现了对父类成员变量的隐藏。当子类声明了与父类的静态成员方法中相同方法名,相同参数列表和相同返回类型的方法,则实现了对父类静态方法的隐藏。
原则:静态方法被隐藏,实例方法被覆盖(重写),父类中的成员变量能够被子类中的同名变量隐藏,但局部变量和形参不会被隐藏。

浙公网安备 33010602011771号