返回列表 回复 发帖

《java入门123》中修饰符的一些问题

现在看到《java入门123》中11.3.8—访问控制符带来的覆盖问题这节,有些问题

这是测试方法

package com.javaeasy.override;
import com.javaeasy.override.diffpkg.SubClassInDiffPkg;
public class TestOverride {
        public static void main(String[] args) {
                System.out.println("=====使用ParentClass的对象调用test方法:=====");
                ParentClass test = new ParentClass();
                test.test();
                System.out.println("=====使用SubClassInSamePkg的对象调用test方法:=====");
                SubClassInSamePkg subSame = new SubClassInSamePkg();
                subSame.test();
                System.out.println("=====使用SubClassInDiffPkg的对象调用test方法:=====");
                SubClassInDiffPkg subDiff = new SubClassInDiffPkg();
                subDiff.test();
        }
}

输出显示:
=====使用ParentClass的对象调用test方法:====
这是类ParentClass中的privateMethod方法
。。。。。。(这些显示暂时省略了)
。。。。。。
=====使用SubClassInSamePkg的对象调用test方法:=====
这是类ParentClass中的privateMethod()方法
。。。。。
。。。。。
=====使用SubClassInDiffPkg的对象调用test方法:=====
这是类ParentClass中的privateMethod()方法
这是类ParentClass中的defaultMethod()方法
。。。。。




第一部分的显示我理解,应为它是用ParentClass的引用test调用的test()方法,所以能显示所有的东西。
但是第二和第三部分,有点不懂。private修饰的方法只能在本类中被使用。那么SubClassInSamePkg的引用subSame调用test()方法的时候,为什么会显示“这是类ParentClass中的privateMethod()方法
”这个呢?这句话是在父类ParentClass中定义的,为什么会被子类调用?还有第三部分的显示,就是不同包的子类但是能调用父类中用默认修饰符过的方法。。。。有点搞混了。。。。。
1# qianhang1990

“private修饰的方法只能在本类中被使用”这句话怎么理解的问题。
举例来说,两个类,A和B,A中有个两个方法,一个privateM方法,一个publicM方法,publicM方法调用了privateM方法。这个是没问题的。

然后,B中创建了一个A的对象,或者说,如果B继承了A,覆盖了A的publicM方法。这时候,调用A的/父类的publicM方法,这个方法就会调用privateM方法。

也就是说,这个对privateM方法的调用,不是直接由外部(B)调用的,而是借A之手来的。

对于同一个包内方法的问题,也是一样的。
2# deepnighttwo


原来如此,谢谢斑竹
返回列表