java在第三方类中子类调用父类方法

这篇博客探讨了如何在Java编程中,当子类位于第三方类库中时,如何正确地调用父类的方法。内容可能涉及到类的继承、多态性和Java反射机制的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.company;

/**
 * Created by liuyazhou on 2016/9/21.
 */
public class Test {

    public Integer fun(Integer a ,Integer b){ ////如果此方法是private 的,则Main.java中 System.out.println( testSon.fun(1,2));报错
        return a+b;
    }
}

package com.company;

/**
 * Created by liuyazhou on 2016/9/21.
 */
public class TestSon extends  Test {

}

package com.company;

public class Main {

    public static void main(String[] args) {
	// write your code here
        System.out.println("123");
        TestSon testSon = new TestSon();
        System.out.println( testSon.fun(1,2));////子类可以调用父类中的public方法
    }
}

输出结果:


                
<think>好的,用户想了解Java中子如何调用父类方法。首先,我需要回忆Java中继承的基本概念。子类继承父类后,可以访问父类的非私有方法,但如果是私有方法子类就无法直接调用,这点需要明确。 接下来,用户可能需要具体的调用方式。通常有两种情况:当子类没有重写父类方法时,直接使用方法名即可;如果子类重写了父类方法,但还想调用父类的版本,就需要用super关键字。这里要举例说明,比如用super.methodName()。 然后,要考虑构造函数的调用情况,因为子类构造函数中必须调用父类的构造函数,可以通过super()实现,而且必须放在子类构造函数的第一行。这也是一个容易出错的地方,需要强调。 另外,用户可能对super关键字的其他用法有疑问,比如是否可以调用父类的非构造方法。这时候需要说明super不仅可以调用构造函数,还可以调用父类的普通方法,尤其是在子类中存在方法覆盖的情况下。 还需要注意,如果父类子类在同一个包中,默认访问权限的方法也可以被调用,而跨包的情况下,只有public和protected方法才能被访问。这可能涉及到访问修饰符的知识点,是否需要简要提及呢? 用户可能在实际开发中遇到问题,比如忘记使用super导致递归调用,或者没有正确调用父类构造函数导致编译错误。因此,给出具体的代码示例会更有帮助,比如Animal和Dog的例子,展示直接调用和super的使用。 最后,是否要提到多级继承的情况?比如子类子类如何调用父类方法,可能使用super.super.method(),但实际上Java不允许这样做,只能直接调用上一级父类方法。这部分可能会有疑问,需要澄清。 总结步骤应该是:先介绍直接调用,再讲super关键字,然后是构造函数的情况,最后强调访问权限和可能的陷阱。确保回答结构清晰,步骤明确,让用户能够逐步理解和应用。</think>在Java中,子类调用父类方法主要有以下两种场景,我们通过具体示例逐步说明: --- ### 一、直接调用未覆盖的父类方法 **当子类没有重写父类方法时**,可以直接通过子类对象调用父类方法: ```java class Animal { public void eat() { System.out.println("动物进食"); } } class Dog extends Animal { // 未重写eat()方法 } // 调用示例 Dog dog = new Dog(); dog.eat(); // 直接调用父类方法,输出:动物进食 ``` --- ### 二、调用被覆盖的父类方法 **当子类重写父类方法后**,若仍需调用父类原始方法,需使用`super`关键字: ```java class Animal { public void move() { System.out.println("动物移动"); } } class Cat extends Animal { @Override public void move() { super.move(); // 先调用父类方法 System.out.println("猫跳跃移动"); // 添加子类特有行为 } } // 调用示例 Cat cat = new Cat(); cat.move(); /* 输出: 动物移动 猫跳跃移动 */ ``` --- ### 三、构造方法中的父类调用 **子类构造方法必须隐式或显式调用父类构造方法**,通过`super()`实现: ```java class Vehicle { private String type; public Vehicle(String type) { this.type = type; } } class Car extends Vehicle { private int wheels; public Car(String type, int wheels) { super(type); // 必须作为第一行代码 this.wheels = wheels; } } ``` --- ### 关键注意事项 1. **访问权限限制**: - 只能调用父类的`public`/`protected`方法和默认访问权限(同包时)的方法 - 无法调用父类的`private`方法 2. **super使用规则**: ```java super.父类方法名(); // 调用普通方法 super(参数); // 调用构造方法(必须作为构造方法首行) ``` 3. **继承层级**: - 多层继承时`super`始终指向直接父类 - 无法通过`super.super.method()`访问祖父类方法 --- ### 应用场景对比 | 场景 | 调用方式 | 典型用途 | |--------------------------|---------------------|------------------------------| | 未重写父类方法 | 直接调用 | 复用父类基础功能 | | 重写后需保留父类行为 | super.method() | 模板方法模式、功能扩展 | | 需要初始化父类状态 | super()构造函数调用 | 确保父类成员正确初始化 | 通过合理使用这些方法,可以实现代码复用、功能扩展和层次化设计,这是Java面向对象编程中继承特性的核心应用之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十六画生的博客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值