簡體   English   中英

父 package class 可從 java 中的子包 class 訪問?

[英]parent package class accessible from child packge class in java?

在 java 父 package class 可從子包 class 訪問? 請給我解釋一下嗎?

例如 package A.A1.A2 包含 class sub package A 包含 class sup

有沒有辦法從 sub 訪問 sup?

請解釋。

我試過導入它不會工作示例:在程序目錄結構之前 package1 包含 package1.java --> package2 --> package3 包含 PCheck.java

//package1.java
package package1;
public class package1{
    public static void main(String[] args) {

    }
}
class phelo{
    phelo(){
        int a;
        System.out.println("hai fun freom package 1");
    }
}

//PCheck.java;
package package1.package2.package3;
import package1.*;   //to import package1.java
public class PCheck {
    public static void main(String[] args) {
        phelo obj=new phelo();
    }
}
class helo{
    helo(){
        int a;
        System.out.println("hai fun from package 3");
    }
}

output:編譯時錯誤:package package1.package2.package3不存在;

對於從不同目錄導入 class,我們使用導入語句,但在這里我們需要從子包訪問父級 package。我嘗試導入它不起作用,請舉例說明。

Java無法識別子包1的概念。 就Java而言,包aababc是無關的。 它們只是名字。

因此,如果要從abcSomeOtherClass訪問abSomeClass ,則必須使用完全限定的類名,或者向SomeOtherClass添加import

1 - 從Java 9開始,您可以使用模塊來實現比單個包更大的抽象邊界。 這並沒有解決這個關於包私有訪問的問題,但它可以被視為package-private的替代方案


至於你沒有編譯的例子,我認為我們需要一個合適的MCVE來理解它。 我的猜測是你的源代碼樹的文件組織錯了......

問題還在於您嘗試導入的類的可見性是錯誤的(包私有),但這不會導致編譯器說不存在,就像您說的那樣。

在java子包類中可以從子包類訪問? 請解釋我任何一個?

不是你想的那樣。 目錄是分層的,但包只是區分名稱。

如果子項需要父包或其層次結構之外的任何其他包,則只需要導入它。

這就是為什么import foo.*不允許您訪問所有子包名稱 - 包不像目錄那樣是分層的。

所有答案似乎都錯過了OP在包類上的觀點,因為每個人似乎都建議將該類作為解決方法導入。

答案是:包級別類(即沒有顯式訪問級別修飾符)僅對EXACT相同的包可見。

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

如果類沒有修飾符(默認值,也稱為包私有),則只能在其自己的包中顯示

這實際上意味着父/子/外部包都不能查看該類。

只需導入它:

import A.sup;

是的,每當我嘗試訪問源文件的同一個 package 或源文件的父 package 中的 class 時,我都會遇到相同的錯誤,它會生成編譯時錯誤,因此通過反復試驗,我得出的結論是這些包不是以支持類中主要方法的方式構建的,也不是以支持導入其父包或子包的方式構建的

在abcSomeOtherClass的對象中:

List<String> tmp=new ArrayList<String>(Arrays.asList(this.getClass().getPackage().getName().split("\\.")));
tmp.remove(tmp.size()-1);
String parent_package_name=tmp.toString().replace(", ", ".").replaceAll("[\\[\\]]", "");
Class cls=Class.forName(parent_package_name+".SomeClass");

默認類只能在包中使用, 子包除外

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM