所有的面向对象语言三大特性之一:封装,继承,多态。其中封装性在上一篇关于类的引入种阐述得很清楚了,这里关键要理解继承,继承是如何引入的呢?如果想在一门语言中表示继承,我们该怎么表示继承呢?
0x00、深入理解子类与父类的关系
首先,我们要知道继承这个概念在面向对象语言中本身就是和类同等重要的地位,继承也是面向对象语言中最为重要的特征之一。基于类的概念,类是将需要写的代码抽象化成一个个具有相同属性或行为的东西,如果我们想要去初始化一个子类,那么一定代表是具有父类的特征的。这样我们还得到了其他好处:
- 可以直接获取父类的字段和行为
- 可以修改父类的行为
- 可以重载父类的行为(即指多态的概念)
- 可以添加新的字段和行为
这样进一步把面向对象语言具有更多的功能,更加的抽象。所以从高效使用语言和方便快捷使用语言的好处来看,既可以提高我们所写的程序的抽象程度,而且还是实现了父类代码的复用,还兼具了修改功能,以此提高了开发效率和可维护性。
我们继续考虑子类是由父类功能和属性的拓展,延伸而来的,所以想想哪个关键词可以表达派生,延伸的概念,于是引入了Extends来表示继承的概念,后面连接的类名是代表从哪里继承而来的。引入了Java中的继承是通过extends关键字来实现的。看一下代码:
class Student extends Person {expression;
}
注意,因为java程序所有都是拓展为类的概念,所以任何一个对象都属于一个类,如果没有extends子句,那么这个类默认为java.lang.Object的子类。并且java程序中所有的类都是直接或者间接地继承java.lang.Object得到的。可以看下面这张图,就可以很简单的理解子类,父类的关系,指学生作为一个类可以由人这个类继承来。
类包括子类,父类和超类,其中父类包括所有直接或间接被继承的类。
Java中为了简单考虑,规定了一条规则,就是一个类只能有一个直接父类,所以引入了新名词:单继承。
0x01、在继承的过程中需要注意字段部分
字段的变化情况是十分重要的:
1.父类字段的继承
因为子类就是由父类继承来的,所以,子类会自动继承父类的所有字段。即代表上述代码,Student子类自动具有父类Person的字段。
2.父类字段的重复
加入子类因为需要重新定义了与父类继承而来域变量完全相同的变量,就引入了域变量的隐藏,子类中起作用的是自己的变量,同时这也可能是我们不想用父类的这个变量,在初始赋值需要不同时就可以做到。
3.子类字段的添加
这是子类产生最开始的需求,子类区别于父类就是因为子类中多了一些自己的特征,自己的属性和方法,所以子类的添加如下,添加了学校,添加了成绩这些单独属性。
class Student extends Person{String school;
int score;
}
0x02、在继承的过程中需要的注意方法部分
继承的核心想法没有变,依然是继承父类该有的东西,如果想增加子类的方法,直接增加不同命的方法就行,以下注意:
1.方法的继承
因为访问修饰符的出现(后面文章会阐述),父类只要是除了Private私有的方法,都会被子类自动继承。
2.方法的覆盖
子类因为有自己的方法,所以想根据自己的属性来实现自己的方法,但是方法又跟父类同名,那么引入一种概念叫方法覆盖,也叫重写,通过可以实现对父类方法的覆盖(Override)。以下代码:@Override指方法的重写,是子类本身的独有属性。
@Overridevoid method(){
System.out.println("x" + y + "z")
}
所以,通过方法的覆盖,能够修改对象的同名方法的具体实现方法。
3.方法的重载
如果增加的方法同名,那么就实现了重载,既可以重载父类同名方法,也可以重载子类同名的方法,前者叫重载,后者叫多态,因为重载已经代表是重新实现同名的方法,所以,重载不需要参数列表类型相同,所以重载也就是新加的一个方法。以下代码:子类扩展了父类,覆盖了display()方法,并拥有自己的show()方法。在main()方法中,我们将为父类和子类创建对象,并调用它们各自的方法。
package com.javainterviewpoint;public class Child extends Parent
{
public void display(String name)
{
System.out.println("Welcome to Child Class \""+name+"\"");
}
public void show()
{
System.out.println("show() method of Child class");
}
public static void main(String args[])
{
//为父类创建对象
Parent p = new Parent();
//调用父类方法
p.display("JavaInterviewPoint");
p.disp();
//为子类创建对象
Child c = new Child();
c.display("JavaInterviewPoint");
c.show();
}
}
当我们运行代码时,我们将得到下面的结果:
0x03、方法重写规则总结
方法覆盖的规则:
- 方法应该具有相同的返回类型和参数
- 访问级别不能比方法的重写访问级别更严格
- 不能重写声明为final或static的方法
- 如果一个方法不能被继承,它就不能被重写
- 不能重写构造函数
0x04、文章总结
本教程比较完整的讲解了Java如何适当的使用面向对象概念,面向对象方法,总结了子类方法的重写规则,继承与父类的关系,适用于更加深入的理解。
资料链接:
1.https://www.javainterviewpoint.com/what-is-method-overriding-in-java/
2.https://www.w3schools.in/java/method-overriding
3.https://www.demo2s.com/i/java/java-method-overriding.html
4.https://pastebin.com/dWe4h4ZQ
5.https://www.coursehero.com/file/160235765/Childjava/