java: 无法从静态上下文中引用非静态 变量 this
package sy1;
import java.util.Date;
public class s3 {
abstract class Graph {
public abstract double getArea();
public abstract double getPerimeter();
public Graph() {}
}
public class Rectangle extends Graph {
double width,length;
public Rectangle(double w, double l) {
width = w;length = l;
}
@Override
public double getArea() {return width * length;}
@Override
public double getPerimeter() {return 2 * (width + length);}
}
public class Circle extends Graph{
public double radius;
public Circle(double r){ radius = r;}
@Override
public double getArea() {return 3.14 * radius * getPerimeter();}
@Override
public double getPerimeter() {return 2 * 3.14 * radius;}
}
public class Box extends Rectangle {
public double height;
public Box(double w, double l,double h) {
super(w, l);
height = h;
}
@Override
public double getArea() {
return 2 * (super.getArea() +width * height + length * height);
}
public double getVolume(){return height * super.getArea();}
}
public class Cylinder extends Circle{
public double height;
public Cylinder(double r,double h) {
super(r);
height = h;
}
@Override
public double getArea() {return 2 * super.getArea() + super.getPerimeter() * height;}
public double getVolume(){return super.getArea() * height;}
}
public class Text{
public static void main(String[] args) {
Graph rectangle = new Rectangle(1,2);
System.out.println("Rectangle: " + "Area:" + rectangle.getArea() + "Perimeter:" + rectangle.getPerimeter());
Graph circle = new Circle(2.3);
System.out.println("Circle: " + "Area:" + circle.getArea() + "Perimeter:" + circle.getPerimeter());
Box box = new Box(1,2,3);
System.out.println("Box: " + "Area:" + box.getArea() + "Volume:" + box.getVolume());
Cylinder cylinder = new Cylinder(2.3,4);
System.out.println("Cylinder: " + "Area:" + cylinder.getArea() + "Volume:" + cylinder.getVolume());
}
}
}
你那个代码功能上没问题,但是写的位置不对,怎么其他的类都写在s3这个类内部了?你把他们都从s3里拿出来,是能运行的
原因:静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。