java基础2
1:静态方法为什么不能访问类的实例变量
因为他俩跟本放的不是一个地方
静态方法存储在栈中,而其他的非静态方法存储在堆中
基本如图
栈 | 堆
静态 | 非静态
根本不属于一个系统....
2:按引用传递
import java.awt.Dimension; public class ReferenceTest { public static void main(String[] args) { Dimension d=new Dimension(5,10); ReferenceTest rt=new ReferenceTest(); System.out.println("Before modify d.height="+d.height); rt.modify(d); System.out.println("After modify d.height="+d.height); } void modify(Dimension dim){ dim.height=dim.height+1; System.out.println("dim.height="+dim.height); } }
输出:
Before modify d.height=10
dim.height=11
After modify d.height=11
引用变量d和dim都指向同一个对象。将对象变量传递到方法时,必须记住传递的是对象引用,而不是实际对象本身。根本没有传递实际的引用变量,而是该引用变量的一个副本。变量副本意味着获得该变量内的位副本,因此,当传递引用变量时,是在传递表示如何获取特定对象的位副本。换句话说,调用方法和被调用方法现在都具有该引用完全相同的副本,因此二者都将引用堆上完全相同的对象(这里不是副本)。
3:按值传递。
对于运行在单个JVM内的所有变量,Java实际上是按值传递的。按值传递意味着按变量的值传递,也就是传递该变量的一个副本。
、 按值传递和按引用传递的区别。
如果传递的是对象引用变量,则是在传递一个表示对象引用的位副本,然后,被调用方法得到自己的引用变量副本并处理它,但是,因为两个相同的引用变量引用完全相同的对象,所以,如果被调用方法修改该对象(例如,通过调用其setter方法),则调用方法将看到最初变量引用的对象也会被修改。
按值传递的要点:被调用方法不能修改调用方法的变量,尽管对对象引用变量而言,被调用方法能够修改该变量引用的对象。
对象引用:意味着被调用方法不能重新对调用方法原来的引用变量赋值,也就不能引用不同的对象或null.
void bar(){ Foo f=new Foo(); doStuff(f); } void doStuff(Foo g){ g.setName("BOO"); g=new Foo(); }
会重新对g赋值而不会重新对f赋值。bar()结尾处,两个Foo对象都创建。一个被局部变量f引用,一个被局部变量(变元)g引用。因为doStuff()有该引用变量的一个副本,所以它有方法获得原来的Foo对象,比如调用setName(),但是,doStuff()无法获得f引用变量。因此,doStuff()能修改对象f内引用的值,但不能修改f的实际内容(位模式)。换句话说,doStuff()可以修改f引用的对象的状态,但不能使f引用不同的对象。