如题,在学习java的时候,我发现直接调用其他类中的方法和new一个方法可以达到相同的目的,那么我们为什么还要new一个对象呢?直接调用不就好了么?
对象所在的类:
代码奉上:
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 是编译器基于语法层面的限制,遵照语法规则即可,所以我在上述问题上说了原则上可以,但是,如果有语法约束,那就先按照语法的限制来做。不排除使用其他技术手段突破语法限制的情况。
关于整理思路:
谢谢各位的回答!每个人都给予了我一定的帮助!
现在重新整理一下思路:
被 static关键字修饰的方法或者变量 不需要依赖于对象来进行访问,只要 类被加载了 ,就可以通过 类名.方法 去进行访问。
静态变量存储在栈内存,而new就会作用于堆内存,程序的栈内存是有限的,堆内存要大得多,而且堆有自动回收机制。
static关键字还有一个比较重要的作用就是用来 形成静态代码块以优化程序性能 。
static块可以置于类中的任何地方,类中可以有多个static块。
在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
而 优化代码块 是将需要多次执行的方法里的单个或多个对象放到 static{} 中,可以避免重复new对象而导致的空间浪费。
如果把所有的属性都变为 static 的话,会让类加载过程变得很慢,使得类变得很臃肿。
把所有的属性都变为static,全局可以共享同一个属性,但是如果在并发情况下,如果所有线程共享一个属性,那么就会出问题。
比如学生管理系统里面肯定有 Student 的吧,如果你的 Student 中所有的属性都是 static 的话,那么所有的线程都会修改同一个类,就会产生不能预料的结果,所以不是所有的属性都可以设置为 static。
你能产生这种想法,根本的原因就是业务场景简单、没有思考过并发情况。 ——引用于 “@三岁丫 ” 的回答
啊这,前提是你有static静态方法呀...