来自静态上下文的非静态变量引用(Java)
我一直在寻找这个问题,但仍然没有找到任何解决办法 我宣布这个简单的计划:来自静态上下文的非静态变量引用(Java),java,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 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();
我一直都是这样声明对象的!我不知道今天发生了什么
我需要了解我做错了什么?让你的个人和学生课堂保持静止 或 首先创建测试对象以在main方法中创建学生对象 学生s=新测试。新学生
原因:由于Person/Student类是非静态的,没有测试对象它们就不可能存在。所以这些类应该是静态的,或者应该首先创建Test来创建Student。使您的Person和Student类保持静态 或 首先创建测试对象以在main方法中创建学生对象 学生s=新测试。新学生
原因:由于Person/Student类是非静态的,没有测试对象它们就不可能存在。因此,这些类应该是静态的,或者应该首先创建Test来创建Student。从测试类中删除person和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();
}
}
从测试类中删除个人和学生:
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();
}
}
这一切都很好:
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();
}
}
声明内部类时:
class Outer {
class Inner {
}
void doSomething() {}
}
存在对外部类的实例的隐式引用,外部类的实例由内部类的每个实例持有。这意味着您可以在内部类中编写以下内容来引用外部实例:
Outer.this.doSomething();
实际上,您通常可以简单地编写doSomething—您只需要外部。如果内部类也有一个名为doSomething的方法,那么您需要消除歧义
这其中的长短不一之处在于,您实际上需要外部实例来创建内部实例:
如果您实际上不需要引用外部-内部-内部的实例,例如,您永远不需要调用doSomething,最简单的解决方案就是将内部类设置为静态:
事实上,我建议您始终将内部类设置为静态,除非您确实需要它们是非静态的。当您声明内部类时:
class Outer {
class Inner {
}
void doSomething() {}
}
存在对外部类的实例的隐式引用,外部类的实例由内部类的每个实例持有。这意味着您可以在内部类中编写以下内容来引用外部实例:
Outer.this.doSomething();
实际上,您通常可以简单地编写doSomething—您只需要外部。如果内部类也有一个名为doSomething的方法,那么您需要消除歧义
这其中的长短不一之处在于,您实际上需要外部实例来创建内部实例:
如果您实际上不需要引用外部-内部-内部的实例,例如,您永远不需要调用doSomething,最简单的解决方案就是将内部类设置为静态:
事实上,我建议您始终将内部类设置为静态,除非您确实需要它们是非静态的。除了main方法之外,似乎并没有静态方法,也并没有使用this关键字。你确定你发布了正确的代码吗?它抱怨变量“this”,而你没有,你也没有使用关键字this,因此,请确保你的文件已保存,然后再试一次是的,我是。我不知道我做错了什么我将创建一个新的项目文件,并尝试复制其中的代码。除了main方法之外,这里似乎并没有静态方法,也并没有this关键字的用法。你确定你发布了正确的代码吗?它抱怨变量“this”,而你没有,你也没有使用关键字this,因此,请确保你的文件已保存,然后再试一次是的,我是。我不知道我做错了什么演示你编译并运行这个程序吗?我将创建一个新的项目文件并尝试复制那里的代码。我不明白你所说的测试对象是什么意思。是的,我现在知道了。但是分离文件更容易。谢谢我不明白你说的测试对象是什么意思?是的,我现在知道了。但是分离文件更容易。感谢回答@AndyInner-inner=new-Outer.new-inner;清除所有内容,为了拥有内部类的实例,您需要外部类的实例Perfect answer@AndyInner inner=new outer.new inner;清除所有内容,为了拥有内部类的实例,您需要外部类的实例