对静态和非静态访问变量的困惑

时间:2016-01-07 11:11:45

标签: java

为什么字段A可以是非静态的。但是,当我从字段staticBC中删除D时,出现编译错误。

这是来自一个资源的猜测,我想了解为什么我可以在没有A的情况下进行字段static

public class Solution
{
    public int A = 5;
    public static int B = 5;
    public static int C = 5;
    public static int D = 5;

    public static void main(String[] args)
    {
        Solution solution = new Solution();
        solution.A = 5;
        solution.B = 5 * B;
        solution.C = 5 * C * D;
        Solution.D = 5 * D * C;
        Solution.D = 5;
    }

    public int getA()
    {
        return A;
    }
}

3 个答案:

答案 0 :(得分:0)

在Java中,一个类可以有两种类成员:

  1. 实例成员:实例成员属于该类的实例(对象)。例如代码中的变量function get(rec, binName, from, to) if aerospike:exists(rec) then local l = rec[binName] if (l == nil) then return list()--return empty array else --first index in lua is 1 local length = list.size(l) local pagination = list() if (length < from) then return list() elseif (length >= from and length <=to) then for i=from,length,1 do list.append(pagination, l[i]) end--end for return pagination else for i=from,to,1 do list.append(pagination, l[i]) end--end for return pagination end end else return list();--end return empty array end--end else aerospike exists end --end function 。实例变量为类的每个对象分别具有单独的副本(分配内存)。可以在A上下文中直接访问实例成员,并且需要在non-static上下文中访问实例(对象)。

  2. 静态成员static成员属于该类。一个类只存在每个变量的一个副本。可以在任何地方直接在班级中访问static个成员。例如代码中的变量staticBC

  3. D

    请参阅此代码块,因为Solution solution = new Solution(); solution.A = 5; // solution.B = 5 * B; solution.C = 5 * C * D; Solution.D = 5 * D * C; Solution.D = 5; 是类的实例成员,因此您使用类A的实例访问它。所有其他人都是班级的solution成员。 static成员属于该类,可以在static上下文中直接访问。 static是一种main()方法。

    当您从其他变量static中删除static时,您需要使用该类的实例访问它们,因为它们成为该类的实例成员并需要一个对象引用来访问它们

    另请注意,可以使用类的实例访问(B, C, D)个成员。例如,使用static,这里solution.CC成员,但可以使用类的实例访问。同样适用于staticB

答案 1 :(得分:0)

我会试着说清楚。静态意味着可以使用此方法或变量,而无需具有该类的对象

没有静态:

Solution solution = new Solution();
solution.A = 5;

with static:

        **S**olution.B = 5 * B;
        **S**olution.C = 5 * C * D;
        Solution.D = 5 * D * C;

请注意,如果你用解决方案(大S)调用它,则引用类,而解决方案(小s)是类的对​​象

因为使用B,C,D而没有“解决方案”,所以假定你的意思是将其称为静态(就像Solution.B)

您的代码“已更正”:

public class Solution
{
    public int A = 5;
    public int B = 5;
    public int C = 5;
    public int D = 5;

    public static void main(String[] args)
    {
        Solution solution = new Solution();
        solution.A = 5;
        solution.B = 5 * solution.B;
        solution.C = 5 * solution.C * solution.D;
        solution.D = 5 * solution.D * solution.C;

        Solution.D = 5;
    }
}

答案 2 :(得分:0)

使用代码:

Solution solution = new Solution();

您正在创建类Solution的对象。因此,您有一个实例和

solution.A

不是静态访问(也不是其他字段访问)。这段代码应该生成一个警告,告诉你这个(至少是Eclipse&amp; IDEA)。