Java基础:继承
继承的本质是代码的复用,即重复使用已经定义好的方法和域(全局变量)。现在有两个类,分别名为AAA和BBB,其中AAA类代码如下:假如此时BBB类想使用AAA类中的testA()方法,那么有两种方式可以实现:1、创建AAA的对象如果此时testA()方法拒绝访问呢?我们增加一个测试类Test,并在main()方法中想要调用AAA类中的testA()方法,如果通过创建AAA的对象的方式,当testA(
一、继承
继承的本质是代码的复用,即重复使用已经定义好的方法和域(全局变量)。
举例:
现在有两个类,分别名为AAA和BBB,其中AAA类代码如下:
public class AAA {
public void testA() {
System.out.println("该方法当中有很多逻辑运算----》AAA");
}
}
假如此时BBB类想使用AAA类中的testA()方法,那么有两种方式可以实现:
1、创建AAA的对象
public class BBB{
AAA aaa = new AAA();
public void testb() {
aaa.testA();
}
}
如果此时testA()方法拒绝访问呢?
我们增加一个测试类Test,并在main()方法中想要调用AAA类中的testA()方法,如果通过创建AAA的对象的方式,当testA()方法拒绝访问时,此时是不能实现的,但如果通过继承的方式,让BBB类继承AAA类,即使testA()方法拒绝访问,也是可以实现AAA类中的testA()方法的调用的。
2、继承
通过继承,测试类Test不仅能调用AAA类中的方法和域,也能调用BBB类中的方法和域,并且BBB类不用创建任何对象就可以调用AAA类中的方法和域。
Java的继承层次:Java只能单继承,即子类只能继承一个父类,但父类可以有多个子类。
二、方法的重载和重写
(一)方法的重载
方法名相同,但参数类型不同。方法的重载发生在同一个类中。
我们可以在子类BBB中书写几个方法名相同的方法,结果表示:如果定义了一个参数类型相同,变量名不同的变量,程序会报错,这是因为出现了变量的重复定义,在这里可以类比数学公式进行理解。

(二)方法的重写
我们在前面了解到继承的本质是重复使用已经定义好的方法和域。但是当父类当中方法的内容不适合子类使用时,可以在子类中进行方法的重写。

子类重写父类的方法,方法名和参数列表必须相同。方法的重写发生在父子类中。
1、类的加载顺序
我们都知道程序的执行顺序是先扫描加载,再执行。

而类的加载顺序是先父类后子类。(创建对象也是先父类后子类。)
原因:如果是先子类后父类,当子类中调用父类中的方法时,扫描加载到该位置而父类的方法还没进行扫描加载,从而无法调用。因此正确的类的加载顺序是先父类后子类,防止出现上述情况。
2、从内存的角度解释什么是方法的重写
(1)在没有方法重写之前,其代码及运算结果如下:

用内存图来解释运行结果:

首先,main()主方法入栈,在堆内存中生成类BBB的对象bbb之前先生成父类对象aaa,那么bbb可以调用的方法除了BBB类中的之外还有AAA中的testA(),因此根据main()方法,最后输出的结果如图。
(2)在方法重写之后,其代码及运算结果如下:
用内存图来解释运行结果:

首先,main()主方法入栈,在堆内存中生成类BBB的对象bbb之前先生成父类对象aaa,又因为子类重写了父类的方法,父类的testA()方法失效,所以BBB类中的test()覆盖掉AAA类中的test(),因此根据main()方法,最后输出的结果如图。
(3)当我们在测试类Test中再创建一个类AAA的对象aaa时,其代码及运行结果如下:
新创建的对象aaa只会调用类AAA中的方法,因此输出结果如上。
用内存图来解释运行结果:

三、super()关键字
super()关键字可以调用父类的方法,调用父类的构造器,但只能在子类构造器中使用。
注意:
- 在Java中,super()方法调用父类构造器时,需要传递与父类构造器相匹配的参数。
- 在构造方法中,this()和super()不能同时出现,因为它们都需要位于方法的第一行位置。
- 如果父类中的成员是私有的(private),则无法通过super访问这些成员。私有成员的访问范围限定在定义它们的类内部。
更多推荐



所有评论(0)