一、多态的基本概念
(一) 基本概念
1.百度百科给出的定义是:在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。
2.在学习之后我的理解是:多态意味着父类的变量可以指向子类对象。多态是同一个行为具有多个不同表现形式或形态的能力,就是同一个接口,使用不同的实例而执行不同操作。多态是基类型对象访问派生类重写的方法。
二、继承
(一) 说明
由于多态的很多内容都跟继承有相关,所以就先来介绍继承,然后再介绍多态。
(二) 基本概念
1.百度百科给出的定义是:继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
2.经过预习后我的理解是: 继承是从已有的类中派生出新的类,新的类能具有已有类的数据和属性,并能扩展出新的能力。Java通常使用extends关键字来实现继承,比如说,class Parent{},class Children extends Parent{}。
(三) 基类和派生类关系
经过预习后我对基类和派生类关系的理解是:
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
基类就是父类,派生类就是子类,比如说class A extends B{},其中的A就称为父类或者基类,B称为子类或者派生类。
(四)继承的特性
- 子类拥有父类非private的属性和方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java的继承不支持多继承,但是可以支持多重继承,通过单继承来实现类的继承,单继承是一个子类只能继承一个父类,多重继承是,比如说A继承B,B继承C。
- 继承的缺点是提高了类之间的耦合性,耦合度高就会造成代码之间的联系约紧密,代码独立性越差。
(五)构造器
子类不继承父类的构造器,即不继承父类的构造方法或构造函数,它只是调用(隐式或显式)。
如果父类的构造器带有参数,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用super关键字调用父类构造器,系统会自动调用父类的无参数构造器。
(六)注意事项
- 子类拥有父类的特征,而父类没有,父类更通用,子类更具体(特征包括属性和方法,自身的特性,拥有父类没有的)
- 使用extends继承父类,语句格式:class 子类名 extends 父类名{}
- 父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)
- 子类中通过super关键字来调用父构造方法
- 在子类中可以继承父类的哪些东西,哪些不可以继承 父类中public、protected修饰的属性和方法可以继承,private修饰的属性和方法不能被继承
- 规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象
- 可以在子类中显示调用父类的有参构造方法
- 如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用
- 有些编程语言支持多重继承,即一个子类别可以同时有多个父类别,比如C++编程语言;而在有些编程语言中,一个子类别只能继承自一个父类别,比如Java编程语言,这时可以利用接口来实现与多重继承相似的效果。 现今面向对象程式设计技巧中,继承并非以继承类别的“行为”为主,而是继承类别的“型态”,使得元件的型态一致。另外在设计模式中提到一个守则,“多用合成,少用继承”,此守则也是用来处理继承无法在执行期动态扩充行为的遗憾。
(七)代码实例
- 继承的简单实现
/**
* @author WXF
* @data 2021-04-07
* @description 继承的简单实现
*/
public class Debug {
/** Main method */
public static void main(String[] args) {
Children children = new Children(); //
String string = children.testChildren();
System.out.println(string);
}
}
// 父类
class Parent {
// 父类方法
public String testParent() {
return "Parent";
}
}
// 子类继承父类
class Children extends Parent {
// 子类方法
public String testChildren() {
return "Children visit " + testParent();
}
}
- 继承的简单实现的输出
Children visit Parent
解释说明:通过上面的代码,可以简单的实现继承,子类就拥有了父类的所有属性和方法,除了使用private声明的属性和方法。
- 继承中构造器的显式和隐式
/**
* @author WXF
* @data 2021-04-07
* @description 继承中构造器的显式和隐式
*/
public class Debug {
/** Main method */
public static void main(String[] args) {
Children children = new Children();
}
}
// 父类
class Parent {
// 无参数构造器
public Parent()