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引用不同的对象。

 

posted @ 2016-10-18 21:58  陆伟  阅读(192)  评论(0编辑  收藏  举报