[英]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.