首页 > 代码库 > this与static

this与static

this关键字:

    我们经常用对象来调用方法,但是一个类如果有多个对象,那么机器怎么知道是哪个对象调用的?你可能会说你是这样写的

a.b();

a对象调用了b方法,很明显是a对象调用的,但是机器怎么知道,很显然按编程者的思维的话需要把a对象传过去,这样就可以了。但是我们从来没有去这样做,这是因为编译器替我们完成了。但是,其实有一个必须在方法内部使用的关键字this,他表示调用方法的那个对象的引用,this最常用的可能就是和构造器一起使用了,一种是赋值时,一种是在构造器中使用构造器,可以防止代码重复,下面是示例代码:

class B{
    int d;
    String str;
    B(int d){
        this.d=d;
    /*这里不用this,你要怎么办?我就只有d不可以重名了。
     * 可能你会想传入一个对象的引用,但是在在构造方法之前根本就没有对象的引用
     * 传入一个对象的引用在一个普通的方法中还可以去实现,但是每次都传就很费事*/
    }
    B(String str,int d){
        this(d);//这里你主动去调用第一个只有一个参数的构造器,省去了代码this.d =d
        this.str=str;
    }
}

static关键字:

  我们创建类,其实就是在描述一个事物的属性,这时并没有给我们分配内存,当我们实例化这个类得到对象时才分配了内存,这里的方法才可以被外界调用。但是,如果我们想创造一个方法,它不和任何的类的对象关联,也就是说这个方法在没有对象时我就可以使用。这时候static就可以满足我们。

静态的数据和方法可以就是“类数据”和“类方法”,他不会因为某个对象的存在而存在,因为某个对象的消失而消失,下面是一个程序:

public class Test{
    static int b;
    public static void main(String[] args) {
        a();/*静态方法,所以直接调用了,如果是非静态,就要Test test = new Test(); test.a()*/
        Test test1 = new Test();
        test1.b =2;
        System.out.println("Test1---->"+test1.b);
        Test test2 = new Test();
        test2.b=3;
        System.out.println("Test2---->"+test2.b);
        System.out.println("Test1---->"+test1.b);
    }
    public static void a(){
        System.out.println("静态方法");
    }
    
}/*OUTPUT 
静态方法
Test1---->2
Test2---->3
Test1---->3
*/

输出结果test1也变为了3,说明无论你实例化的对象是什么,静态的数据永远信奉我就是我的至理名言;

在静态方法中,不可以使用非静态数据和方法,因为静态方法可以在没对象的时候就使用,而非静态的数据和方法必定与对象绑定在一起,所以在没对象时怎么能做有对象时的事呢?但是也不是没有解决办法,没有对象可以实例化一个呀,这就解决了问题啊。代码就是这样

public class Test{
    public static void main(String[] args) {//主函数是静态的奥
        Test test = new Test();
        test.a();//有对象了就可以调用了 
    }
    public  void a(){
        System.out.println("非静态方法");
    }
}

由于this代表一个对象的引用,static又是无对象主义者,所以两者不共戴天,在static方法中决不能使用this