问题描述
我可以看到不能在方法内部创建非静态类的静态对象吗?
码:
public class Rent {
public void abc() {
System.out.println("Non static method");
}
public static void def() {
System.out.println("this is static method");
}
}
public class SampleJava {
public static void main(String[] args) {
Rent r1 = new Rent();
public static Rent r2; //not allowed in static method
}
public static Rent r3; //allowed outside method
public void def() {
Rent r4 = new Rent();
public static Rent r5; //not allowed in non-static method either
}
}
1楼
您必须考虑以下几点:
静态数据类似于静态方法 。 它与实例无关。 声明为静态的值没有关联的实例。 它在每个实例中都存在,并且仅在内存中的单个位置声明。 如果曾经更改过,它将针对该类的每个实例进行更改。
您使用的访问修饰符仅允许用于类级别,而不能用于方法级别。 在您的示例中:
public static void main(String[] args) { Rent r1 = new Rent(); public static Rent r2; //Will give compile time error. }
考虑到“ 静态 ”的目的,如果要在方法内部声明静态对象,则其作用域将仅绑定到该特定方法。
通常,静态对象用于维护状态。
例如,您的数据库连接逻辑可能具有一个singleton类,并且此类的对象应保持数据库连接状态 。 这些对象必须是并且必须在类级别。
2楼
您得到的错误与静态/实例访问无关。 由于Java语法无效,它们只是编译时错误。
您不能在方法(无论是静态方法还是实例方法)中使用局部修饰符(如public
和static
来声明局部变量。
只需删除不必要的修饰符即可:
public static void main(String[] args) {
Rent r1 = new Rent();
Rent r2;
}
public static Rent r3;
public void def() {
Rent r4 = new Rent();
Rent r5;
}
3楼
首先,不允许您在方法内使用访问修饰符(公共,私有,受保护)声明变量。
您也不应在方法中将变量声明为static
变量。
您在方法之外声明的那些变量是类的成员。
有两种类型的变量:
- 实例变量(非静态成员)
- 类变量(静态成员)
我可以看到不能在方法内部创建非静态类的静态对象吗?
static表示它属于该类。 它甚至在实例化对象之前就已存在。 这就是为什么您可以直接通过类调用静态方法的原因。
那么什么是静态成员?
- 静态成员由同一类的所有对象共享。
- 它甚至在实例化(创建)对象之前就已经存在。
- 它属于该类,而不是任何单个对象。
例:
class Pond
{
static double waterTemp = 17.5; //Every Pond object shares the same value
int numFishes; //Belongs to each individual Pond object
}
如何访问静态成员:
System.out.println(Pond.waterTemp); //Preferred
System.out.println(Pond.numFished); //Not allowed
//OR
Pond pond = new Pond();
System.out.println(pond.waterTemp); //Not necessary, but allowed
System.out.println(pond.numFished); //The only way to get numFishes
4楼
非静态方法与实例相关联,因此需要先创建一个实例,然后才能对其进行访问。 但是,静态方法与类有关,因此即使没有实例也不应使用。 这些约束导致无法在非静态方法内部创建静态方法。