类的继承
继承和多态是面向对象语言的基本特性,以下是我关于继承和多态的理解和总结,可能有些表述不准确的地方,请大家指正:
1.继承指的是子类继承父类的属性和方法且一个类只能有一个父类,它可以减少重复代码的编写和对代码实现拓展。
2.理论上父类的所有属性和方法都能被子类继承,但父类的私有成员和构造函数是不能在子类中直接调用的,要访问父类的私有属性,必须要用get方法。
3.继承的两种情况
在同一包内继承:子类及子类创建的对象能访问父类的public,protect以及默认的属性和方法;
在不同包的继承:子类能访问父类的public,protect的属性和方法,而子类创建的对象只能问public的属性和方法。
private只能在自己类中访问,public能在所有类中访问,defaut默认的能在同一个包内访问,protect能在同一包内及子类中访问。而这些都能在自己类中访问。
作用域 当前类 同一package 子孙类 其它package
public true true true true
protected true true true false
defaut true true false false
private true false false false
注: 对于default类型修饰词,如果其子孙类与父类如果是位于同一个包内,则子孙类中的方法可以访问无修饰词修饰的父类方法;如果子孙类与父类是位于不同的包内,则子孙类中的方法无法访问父类中的无修饰词修饰的父类方法。
4.在子类中可以重写父类的方法(函数名,返回类型,参数都要一样),也可以在子类中对父类的方法进行重载,但子类重写后调不到父类的方法了,自能在类内部使用关键字super调用,而子类的对象调不到。
注意:
1.只有可被继承的方法才能被重写,否则写出来的方法是一个新方法。
2.重写的方法访问权限不能低于被重写的方法(public不能重写为protected),但抛出的异常范围不能高于被重写方法。
3.重写只能用在非静态方法之间(不能用非静态方法重写静态方法,也不能用静态方法重写非静态方法,这些编译都会报错),静态方法重写静态方法(编译不会报错但达不到重写的目的了,所以不叫重写)。因为:
static/final 方法的调用使用的静态绑定策略,在编译阶段,编译器就可以根据引用类型A来确定需要调用A中的getMember()。
而普通方法的调用采用的是动态绑定策略(在运行阶段需要考虑引用类型和实际类型(new)),这里就不多说了。
4.静态方法和数据域(有static关键字的),子类方法重写没有进行覆盖而是隐藏了,形成隐藏域子类可以用super关键字和类名进行调用。
5.自动转型(向上转型):这是实现多态的机制。父类的创建的对象但用了子类的构造函数例如Animal a = new cat(),或将子类创建的对象feed(cat)作为参数传给形参为父类类型的函数 feed(Animal a).是自动转型的两种形式。且子类一旦自动转型为父类,就只能调用父类中已定义的方法(但执行的是子类重写后的方法)而不能调用子类中自己独有的方法。
强制转换(向下转型):这是使用(子类)进行强制转换,但必须要是子类,可用instanceof先做判断,从而提高代码健壮性。
6.重写函数的调用:一个对象是调用父类的函数还是子类重写的方法看他实例化对象时是用的谁的构造函数,那么就调用谁的方法。
7.构造方法链:在实例化子类是默认先调用父类的无参构造方法(用super关键字可调用有参构造方法)。一个类若没有声明构造方法,默认有一个无参构造方法,若声明了有参的构造方法,则无参构造方法被覆盖,所以类要拓展时最好声明一个无参构造方法,避免编译出错。
8.super关键子:可用来调用父类的方法,但是不可super.super.A(),这样连续调用。
9.多态:
使用多态的原因
使用多态的程序的可维护性和可扩展性增强
多态分类
静态多态:
静态多态也称编译时多态,即在编译时决定调用哪种方法;
静态多态一般指方法重载;
只要构成了方法重载,就可以认为形成了静态多态的条件;
静态多态与是否发生继承没有必然联系
动态多态:
动态多态也称运行时多态,即在运行时才能决定调用哪个方法;
必须要有继承关系存在(父类可以是抽象类,普通类,甚至子类可以实现接口);
在继承中必须要有方法的覆盖;
必须由父类的应用指向子类的实例,并且通过父类的引用调用被覆盖的方法(实现的是子类重写后的方法)
相关推荐
类继承与多态PPT学习教案.pptx
西南科技大学Java程序设计与实践 实验三 类的继承与多态的应用 一、实验目的: 1、练习类的继承与多态设计过程; 2、练习面向对象的图形用户界面设计、事件设计方法。 二、实验内容: 1、利用多态性编程,创建一个 ...
1、实验名称:类的继承、多态的应用 2、代码内容:学生管理类 3、【实验目的】 (1)进一步熟悉抽象类和抽象方法的定义 (2) 进一步掌握集成和多态的实现方式。
C++实现的一个继承与多态的例子,内容详细且易懂
第8章动物类派生——继承与多态.ppt
C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf
继承与多态程序演示,Shape,CTriangle,CCircle
java 实验 继承与多态rectAngle 定义矩形类,用户输入矩形的长与宽,程序计算其面积和周长;派生子类正方形类,定义一个接口Printable源代码
Educoder题目:Java面向对象 - 封装、继承和多态答案解析
学习继承与多态可用。对于继承与多态有着较清晰的理解
java基础_继承封装 多态,概念的梳理,对初学者很有帮助,看一遍就清楚了
Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析
Java继承与多态专题讲解,详细生动,例子丰富,适合初学者
继承和多态.doc 多重继承 继承和多态
详细描述继承,多态的概念和应用,阐述重载和重写的区别
C++继承与多态C++继承与多态C++继承与多态C++继承与多态C++继承与多态C++继承与多态
java封装 继承与多态 程序设计 类与对象
实验四 类的继承与多态实验1.理解软件重用性的一种形式——继承。 2.能够通过继承已有的类创建新类。 3.理解基类和派生类的概念。 4.能够在派生类中使用构造函数和析构函数 5.学习虚基类在解决二义性问题中的...
Java(继承与多态)
第十二章Python继承和多态习题与答案--中文