簡體   English   中英

靜態上下文中的非靜態變量引用(Java)

[英]non-static variable reference from a static context (Java)

我已經搜索了這個問題,但仍然沒有任何解決方案。

我聲明了這個簡單的程序:

public class Test{
  public abstract class Person {
      public void talk(){
        System.out.print("I am a person");
      }
      public abstract void display();
  }

  public class Student extends Person {
    public void talk(){
        System.out.println("I am a student");
    }

    public void display(){
        System.out.println("Nice to meet you");
        super.talk();
    }
  }

  public static void main(String args[])
  {
    Student s = new Student();
    s.display();
  }
}

但它總是給我錯誤:

錯誤:非靜態變量,無法從靜態上下文中引用

    Student s = new Student();

我一直都這樣聲明對象! 我不知道今天怎么了。

我需要了解我在這里做錯了什么?

聲明內部類時:

class Outer {
  class Inner {
  }

  void doSomething() {}
}

每個Inner實例都擁有對Outer類實例的隱式引用。 這意味着您可以在內部類中編寫以下內容以引用外部實例:

Outer.this.doSomething();

實際上,您通常可以只編寫doSomething() -僅需要Outer.this如果內部類也有一個名為doSomething()的方法,則需要消除歧義。

總而言之,您實際上需要一個Outer實例來創建Inner實例:

Outer outer = new Outer();
Inner inner = outer.new Inner();

如果您實際上不需要引用Inner內部的Outer實例(例如,您永遠不需要調用doSomething() ),那么最簡單的解決方案就是使內部類static

class Outer {
  static class Inner {}

  void doSomething();
}

實際上,我建議您始終使內部類成為靜態類,除非您確實需要使它們成為非靜態類。

使您的人和學生班級保持靜態

要么

首先創建測試對象,然后在main方法中創建Student對象。

Student s = new Test().new Student();

原因:由於Person / Student類是非靜態的,因此如果沒有Test Object,它們就不會存在。 因此,要么這些類應該是靜態的,要么首先創建Test()來創建Student。

從測試班級中刪除人員和學生:

public abstract class Person { 
    public void talk(){ 
        System.out.print("I am a person"); 
    }
    public abstract void display();
} 

public class Student extends Person    { 
    public void talk(){ 
        System.out.println("I am a student"); 
    }     
    public void display(){ 
        System.out.println("Nice to meet you");
        super.talk(); 
    } 
}

public class Test{ 
    public static void main(String args[]) { 
        Student s = new Student();    
        s.display(); 
    }
 }

一切正常:

     abstract class Person {
        public void talk(){
            System.out.print("I am a person");
        }
        public abstract void display();
    }

     class Student extends Person {
         public void talk() {
             System.out.println("I am a student");
         }

         public void display() {
             System.out.println("Nice to meet you");
             super.talk();
         }
     }

    public class Test {


        public static void main(String args[]) {
            Student s = new Student();
            s.display();
        }
    }

暫無
暫無

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

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