java中的关键字--this、static

this关键字

this关键字的主要用途:
1.this调用本类属性
2.this调用本类方法
3.this表示当前对象

this调用本类属性

代码:

class Person{
    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name; //使用this调用本类的属性name
        this.age = age;   //使用this调用本类的属性age
        /*
        有人可能觉得this不一定要使用,但是在这里形参和属性重名,为了区分
        使用this调用就表示是本类的属性,可以进行赋值。否则形参与类中的属性同名时
        类中属性无法被正确赋值。
         */
    }

    public String getPersonInfo(){
        return "姓名:" + name + ",年龄:" + age;
    }
}


public class Test{
    public static void main(String[] args) {
        Person person  = new Person("abaka",21);
        System.out.println(person.getPersonInfo());
    }
}
this调用本类方法

在这里this 调用本类方法有两种情况:
1.调用普通方法:this.方法名称(参数)
2.调用构造方法:this(参数)

this调用普通方法:

class Person{
    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
        this.getPersonInfo(); 
        /*
        this调用普通方法,这里可以不使用this进行调用,但是推荐加上,
        加上可以区分方法的定义来源,在继承中会使用到。
         */
    }

    public void getPersonInfo(){
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}


public class Test{
    public static void main(String[] args) {
        Person person  = new Person("abaka",21);
    }
}

this调用构造方法:

class Person{
    private String name;
    private int age;

    public Person(){
        System.out.println("1.**********************");
    }
    public Person(String name){
        this();
        /*
        this()调用本类的Person()方法。
         */
        System.out.println("2.**********************");
        this.name = name;
    }

    public Person(String name,int age){
        this(name);
        /*
        this(name)调用本类的Person(String name)方法
         */
        System.out.println("3.**********************");
        this.age = age;
        this.getPersonInfo();
    }

    public void getPersonInfo(){
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}


public class Test{
    public static void main(String[] args) {
        Person person  = new Person("abaka",21);
    }
}

运行结果:

1.**********************
2.**********************
3.**********************
姓名:abaka,年龄:21

在java中支持构造方法的相互调用,
使用this调用构造方法时请注意:
1.this调用构造方法的语句必须在方法的首行,否则会报错(受查异常)
2.使用this调用构造方法时,要留出口。不能在调用构造中成环,这样就是死循环。

this表示当前对象
class Person{
    private String name;
    private int age;

    public void print(){
        System.out.println("print方法:" + this);//this调用当前类的对象
    }
}

public class Test{
    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("main方法:"+ person1);
        person1.print();
        System.out.println("----------------------");
        Person person2 = new Person();
        System.out.println("main方法:"+ person2);
        person2.print();
    }
}

运行结果:

main方法:www.bit.java.Person@1540e19d
print方法:www.bit.java.Person@1540e19d
----------------------
main方法:www.bit.java.Person@677327b6
print方法:www.bit.java.Person@677327b6

结果中print方法和main方法显示的地址是一样的,那是因为print方法中调用了this,打印的是当前类的对象,而main是直接打印除了当前对象,所以两个是相同的。至于分割线上下打印出的地址不一样那是因为源代码中使用Person()构造new了两次,每new一次其实就是在堆上开辟了一块新的空间,所以相当于在堆上开辟了两个不同地址的空间,而person1,person2分别为这两个空间的地址,所以才会不一样。

static关键字

在java中static用于修饰属性和方法。
static声明的属性和方法的生命周期和类相同,在整个应用程序执行期间都有效。
注:
static修饰的属性和方法属于类
普通属性和方法属于对象

Static修饰属性(类中属性)

在一个类中定义普通属性,每new一个对象就会在堆上分配一片空间,空间中是各属性值的存储,但是static修饰的属性不是保存在堆中,而是在全局数据区,在整个生命周期中只有一个存在(与new的对象无关),对所有对象共享。

如图所示:
在这里插入图片描述
图中new了两个对象,普通属性拷贝了两份分别存放在不同的堆空间,对象间不能共享同一属性,但是static属性只有一份,在全局数据区,两个对象共享一个属性。

描述共享属性,只需在属性前加static关键字就可以

static属性又称为类属性,保存在全局数据区(所有对象共享区域)的内存之中,所有对象都可以进行该数据区的访问

注:
1.static属性可以通过类名调用,与对象实例化无关
2.所有非static属性必须在对象实例化后使用,而static属性不受对象实例化限制
3.在定义类中属性时一般不使用static,只有需要共享属性,或者不受对象实例化约束的属性时使用static.
4.局部变量不能用static修饰。

static方法

static方法和static属性特质基本相同,可以通过类名直接调用,与对象实例化无关
注:
1.所有的static方法不允许访问非static定义的属性或方法。因为static与对象实例化无关,而非static定义的属性或方法都与对象实例化有关,两个的创建时间不同,权限不同。static创建在非static创建之前,static存在而非static不一定存在所以不能访问。
2.所有非static方法允许访问static方法或属性。非static创建在static创建之后,所以非static存在则static必然存在,所以可以访问。

猜你喜欢

转载自blog.csdn.net/qq_39032310/article/details/85325437