2015-04-23 41 views
5

Dưới đây là đoạn mã của tôi mã:Không có cờ cho trường có nghĩa là ở định dạng Lớp trong JAVA?

public class Test { 

    public static void main(String[] args) { 

     class EnglishHelloThere { 
       int a=10; 
     } 
    } 

} 

Tôi tạo ra một lớp địa phương để xem những loại sửa đổi lần truy cập nào để tôi nhận được khi không viết bất kỳ sửa đổi cho biến trong lớp học địa phương từ trình biên dịch.

Đây là những gì tôi đã nhận trong javap

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; 
} 

Vì vậy, về cơ bản lĩnh vực cờ được để trống vì vậy tôi đang bối rối những loại sửa đổi lần truy cập không biến này được

vì nếu tôi thêm private int a=10; hoặc public int a=10; tôi nhận được

public int a; 
    flags: ACC_PUBLIC 

hoặc

protected int a; 
    flags: ACC_PROTECTED 

Vậy loại công cụ sửa đổi truy cập nào được nhận theo mặc định?

+3

thể trùng lặp của [modifier truy cập mặc định trong java là gì?] (Http://stackoverflow.com/questions/16164902/what-is-the-default-access-modifier -in-java) – Morfic

+0

Mặc định nó không có bộ sửa đổi truy cập, lưu ý rằng bạn không thể thêm 'private' hoặc' protected' vào một biến cục bộ. Bạn chỉ có thể làm cho nó 'cuối cùng'. –

Trả lời

1

Bảng sau đây cho biết quyền truy cập vào các thành viên được mỗi công cụ sửa đổi cho phép.

enter image description here

Nhưng modifier truy cập này có thể gây nhầm lẫn "Lưu ý hạn được phép ở đây" đáng Nó của lưu ý rằng lớp bên trong địa phương địa phương để khối mã Từ đó tôi có nghĩa là để nói rằng lớp bên trong địa phương cũng được gọi là phương thức các lớp bên trong cục bộ không phải là thành viên của lớp trong đó mã là một phần nhưng là cục bộ cho khối mã mà chúng thuộc về, giống như một biến cục bộ.

Không thể truy cập vào bên ngoài khối mà chúng được xác định.

Ví dụ Giả sử tôi đọc viết mã này trong một gói

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 


    } 
} 

bây giờ trong cùng một gói nếu tôi cố gắng để in tôi phải truy cập nó thông qua phương pháp duy nhất đó.

package packageone.com; 

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

đầu ra 85

1

Giá trị mặc định - khi không có công cụ sửa đổi - là gói riêng tư (còn gọi là gói cục bộ). Điều này hạn chế khả năng hiển thị trong cùng một gói. Đó là không phân biệt nơi mà lớp được định nghĩa (cấp cao nhất, bên trong, ẩn danh hoặc phương thức cục bộ).

Điều đó nói rằng, khả năng hiển thị của các trường của các lớp địa phương phương pháp không phải là rất có liên quan, vì chúng được giới hạn trong phạm vi của phương pháp.

+1

@PeterLawrey Câu hỏi đặt ra là một trường trong lớp phương thức cục bộ. Điều đó nói rằng, khả năng hiển thị của các trường của các lớp phương thức cục bộ không phải là rất có liên quan, vì chúng được giới hạn trong phạm vi của phương thức. –

0

Nó sẽ được sửa đổi mặc định/gói riêng tư nếu không được chỉ định với bất kỳ công cụ sửa đổi nào khác. cuối cùng để hạn chế thay đổi giá trị của nó.Để biết thêm reference

Các vấn đề liên quan