static方法不是只能使用static的变量和方法吗(标签-Java)

为什么Java在类里面写static方法时可以new该类的对象?
static方法不是只能使用static的变量和方法吗?

static方法可以通过new对象使用,只是不推荐这样使用,推荐直接类名.static方法

new是构造函数,这没问题,之所以不能调用非static的变量,是因为对于自身来说,没有对象实例就没有相关的成员变量,所以调用不起来
创建一个新对象,以及调用其它对象的成员函数,都没有这个问题。
比如
class Person {
public static void foo(Person p1)
{
p1.Show(); //这完全没问题
}
public void Show() { .. }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7483207
  • 这篇博客你也可以参考下:java中static修饰符你真的懂吗?
  • 除此之外, 这篇博客: java面试题(2018最新)中的 38.是否可以从一个static方法内部发出对非static方法的调用? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    不可以,如果其中包含对象的method();不能保证对象初始化.   
    
  • 您还可以看一下 李兴华老师的java核心技术精讲课程中的 static定义内部类小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    答案:

    静态方法只能使用静态变量和静态方法的原因是静态方法属于类级别,在类实例化之前就已经存在了,而非静态变量和方法需要在类实例化之后才能使用。但是在静态方法中创建该类的对象是可以的,因为对象属于实例级别,与静态方法互不影响。

    具体示例代码:

    public class Example {
        private static int staticVar = 1; // 静态变量
        private int var = 2; // 非静态变量
    
        public static void staticMethod() {
            Example example = new Example(); // 在静态方法中创建对象
            System.out.println("静态方法中创建对象,非静态变量值为:" + example.var); // 访问非静态变量
            System.out.println("静态变量值为:" + staticVar); // 访问静态变量
        }
    }
    

    在上述示例中,我们在静态方法中创建了 Example 对象,并访问了其非静态变量和静态变量。这样做是没有问题的,因为在静态方法中使用该类的实例属于类级别和实例级别的结合,与使用非静态方法访问实例一样。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

static方法确实可以通过类名调用,但是在该方法中无法直接使用非静态(即实例)变量和方法。而对于这个问题,关键在于"new"操作符,它的作用是通过类的构造器创建并返回一个新对象。因为类里面的static方法是属于整个类而不依赖于实例,所以static方法可以通过"new"操作符创建该类的新对象,但是这样做不会在创建过程中初始化实例变量,而且该对象通常也没有实际意义。建议尽量避免在static方法里面使用"new"操作符,以免出现逻辑混乱和性能问题。