但是在static方法中可以生成某个类的对象,然后就可以调用这个对象自己的非static方法. 但是这不也是包含了非static方法吗?
这是为什么?两者有什么区别?
那位能从内存分配内部机制和oop思想上解答一下?谢谢
10 个解决方案
#1
1.“static方法中不能直接调用非static方法”
是对于同一个对象(类)而说的。
完整的描述应该是:
类A的static方法中不能直接调用类A的非static方法。
原因很简单,类A的static方法如果调用了类A的非static方法,他将困惑程序员的意图,因为它不知道类A的非static方法属于哪一个对象的。
2.“在static方法中可以生成某个类的对象,然后就可以调用这个对象自己的非static方法”
原理同上,因为指明了object,所以可以调用了。
3.“那位能从内存分配内部机制和oop思想上解答一下”
与内存分配无任何关系。
与oop思想无任何关系。
只要记住一点:java虚拟机需要某种机制确保知道程序员的意图。
是对于同一个对象(类)而说的。
完整的描述应该是:
类A的static方法中不能直接调用类A的非static方法。
原因很简单,类A的static方法如果调用了类A的非static方法,他将困惑程序员的意图,因为它不知道类A的非static方法属于哪一个对象的。
2.“在static方法中可以生成某个类的对象,然后就可以调用这个对象自己的非static方法”
原理同上,因为指明了object,所以可以调用了。
3.“那位能从内存分配内部机制和oop思想上解答一下”
与内存分配无任何关系。
与oop思想无任何关系。
只要记住一点:java虚拟机需要某种机制确保知道程序员的意图。
#2
thanks to feiyuegaoshan(飞跃)
*************与内存分配无任何关系****************
*************与oop思想无任何关系*****************
我的意思是想知道static和non-static的数据在内存中如何分配的,都在heap中,有何不同?如果想知道更具体的细节是不是要看其他书,操作系统,编译原理,我想彻底的明白是怎么回事,推荐一些书或文章吧!
关于oop思想,有种说法说使用static不是oop,如何理解?
*************与内存分配无任何关系****************
*************与oop思想无任何关系*****************
我的意思是想知道static和non-static的数据在内存中如何分配的,都在heap中,有何不同?如果想知道更具体的细节是不是要看其他书,操作系统,编译原理,我想彻底的明白是怎么回事,推荐一些书或文章吧!
关于oop思想,有种说法说使用static不是oop,如何理解?
#3
无法直接调用,
生成示例后,也是利用示例达到间接调用
就是这个意思吧
生成示例后,也是利用示例达到间接调用
就是这个意思吧
#4
就这样想:
你要钉一个钉子在地上,你要一个工具,就是锤子。而张三有。你可以直接拿他的工具。(调用静态方法。)
你也可以叫他为你提供钉钉子的服务,(生成张三的对象,然后调用他的非静态方法。)
我是这样想的。不知道对不对。请各位大侠出来骂骂!
你要钉一个钉子在地上,你要一个工具,就是锤子。而张三有。你可以直接拿他的工具。(调用静态方法。)
你也可以叫他为你提供钉钉子的服务,(生成张三的对象,然后调用他的非静态方法。)
我是这样想的。不知道对不对。请各位大侠出来骂骂!
#5
static 方法的定义性声明放在栈去
当调用他的时候,将实例化该方法中使用的对象,该对象放在堆区
static方法结束,释放实例化的对象
注:不包括类似单子的方式
当调用他的时候,将实例化该方法中使用的对象,该对象放在堆区
static方法结束,释放实例化的对象
注:不包括类似单子的方式
#6
楼上能不能说的再详细点?
#7
up
#8
static 方法不能调用 非static 的资源。
但是可以随意使用它自己方法内部的成员
所以,如果像调用类内部非 static 的资源,
就再static 方法内建立一个本类的实例,
(像其它方法成员一样 int 啦 String 啦)
然后通过这个自己拥有的实例间接访问非 static 的资源
======================================
与内存管理没什么关系, 这样做其实是浪费内存的
与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想
但是可以随意使用它自己方法内部的成员
所以,如果像调用类内部非 static 的资源,
就再static 方法内建立一个本类的实例,
(像其它方法成员一样 int 啦 String 啦)
然后通过这个自己拥有的实例间接访问非 static 的资源
======================================
与内存管理没什么关系, 这样做其实是浪费内存的
与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想
#9
“与内存管理没什么关系, 这样做其实是浪费内存的”
关系不大。Java的垃圾收集器自己会处理。不需要担心。
“与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想”
差不多吧:)
关系不大。Java的垃圾收集器自己会处理。不需要担心。
“与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想”
差不多吧:)
#10
具体的讲:
jvm在加载类文件的时候。
会把类方法(static),实例方法加载到
虚拟机一个称为method area区域,
该区域包含类的所有信息,包括类型说明
constant pool入口等等。它们都是线程
共享的。类方法,和实例方法都放在这个区域
类方法和实例方法调用的方法是不相同的。
第一种:类方法 invokestatic
第二种:实例方法 invokevirtual
两种方法的区别:1.实例方法需要虚拟机初始化一个实例,在这个实例的基础上调用方法
2.实例方法是动态绑定的,这和动态连接是不一样的.
3.类方法:是在编译的工程中确定的,依赖对象的类型,是在类装入的 时 候就已经装入到内存中了
实例方法:调用依赖于对象实际的类,是在初始化实例的时候才装入
为什么在static方法中不能调用非static方法?而在类方法中可以调用static方法呢?
这个虚拟机实现时有一定关系的。当执行一个实例方法时当前执行的线程就会把要执行
的实例方法的代码(虚拟机中称为一个method frame)push到堆栈中。而这个堆栈中保存
这到该实例对象的引用(改实例对象位于heap区域,保存一些实例变量,以及指向method area区域的指针,这样实例就可以访问类的数据),故此在实例变量内部可以访问到类方法
而在类方法中,执行的时候在堆栈中并不保存指向实例的引用。因为他初始化的时候并不
知道哪个实例会调用他。没有这个引用他就没有办法访问到实例方法变量的信息。除非在
static方法内部创建一个这样的引用。
jvm在加载类文件的时候。
会把类方法(static),实例方法加载到
虚拟机一个称为method area区域,
该区域包含类的所有信息,包括类型说明
constant pool入口等等。它们都是线程
共享的。类方法,和实例方法都放在这个区域
类方法和实例方法调用的方法是不相同的。
第一种:类方法 invokestatic
第二种:实例方法 invokevirtual
两种方法的区别:1.实例方法需要虚拟机初始化一个实例,在这个实例的基础上调用方法
2.实例方法是动态绑定的,这和动态连接是不一样的.
3.类方法:是在编译的工程中确定的,依赖对象的类型,是在类装入的 时 候就已经装入到内存中了
实例方法:调用依赖于对象实际的类,是在初始化实例的时候才装入
为什么在static方法中不能调用非static方法?而在类方法中可以调用static方法呢?
这个虚拟机实现时有一定关系的。当执行一个实例方法时当前执行的线程就会把要执行
的实例方法的代码(虚拟机中称为一个method frame)push到堆栈中。而这个堆栈中保存
这到该实例对象的引用(改实例对象位于heap区域,保存一些实例变量,以及指向method area区域的指针,这样实例就可以访问类的数据),故此在实例变量内部可以访问到类方法
而在类方法中,执行的时候在堆栈中并不保存指向实例的引用。因为他初始化的时候并不
知道哪个实例会调用他。没有这个引用他就没有办法访问到实例方法变量的信息。除非在
static方法内部创建一个这样的引用。
#1
1.“static方法中不能直接调用非static方法”
是对于同一个对象(类)而说的。
完整的描述应该是:
类A的static方法中不能直接调用类A的非static方法。
原因很简单,类A的static方法如果调用了类A的非static方法,他将困惑程序员的意图,因为它不知道类A的非static方法属于哪一个对象的。
2.“在static方法中可以生成某个类的对象,然后就可以调用这个对象自己的非static方法”
原理同上,因为指明了object,所以可以调用了。
3.“那位能从内存分配内部机制和oop思想上解答一下”
与内存分配无任何关系。
与oop思想无任何关系。
只要记住一点:java虚拟机需要某种机制确保知道程序员的意图。
是对于同一个对象(类)而说的。
完整的描述应该是:
类A的static方法中不能直接调用类A的非static方法。
原因很简单,类A的static方法如果调用了类A的非static方法,他将困惑程序员的意图,因为它不知道类A的非static方法属于哪一个对象的。
2.“在static方法中可以生成某个类的对象,然后就可以调用这个对象自己的非static方法”
原理同上,因为指明了object,所以可以调用了。
3.“那位能从内存分配内部机制和oop思想上解答一下”
与内存分配无任何关系。
与oop思想无任何关系。
只要记住一点:java虚拟机需要某种机制确保知道程序员的意图。
#2
thanks to feiyuegaoshan(飞跃)
*************与内存分配无任何关系****************
*************与oop思想无任何关系*****************
我的意思是想知道static和non-static的数据在内存中如何分配的,都在heap中,有何不同?如果想知道更具体的细节是不是要看其他书,操作系统,编译原理,我想彻底的明白是怎么回事,推荐一些书或文章吧!
关于oop思想,有种说法说使用static不是oop,如何理解?
*************与内存分配无任何关系****************
*************与oop思想无任何关系*****************
我的意思是想知道static和non-static的数据在内存中如何分配的,都在heap中,有何不同?如果想知道更具体的细节是不是要看其他书,操作系统,编译原理,我想彻底的明白是怎么回事,推荐一些书或文章吧!
关于oop思想,有种说法说使用static不是oop,如何理解?
#3
无法直接调用,
生成示例后,也是利用示例达到间接调用
就是这个意思吧
生成示例后,也是利用示例达到间接调用
就是这个意思吧
#4
就这样想:
你要钉一个钉子在地上,你要一个工具,就是锤子。而张三有。你可以直接拿他的工具。(调用静态方法。)
你也可以叫他为你提供钉钉子的服务,(生成张三的对象,然后调用他的非静态方法。)
我是这样想的。不知道对不对。请各位大侠出来骂骂!
你要钉一个钉子在地上,你要一个工具,就是锤子。而张三有。你可以直接拿他的工具。(调用静态方法。)
你也可以叫他为你提供钉钉子的服务,(生成张三的对象,然后调用他的非静态方法。)
我是这样想的。不知道对不对。请各位大侠出来骂骂!
#5
static 方法的定义性声明放在栈去
当调用他的时候,将实例化该方法中使用的对象,该对象放在堆区
static方法结束,释放实例化的对象
注:不包括类似单子的方式
当调用他的时候,将实例化该方法中使用的对象,该对象放在堆区
static方法结束,释放实例化的对象
注:不包括类似单子的方式
#6
楼上能不能说的再详细点?
#7
up
#8
static 方法不能调用 非static 的资源。
但是可以随意使用它自己方法内部的成员
所以,如果像调用类内部非 static 的资源,
就再static 方法内建立一个本类的实例,
(像其它方法成员一样 int 啦 String 啦)
然后通过这个自己拥有的实例间接访问非 static 的资源
======================================
与内存管理没什么关系, 这样做其实是浪费内存的
与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想
但是可以随意使用它自己方法内部的成员
所以,如果像调用类内部非 static 的资源,
就再static 方法内建立一个本类的实例,
(像其它方法成员一样 int 啦 String 啦)
然后通过这个自己拥有的实例间接访问非 static 的资源
======================================
与内存管理没什么关系, 这样做其实是浪费内存的
与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想
#9
“与内存管理没什么关系, 这样做其实是浪费内存的”
关系不大。Java的垃圾收集器自己会处理。不需要担心。
“与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想”
差不多吧:)
关系不大。Java的垃圾收集器自己会处理。不需要担心。
“与oop思想更没联系,其实严格上讲,static 方法本身违背 oop 思想”
差不多吧:)
#10
具体的讲:
jvm在加载类文件的时候。
会把类方法(static),实例方法加载到
虚拟机一个称为method area区域,
该区域包含类的所有信息,包括类型说明
constant pool入口等等。它们都是线程
共享的。类方法,和实例方法都放在这个区域
类方法和实例方法调用的方法是不相同的。
第一种:类方法 invokestatic
第二种:实例方法 invokevirtual
两种方法的区别:1.实例方法需要虚拟机初始化一个实例,在这个实例的基础上调用方法
2.实例方法是动态绑定的,这和动态连接是不一样的.
3.类方法:是在编译的工程中确定的,依赖对象的类型,是在类装入的 时 候就已经装入到内存中了
实例方法:调用依赖于对象实际的类,是在初始化实例的时候才装入
为什么在static方法中不能调用非static方法?而在类方法中可以调用static方法呢?
这个虚拟机实现时有一定关系的。当执行一个实例方法时当前执行的线程就会把要执行
的实例方法的代码(虚拟机中称为一个method frame)push到堆栈中。而这个堆栈中保存
这到该实例对象的引用(改实例对象位于heap区域,保存一些实例变量,以及指向method area区域的指针,这样实例就可以访问类的数据),故此在实例变量内部可以访问到类方法
而在类方法中,执行的时候在堆栈中并不保存指向实例的引用。因为他初始化的时候并不
知道哪个实例会调用他。没有这个引用他就没有办法访问到实例方法变量的信息。除非在
static方法内部创建一个这样的引用。
jvm在加载类文件的时候。
会把类方法(static),实例方法加载到
虚拟机一个称为method area区域,
该区域包含类的所有信息,包括类型说明
constant pool入口等等。它们都是线程
共享的。类方法,和实例方法都放在这个区域
类方法和实例方法调用的方法是不相同的。
第一种:类方法 invokestatic
第二种:实例方法 invokevirtual
两种方法的区别:1.实例方法需要虚拟机初始化一个实例,在这个实例的基础上调用方法
2.实例方法是动态绑定的,这和动态连接是不一样的.
3.类方法:是在编译的工程中确定的,依赖对象的类型,是在类装入的 时 候就已经装入到内存中了
实例方法:调用依赖于对象实际的类,是在初始化实例的时候才装入
为什么在static方法中不能调用非static方法?而在类方法中可以调用static方法呢?
这个虚拟机实现时有一定关系的。当执行一个实例方法时当前执行的线程就会把要执行
的实例方法的代码(虚拟机中称为一个method frame)push到堆栈中。而这个堆栈中保存
这到该实例对象的引用(改实例对象位于heap区域,保存一些实例变量,以及指向method area区域的指针,这样实例就可以访问类的数据),故此在实例变量内部可以访问到类方法
而在类方法中,执行的时候在堆栈中并不保存指向实例的引用。因为他初始化的时候并不
知道哪个实例会调用他。没有这个引用他就没有办法访问到实例方法变量的信息。除非在
static方法内部创建一个这样的引用。