java--静态属性和非静态属性的赋值与取值



 

public class Test {

  static int age;   //static修饰,静态属性

  int classNum;

 

  public static void main(String[] args) {

    Test person = new Test();    //在这个对象中赋值,12给了classNum,它是非静态属性,所以只在本空间中存在

    person.classNum = 12;

    person.age = 20;       //20给了静态属性,也就是说它存在于方法区,所有对象共用

    //非静态属性

    System.out.println("personclassNum的值:" + person.classNum);//personclassNum的值:12

    System.out.println("personage的值:" + person.age);//personage的值:20

   

    Test person2 = new Test();     //因此,在这个新建的空间中,classNum获取不到值,但是age能获取得到20

    //非静态属性

    System.out.println("person2classNum的值:" + person2.classNum);//person2classNum的值:0

    System.out.println("person2age的值:" + person2.age);//person2age的值:20

  }

 

}

 

 

 

package com.qianfeng.day07.demo4;

 

public class Pet2 {

       staticint i = 0;

                                                               /*运用场景:

                                                                       *         1、所有的对象共用某一个属性时,使用静态属性

                                                                       *         2、跟final 一起使用,可以当常量用

                                                                       *         3、国际化字符切换*/

       publicPet2() {

              i++;

              method();

       }

 

       publicstatic void method() {

              System.out.println("生成的是第" + i + "个对象");

       }

       publicstatic void main(String[] args) {

              for(int j = 0; j < 10; j++){

                     newPet2();//所有的对象共用某一个属性时,这里有10个对象,哈哈,明白啦

              }

              System.out.println(Pet2.i);

       }

}

 

 

 

public class Pet {

  String name;

  static int i; //静态属性。只能被静态方法使用。如果把static去掉,变为非静态属性,则报错,

                //因为编译时是方法区先启动,无法加载非静态属性

 

  public static void main(String[] args) {

    Pet cat=new Pet();

    cat.name="";  //运行到这里后,“猫”通过cat.name传入到成员变量里,再返回到对象中输出

    i++; //i0i++之后变1

   

    Pet dog=new Pet();

    dog.name="";

    i++;//i1i++之后变2

   

    Pet birg =new Pet();

    birg.name="鹦鹉";

    i++;//i2i++之后变3

    System.out.println(i);

  }

 

}

 

 

 

package com.qianfeng.day07.demo4;

 

public class Static {

       /**

        * 静态属性:

        *   1、使用static进行修饰

        *  2、属于类, 使用类名.属性进行访问, 也可以使用对象名.属性 (不建议使用)

        *  3、不能出现在非静态方法中,非静态块中

        *  4、如果跟fianl关键字使用时,表示常量,而变量名写法有个习惯

        *         eg : PARAM_VALID_ILLEGAL_REQUEST

        * 

        *  //选中:shift + ctrl + x 小写转大写

        *  运用场景:

        *         1、所有的对象共用某一个属性时,使用静态属性

        *         2、跟final 一起使用,可以当常量用

        *         3、国际化字符切换

        * 

        * 静态方法

        *   1、使用static进行修饰

        *   2、属于类, 使用类名.方法进行访问, 也可以使用对象名.方法 (不建议使用)

        *  3、静态方法中不能调用非静态方法,非静态属性

        * 

        *  运用场景:

        *         1、工具类   (比如:Math.max)  XmlUtil JsonUtil  DBUtil

        *

        * 静态代码块

        *   1、使用static进行修饰

        *  2、类进行加载时,就开始执行了,并且执行一次

        *  3、静态方法,属性,块,是有顺序要求,谁排在前面,谁先加载

        *

        * 运用场景:

        *   1、操作数据库时,建立连接时使用

        *   2、初始化系统(项目)参数

        */

       publicstatic void main(String[] args) {

       }

}

 

 

 

 

package com.qianfeng.day07.demo4;

 

public class StaticBlock {

       intage;

       static{

              //知识点:静态块执行顺序

              //类进行加载时,就开始执行了,并且执行一次

              //运用场景:

              //  >> 操作数据库时,建立连接时使用

              //  >> 初始化系统(项目)参数

              System.out.println("静态块");

              //Cannot make a static reference to thenon-static field age

              //System.out.println(age);

             

              //Cannot reference a field before it isdefined

              //注意点:静态方法,属性,块,是有顺序要求,谁排在前面,谁先加载

              //System.out.println(staticAge);

       }

       //staticint staticAge;

      

       //非静态块 非静态成员代码块

       //在创建对象前,进行调用,即在调用构造方法前调用

       //每次创建对象,都会调用

       //实际项目中,很少使用, 初始化作用,但是跟构造方法初始属性功能重复了

       {

              System.out.println("非静态块");

       }

      

       publicStaticBlock(){

              System.out.println("构造方法");

       }

      

      

