java中成员变量被static所修饰

老是听说成员变量被静态所修饰那么生成的对象该属性就是共享的,但是还是有是有一些疑惑:
1.都书new出来的对象的地址值是不同的,那么不同的对象对相同静态属性new不同的对象结果怎样?
2.被静态修饰的成员变量new出来的对象所指向的地址值是否相同?
3.既然类的属性是被静态所修饰,那么 类名.静态属性 所指向的地址值是否会发生改变?

带着疑问我进行了一些测试

注意:下面类中所引用的User用到了上一篇中的建造者模式对构造方法的优化,这里贴出代码,其实不需要这么复杂,你可以把他想象成一个简单有User类,有姓名,年龄,电话,地址四个属性,我这里主要是用来复习

public class User {

    private final String name;
    private final int age;
    private final String tel;
    private final String address;

    private User(UserBuilder userBuilder){
        this.name = userBuilder.name;
        this.age = userBuilder.age;
        this.tel = userBuilder.tel;
        this.address = userBuilder.address;
    }

    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public String getTel() {
        return tel;
    }
    public String getAddress() {
        return address;
    }

    /**
     * 该类主要是用来解决初始化User时构造方法中参数太多,以及参数个数不确定导致的构造方法过多的问题
     * @author wangchen
     *
     */
    public static class UserBuilder{

        private final String name;
        private final int age;
        private String tel;
        private String address;

        public UserBuilder(String name,int age){
            this.name=name;
            this.age=age;
        }

        public UserBuilder tel(String tel){
            this.tel=tel;
            return this;
        }

        public UserBuilder address(String address){
            this.address=address;
            return this;
        }

        public User builder(){
            return new User(this);
        }

    }

}
public class Test2 {

    private static User user;

    public static void main(String[] args) {

        Test2 t1 = new Test2();
        Test2 t2 = new Test2();

        t1.user = new User.UserBuilder("zhangsan", 11).builder();
        t2.user = new User.UserBuilder("lisi", 22).address("山西").builder();

        /*
         * 成员变量被静态所修饰,new出变量所在的类的对象.静态成员变量所对应的地址值相同
         */
        System.out.println(t1.user);
        System.out.println(t2.user);

        /*
         * 成员变量被静态所修饰,直接new出该变量所在的类的对象所指向的地址值不同
         */
        System.out.println(new User.UserBuilder("zhangsan", 11).builder());
        System.out.println(new User.UserBuilder("lisi", 22).address("山西").builder());

        /*
         * 静态成员变量直接用  类名.属性 获得的对象所指向的地址值随右边生成的对象的变化而变化
         */
        Test2.user = new User.UserBuilder("zhangsan", 11).builder();
        System.out.println(Test2.user);
        Test2.user = new User.UserBuilder("zhangsan", 11).builder();
        System.out.println(Test2.user);



    }

}

控制台输出结果:
dm.builder.construction.entity.User@47abfd68
dm.builder.construction.entity.User@47abfd68
dm.builder.construction.entity.User@6c89db9a
dm.builder.construction.entity.User@4eb09321
dm.builder.construction.entity.User@2a8b83e3
dm.builder.construction.entity.User@2d7fc1e7

总结:

(1) 一个类中有成员变量被静态所修饰,那么该类在被创建成不同对象后,这些对象所对应的静态成员变量所指向的地址值是相同的 如t1.user和t2.user,但是右边赋值的对象所指向的地址值是不同的 如:new User.UserBuilder(“zhangsan”, 11).builder() 和 new User.UserBuilder(“lisi”, 22).address(“山西”).builder();他实际的意思是右边生成不同对象将值赋给了左边相同地址值的对象
(2) 一个类中有成员变量被静态所修饰,通过类名.静态成员变量所指向的地址值是由右边生成的对象赋予的 如:Test2.user = new User.UserBuilder(“zhangsan”, 11).builder();而右边生成的对象所指向的地址值是不同的,所以 类名.静态成员变量所指向的地址值 是不固定的

综上所述,凡是被new出来的对象所指向的地址值就是不同的,但是如果成员变量被静态所修饰,那么生成的对象虽然地址值不同,但是他们的静态属性所对应的地址值是相同的,且不变的。这个时候如果要对某一个对象的静态属性赋值,那么其他对象的该属性也同样会发生变化

你可能感兴趣的:(java)