Java对象为什么不直接调用而是使用new的方式进行?

如题,在学习java的时候,我发现直接调用其他类中的方法和new一个方法可以达到相同的目的,那么我们为什么还要new一个对象呢?直接调用不就好了么?

对象所在的类:

img

代码奉上:

package com.duixiang;

public class DuixiangDemo {
    public static void main(String[] args) {
        b();
    }
    private static void a(){
        Duixiang duixiang = new Duixiang();
        int a = duixiang.ssh(62,57);
        System.out.println(a);
    }
    private static void b(){
        int a = Duixiang.ssh(62,57);
        System.out.println(a);
    }
}

还请各位指教!

直接用类名调用,要求调用的方法必须是静态方法,也就是必须有static修饰,没有使用static修饰的方法,这类方法必须以new对象来调用

static修饰的方法才可以拿类名.方法名调用,没有修饰的你就要new了

你把static去掉 还能调吗

作用域的概念,了解一下。

了解一下java的特点,所有开发中让你不解的习惯都是为了更好的突出java的特点。
比如为什么工具类方法都被定义static,而业务代码都用容器托管来创建向。

你的Java基础还是比较薄弱,类和对象的概念还没有掌握扎实,就开始搞多线程了。

  • 之所以引进类和对象的概念,是因为编程需求当中,需要具有封装的概念。
  • 之所以封装的概念要存在类和对象两个,是因为类是模板,对象是相互独立的内存存储区域。
    一个模板可以复制多个结构相同的内存区域,但是,多个区域中的数据是相互独立,可以不相同的。

计算机程序在底层是由操作符和操作数组成的,由这个概念发展出来的编程语言中,引申出函数和变量的概念,函数用来操作数据,变量用来保存数据。
程序设计语言在发展到面向对象的语言之后,出现了类和对象的概念。类作为对象的结构信息(通常不会被改变)被存放的静态区,同时,所有的函数也存放在静态区。
静态函数和非静态函数的区别在于,非静态函数在参数传递的时候会隐式的传入this引用(指针),这个隐式的传入操作是在编译器编译过程中生成的,即使你的函数体中没有使用,它也会被隐式的传入。保存在静态区的变量和函数的作用域都是全局的。非静态的成员函数之所以不被全局访问,是因为参数列表不相同(隐式传入的当前对象的引用类型也包含在内)无法进行调用,编译器无法强制进行调用。这就是Java语法中,访问非静态函数必须要某个对象的引用来调用成员函数的原因,因为底层编译器在编译的时候,调用函数是会把当前对象的引用当做隐式参数传到函数中去形成this引用的。
而static函数在调用的时候,前面添加所属的类,也是为了让编译器在编译的时候找到静态函数在静态区的地址。
static修饰的成员变量,也会放在静态区,由于静态区的作用域是全局的,静态成员变量原则上会被所有对象和函数进行访问,并且是独一份的。
至于访问修饰符 public/protected/private 是编译器基于语法层面的限制,遵照语法规则即可,所以我在上述问题上说了原则上可以,但是,如果有语法约束,那就先按照语法的限制来做。不排除使用其他技术手段突破语法限制的情况。


关于整理思路:

  1. 没有问题。static 修饰的方法或变量,访问的时候都是通过 类名.方法名(属性名) 的方式进行访问。
  2. 静态变量不是存放在栈区,是存放在静态区。栈区是线程在运行时产生的线程栈所存放的区域,栈区里面全是线程栈。
    函数的参数会保存到栈区,确切的说是线程栈中。线程栈会在函数的调用前后进行现场保护和现场还原的工作,所以参数列表必须压栈弹栈。
  3. Java 有静态块的概念,并且这些代码块会存放到静态区,
    但是,这些静态块的存在意义并不是为了优化程序性能,而是为了类加载过程中,针对类信息的初始化提供编程接口,
    静态块的存在是为了加载类的时候可以初始化类信息(包括静态变量)。
    当然,你可以用它来优化程序性能,虽然我不知道什么情况下可以称为优化性能。
  4. 并发(或者说多线程、多进程技术)与 static 修饰符是两个不同层面的概念。
    如果不使用锁、信号量等技术解决线程安全问题,非静态的成员变量照样会出问题。

谢谢各位的回答!每个人都给予了我一定的帮助!
现在重新整理一下思路:

  1. static关键字修饰的方法或者变量 不需要依赖于对象来进行访问,只要 类被加载了 ,就可以通过 类名.方法 去进行访问。

  2. 静态变量存储在栈内存,而new就会作用于堆内存,程序的栈内存是有限的,堆内存要大得多,而且堆有自动回收机制。

  3. static关键字还有一个比较重要的作用就是用来 形成静态代码块以优化程序性能
    static块可以置于类中的任何地方,类中可以有多个static块。
    在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
    优化代码块 是将需要多次执行的方法里的单个或多个对象放到 static{} 中,可以避免重复new对象而导致的空间浪费
    如果把所有的属性都变为 static 的话,会让类加载过程变得很慢,使得类变得很臃肿。

  4. 把所有的属性都变为static,全局可以共享同一个属性,但是如果在并发情况下,如果所有线程共享一个属性,那么就会出问题。
    比如学生管理系统里面肯定有 Student 的吧,如果你的 Student 中所有的属性都是 static 的话,那么所有的线程都会修改同一个类,就会产生不能预料的结果,所以不是所有的属性都可以设置为 static。
    你能产生这种想法,根本的原因就是业务场景简单、没有思考过并发情况。 ——引用于 @三岁丫 的回答

啊这,前提是你有static静态方法呀...