2015-04-23 4 views
5

Hier ist mein Code-Snippet:Was bedeuten keine Flags für Feld im Klassenformat in JAVA?

public class Test { 

    public static void main(String[] args) { 

     class EnglishHelloThere { 
       int a=10; 
     } 
    } 

} 

ich eine lokale Klasse erstellt, um zu sehen, welche Art von Zugriffsmodifikator bekomme ich, wenn keinen Modifikator für Variable in lokaler Klasse von Compiler geschrieben.

Das ist, was ich in javap bekam ist also

Compiled from "Test.java" 
class com.Test$1EnglishHelloThere 
    SourceFile: "Test.java" 
    EnclosingMethod: #21.#23    // com.Test.main 
    InnerClasses: 
     #27= #1; //EnglishHelloThere=class com/Test$1EnglishHelloThere 
    minor version: 0 
    major version: 51 
    flags: ACC_SUPER 
Constant pool: 
    #1 = Class    #2    // com/Test$1EnglishHelloThere 
    #2 = Utf8    com/Test$1EnglishHelloThere 
    #3 = Class    #4    // java/lang/Object 
    #4 = Utf8    java/lang/Object 
    #5 = Utf8    a 
    #6 = Utf8    I 
    #7 = Utf8    <init> 
    #8 = Utf8    ()V 
    #9 = Utf8    Code 
    #10 = Methodref   #3.#11   // java/lang/Object."<init>":()V 
    #11 = NameAndType  #7:#8   // "<init>":()V 
    #12 = Fieldref   #1.#13   // com/Test$1EnglishHelloThere.a:I 
    #13 = NameAndType  #5:#6   // a:I 
    #14 = Utf8    LineNumberTable 
    #15 = Utf8    LocalVariableTable 
    #16 = Utf8    this 
    #17 = Utf8    Lcom/Test$1EnglishHelloThere; 
    #18 = Utf8    SourceFile 
    #19 = Utf8    Test.java 
    #20 = Utf8    EnclosingMethod 
    #21 = Class    #22   // com/Test 
    #22 = Utf8    com/Test 
    #23 = NameAndType  #24:#25  // main:([Ljava/lang/String;)V 
    #24 = Utf8    main 
    #25 = Utf8    ([Ljava/lang/String;)V 
    #26 = Utf8    InnerClasses 
    #27 = Utf8    EnglishHelloThere 
{ 
    int a; 
    flags: 

    com.Test$1EnglishHelloThere(); 
    flags: 
    Code: 
     stack=2, locals=1, args_size=1 
     0: aload_0 
     1: invokespecial #10     // Method java/lang/Object."<init> 
":()V 
     4: aload_0 
     5: bipush  10 
     7: putfield  #12     // Field a:I 
     10: return 
     LineNumberTable: 
     line 12: 0 
     line 13: 4 
     line 12: 10 
     LocalVariableTable: 
     Start Length Slot Name Signature 
       0  11  0 this Lcom/Test$1EnglishHelloThere; 
} 

grundsätzlich Flags-Feld leer gelassen, damit ich bin verwirrt, welche Art von Zugriffsmodifikator hat diese Variable

, weil, wenn ich hinzufügen private int a=10; oder public int a=10; i bekommen

public int a; 
    flags: ACC_PUBLIC 

oder

protected int a; 
    flags: ACC_PROTECTED 

Welche Art von Zugriffsmodifizierer wird standardmäßig abgerufen?

+3

möglich Duplikat [Was ist der Standard Zugriffsmodifikator in Java?] (Http://stackoverflow.com/questions/16164902/what-is-the-default-access-modifier -in-java) – Morfic

+0

Es werden standardmäßig keine Zugriffsmodifizierer angezeigt. Beachten Sie, dass Sie eine lokale Variable nicht 'privat' oder' geschützt' hinzufügen können. Sie können es nur "endgültig" machen. –

Antwort

1

Die folgende Tabelle zeigt den Zugriff auf Elemente, die von jedem Modifikator zugelassen sind. stellt fest, dass Lokale innere Klassen sind Lokalcodeblöcke Daraus ich will sagen, dass Lokale innere Klassen

enter image description here

Aber dieser Zugriffsmodifikator kann verwirrend im Wert .Es „den Begriff hier zulässig Hinweis“ sein auch aufgerufene Methode lokale innere Klassen sind keine Mitglieder der Klasse, deren Code ein Teil ist, sondern lokal zu dem Codeblock, zu dem sie gehören, genauso wie eine lokale Variable.

Es kann nicht außerhalb des Blocks zugegriffen werden, in dem sie definiert sind.

Für Beispiel Angenommen ich diesen Code

package packageone.com; 
public class HavingLocalClass { 
    public HavingLocalClass() { 
     // TODO Auto-generated constructor stub 
    } 
    void TestMethod(int a){ 
     class LocalClass{ 
      int localVar; 
      public void display(){ 
      System.out.println(localVar); 
      } 

      public LocalClass(int localVar) { 
       this.localVar=localVar; 
       // TODO Auto-generated constructor stub 
      } 



      } 

      LocalClass lc=new LocalClass(a); 
      System.out.println(lc.localVar); 
      /* If i directly try to print localVar here it will 
       give me error */ 
      //System.out.println(localVar);//cannot be resolved into variable 


    } 
} 

jetzt im gleichen Paket in einem Paket lesen, schreiben, wenn ich versuche ich es nur durch diese Methode zugreifen muß, um zu drucken.

package packageone.com; 

public class TestingMain { 
public static void main(String...strings){ 
HavingLocalClass tsp= new HavingLocalClass(); 
tsp.TestMethod(85); 
} 
} 

Ausgang 85

1

Der Standard - wenn kein Modifikator vorhanden ist - ist Paket privat (aka Paket lokal). Dies beschränkt die Sichtbarkeit innerhalb desselben Pakets. Dies ist unabhängig davon, wo die Klasse definiert ist (oberste Ebene, innere, anonyme oder lokale Methode).

Das besagt, dass die Sichtbarkeit von Feldern in lokalen Methodenklassen nicht sehr relevant ist, da sie auf den Umfang der Methode beschränkt sind.

+1

@PeterLawrey Die Frage bezieht sich auf ein Feld in einer methode-lokalen Klasse. Allerdings ist die Sichtbarkeit von Feldern in lokalen Methodenklassen nicht sehr relevant, da sie auf den Anwendungsbereich der Methode beschränkt sind. –

0

Es wird default/package-private-Modifikator, wenn nicht mit einem anderen Modifikator angegeben. Auch eine lokale Variable kann nicht mit einem anderen Modifikator (geschützt, öffentlich oder privat) aber default.Also kann es mit hinzugefügt werden final, um die Wertänderung einzuschränken.Für mehr reference

Verwandte Themen