嗨客网搜索
Java开发环境搭建
Java方法
Java继承深究

Java继承深究教程

我们了解到了 Java 语言继承的基本语法。在继承的操作中,对于子类而言,实例化也是有要求的,类的实例化,我们知道需要调用类的 构造方法

子类在实例化的时候,需要先调用父类的构造方法,在调用子类的构造方法。我们可以理解为现有父亲,再有儿子。

02 继承类实例顺序.png

案例

我们定义一个父类 Fathcer.Java

package com.haicoder.net.extend; public class FatherClass { //名字 private String name; //年龄 private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public void info(){ System.out.println("name : " + this.name + " age : " + this.age); } public FatherClass(){ System.out.println("调用类父类的构造方法"); } }

定义一个子类 ChildClass.Java

package com.haicoder.net.extend; public class ChildClass extends FatherClass { private String ownerProperty; public String getOwnerProperty() { return ownerProperty; } public void setOwnerProperty(String ownerProperty) { this.ownerProperty = ownerProperty; } public ChildClass() { System.out.println("调用了子类的构造方法"); } }

定义一个测试类 TestMain.Java

package com.haicoder.net.extend; public class TestMain { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); ChildClass childClass = new ChildClass(); } }

运行结果如下:

03 构造方法调用顺序运行结果.png

我们在父类的无参构造方法和子类的无参构造方法中,都将自己调用的时候信息打印出来,我们在测试类里面仅仅定义了一个子类对象,发现父类的构造方法和子类的构造方法里面的输出语句都打印了。

Java方法覆盖

如果遇到了父类中的方法不满足子类的执行流程,这个时候怎么办呢?子类可以重新定义这样的方法。方法名,参数和返回值与父类中的一模一样,但是在重新定义的时候,方法的权限 必须要比父类范围大。

案例

我们还是用上面案例中用到的父类 Fathcer.Java

package com.haicoder.net.extend; public class FatherClass { //名字 private String name; //年龄 private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public void info(){ System.out.println("name : " + this.name + " age : " + this.age); } public FatherClass(){ System.out.println("调用类父类的构造方法"); } }

我们定义一个子类,并且重新写了 info 方法。

package com.haicoder.net.extend; public class ChildClass extends FatherClass { private String ownerProperty; public String getOwnerProperty() { return ownerProperty; } public void setOwnerProperty(String ownerProperty) { this.ownerProperty = ownerProperty; } public ChildClass() { System.out.println("调用了子类的构造方法"); } public void info(){ System.out.println("无论怎么样,我都只打印 嗨客网(www.haicoder.net)"); } }

定义一个测试类 TestMain.Java

package com.haicoder.net.extend; public class TestMain { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); ChildClass childClass = new ChildClass(); childClass.setName("嗨客网"); childClass.setAge(21); childClass.info(); } }

运行结果如下:

04 方法重写运行结果.png

我们看到运行结果,无论给 name 还有 age 赋了什么值,子类的对象都会调用子类里面的定义的 info 方法,打印出固定的语句。

方法覆盖总结

子类的覆盖不仅可以覆盖方法,也可以覆盖属性。在定义对象的时候,如果定义的是子类的对象,那么调用属性或者方法的时候会先在子类中查找,如果找到了就使用,如果找不到就会到父类中寻找。简言之就是遵循类 “就近访问原则”。

Java方法覆盖与重载区别

我们在 Java 方法 里面讲过方法的重载,现在我们了解到重载和覆盖都是对方法进行重新编写。那么它们的区别是什么呢?

区别点 重载 覆盖
单词 Overloading Overriding
定义 方法的名称相同,但是参数类型或者数量不同 方法的名称,参数的类型,返回类型都需要相同
对权限没有要求 子类的权限必须要比父类的权限范围大
范围 发生在一个类里面 发生在父类和子类里面

Java继承深究总结

子类在创建一个对象的时候,会先调用父类的构造方法,方法的覆盖指的是子类里面的方法重新编写自己逻辑,参数返回值要和父类一样,只是它的权限范围要比父类要广。

嗨客网顶部