       publicstatic void main(String[] args) {

              /*StaticBlock staticBlock = new StaticBlock();

              StaticBlock staticBlock2 = newStaticBlock();

              StaticBlock staticBlock3 = newStaticBlock();

              StaticBlock staticBlock4 = newStaticBlock();

              StaticBlock staticBlock5 = newStaticBlock();*/

             

              System.out.println("--------------");

              new StaticBlock();

              System.out.println("-------------2-");

              new StaticBlock();

             

             

              System.out.println("-------------3-");

             

              //int i = 0;

              //局部代码块

              /*{

                     inti = 1;

              }*/

              //i cannot be resolved to a variable

              //System.out.println(i);

       }

      

 

}

 

 

 

 

 

 

 

package com.qianfeng.day07.demo4;

 

public class StaticField {

       //-----静态属性的研究------

       StringfieldStr;  //普通属性 它属于对象

      

       /*

        * 1static 关键字修饰的属性  方法,表示为静态属性,静态方法

        * 2static 修饰的属性或者方法,它属于类的

        * 3static 修饰属性或者方法,它存在方法区里面,是一个全局变量(或方法),而且唯一

        *                   所有的对象都共用。

        */

       staticString  staticFieldStr; // 静态属性

      

       publicstatic void main(String[] args) {

              //普通属性的访问方式

              StaticField staticField = newStaticField();

              //Cannot make a static reference to thenon-static field fieldStr

              //原因:fieldStr 是对象的属性,在静态方法中访问,无法确定是哪一个的属性

              //所以无法方法,必须指定具体的对象

              //System.out.println(fieldStr);  //错的

              System.out.println(staticField.fieldStr);//正确的

             

              //静态属性的访问方式

              //因为staticFieldStr 静态的属性,它属于类,而且存在于方法区中,且是唯一的一份

              //公共的,所有在static 方法中可以访问

              System.out.println(staticFieldStr);//正确的

       }

}

 

 

 

 

 

package com.qianfeng.day07.demo4;

 

public class StaticMethod {

      

       intage;   //非静态

       staticint staticAge;//静态

      

       /*

        * 非静态方法

        */

       publicvoid method(){

              System.out.println("StaticMethod.method()");

             

              staticMethod();

       }

      

       /*

        * 静态方法

        * 1、静态方法属于类方法,使用类名.方法进行访问

        * 2、静态方法中不能调用非静态方法,可以调用静态的方法

        *    因为:非静态方法属于对象,调用前提是必须有对象存在,而.class加载时,

        *          静态方法同时加载入方法区,此时,没有创建任何对象,如果通过类名.方法

        *          访问时,如果静态方法中调用的非静态方法,那么只能报错,因为没有对象

        *          提供用于非静态方法的访问

        * 3、静态方法不能访问非静态属性,原理跟2一样

        * 4、不能再静态方法中使用this关键字

        * 5、非静态方法可以访问静态方法,静态属性

        */

       publicstatic void staticMethod(){

              //Cannot make a static reference to thenon-static method method()

              //from the type StaticMethod

              //method();

             

              StaticMethod staticMethod = newStaticMethod();

              staticMethod.method();  //对象调用了

             

              //访问非静态属性

              //Cannot make a static reference to thenon-static field age

              //System.out.println(age);

             

              //访问静态属性

              System.out.println(staticAge);

              System.out.println("StaticMethod.staticMethod()");

       }

      

      

      

      

      

      

      

       publicstatic void main(String[] args) {

              StaticMethod.staticMethod();  //本类中

             

       }

}

 

 

 

 

 

package com.qianfeng.day07.demo4;

 

public class Test {

       publicstatic void main(String[] args) {

              //非静态属性

              StaticField sf = new StaticField();

              System.out.println(sf.fieldStr);

             

              //静态属性

              //静态属性访问:类名.具体的静态属性 / 方法

              System.out.println(StaticField.staticFieldStr);

             

              //The static fieldStaticField.staticFieldStr should

              //be accessed in a static way

              //不提倡通过对象进行访问静态属性或方法

              //System.out.println(sf.staticFieldStr);

             

             

              //非本类调用静态方法

              StaticMethod.staticMethod();

             

             

             

       }

}

 

 

 

package com.qianfeng.day07.demo4;

 

public class A {

       Aa = new A();//aClass文件中创建了,在.class文件加载时会不会也同时在堆内存中开辟对象的空间?

                                      //要是也开辟了空间的话,有a去调用非静态方法,再用静态方法去接收,不是也可以?

                                      //答:不行,因为这时候还没开辟空间,执行程序后是先加载tatic

       publicstatic void  method1(){

             

       }

      

       publicvoid method2(){

       }

      

       publicstatic void main(String[] args) {

              A aa = new A();

       }

}

 

 

 

package com.qianfeng.day07.demo4;

 

public class Activity {

       publicstatic String TAG = "Activity";

      

       intage = 10;

       //常量

       staticfinal int age2 = 10;

      

 

}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿成长

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值