一、继承

继承的本质是代码的复用,即重复使用已经定义好的方法和域(全局变量)。

举例:

现在有两个类,分别名为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访问这些成员。私有成员的访问范围限定在定义它们的类内部。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