Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过创建相同的包名称获得对包访问成员的访问权限_Java_Inheritance_Packages - Fatal编程技术网

Java 通过创建相同的包名称获得对包访问成员的访问权限

Java 通过创建相同的包名称获得对包访问成员的访问权限,java,inheritance,packages,Java,Inheritance,Packages,我有一个问题,是关于我突然想到的一种获取包访问成员访问权限的偷偷摸摸的方法。具体来说,我想扩展一个类,我们称之为com.acme.Foo,以添加一些功能。这是纯粹的添加:所有当前的Foo方法都只需委托给超类的方法即可得到支持。但是,没有可访问的Foo构造函数,因此我无法扩展该类,并且我的实现将无法通过作为Foo的“isA”测试。没有一个接口可以表达我可以用来代替继承的Foo-ness 这就是我突然想到的:Foo有一个包访问构造函数,那么为什么不在我的源文件夹中创建一个包com.acme,并在该包

我有一个问题,是关于我突然想到的一种获取包访问成员访问权限的偷偷摸摸的方法。具体来说,我想扩展一个类,我们称之为
com.acme.Foo
,以添加一些功能。这是纯粹的添加:所有当前的
Foo
方法都只需委托给超类的方法即可得到支持。但是,没有可访问的
Foo
构造函数,因此我无法扩展该类,并且我的实现将无法通过作为
Foo
的“isA”测试。没有一个接口可以表达我可以用来代替继承的
Foo
-ness

这就是我突然想到的:
Foo
有一个包访问构造函数,那么为什么不在我的源文件夹中创建一个包
com.acme
,并在该包中创建一个
InheritableFoo
类:

package com.acme;

public class InheritableFoo extends Foo {
    public InheritableFoo() {
        super();
    }
}
现在我可以通过扩展
InheritableFoo
来实现对
Foo
的扩展,因为它确实有一个可访问的构造函数


这感觉完全错误,而且有点不道德:我不尊重原始程序员在决定不公开
Foo
的构造函数时所做的决定。但可能的情况是,他们只是采取了“在有理由之前否认一切”的方法。不管怎样,这个想法有什么根本性的错误吗?如果我走这条路,将来会给自己带来问题吗?如果会,原因是什么?

您可以将自己的类“潜入”到另一个包中,并访问包限制元素,这一点是正确的

但是,这只会在
com.acme.foo
的作者将其代码作为源代码或未密封的包分发时发生。如果这个包的作者将它作为一个密封的罐子分发(我相信这很常见),那么您的方法将不再有效

JAR文件中的包可以选择密封,这意味着 该包中定义的所有类都必须归档在同一个JAR中 文件