zoukankan      html  css  js  c++  java
  • JAVA对象与内存控制

    1.1 实例变量和类变量

    成员变量和局部变量:

    局部变量分为三大类:

      1)形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡。

      2)方法内的局部变量:在方法内定义的局部变量,随方法的结束而消亡。

      3)代码块内的局部变量:在代码块内定义的局部变量,随代码块的结束而消亡。

    局部变量的作用时间很短,它们都是被存在方法的栈内存中。

    1.2实例变量的初始化时机

    对于实例变量而言,它属于java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。从程序运行角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。

    从语法角度看,程序可以在3个地方对实例变量执行初始化:

      1) 定义实例变量时指定初始值

      2) 非静态初始化块中对实例变量指定初始值

      3) 构造器中对实例变量指定初始值

    这三中方式中,第一种和第二种比第三种更早执行

    代码:

     1 public class ObjTest {
     2     public static void main(String[] args) {
     3         Cat cat = new Cat("ketty", 2);
     4         System.out.println(cat);
     5         Cat c2 = new Cat("hello", 3);
     6         System.out.println(c2);
     7     }
     8 }
     9 
    10 class Cat {
    11     //定义name、age两个属性
    12     String name;
    13     int age;
    14     
    15     //使用构造器初始化name、age两个变量
    16     public Cat(String name,int age){
    17         System.out.println("执行构造器");
    18         this.name = name;
    19         this.age = age;
    20     }
    21     
    22     {
    23         System.out.println("执行非静态初始化块");
    24         weight = 2.0;
    25     }
    26     //定义时指定初始值
    27     double weight = 2.3;
    28 
    29     @Override
    30     public String toString() {
    31         return "Cat [name=" + name + ", age=" + age + ", weight=" + weight
    32                 + "]";
    33     }
    34 }

    输入结果:

    1 执行非静态初始化块
    2 执行构造器
    3 Cat [name=ketty, age=2, weight=2.3]
    4 执行非静态初始化块
    5 执行构造器
    6 Cat [name=hello, age=3, weight=2.3]

    1.3 类变量的初始化时机

    从程序运行的角度来看,JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。

    从语法角度来看,程序可以在2个地方对类变量执行初始化:

    1.定义类变量时指定初始值

    2.静态初始化块中对类变量指定初始值

    代码:

     1 public class StaticInitTest {
     2     //定义count类变量,定义时指定初始值
     3     static int count = 2;
     4     
     5     //通过静态初始化块为name类变量指定初始值
     6     static{
     7         System.out.println("StaticInitTest的静态初始化块");
     8         name = "Java编程";
     9     }
    10     
    11     static String name = "疯狂Java讲义";
    12     
    13     public static void main(String[] args) {
    14         //访问该类的两个类变量,
    15         System.out.println("count类变量的值" + StaticInitTest.count);
    16         System.out.println("name类变量的值" + StaticInitTest.name);
    17     }
    18 }

    输出:

    1 StaticInitTest的静态初始化块
    2 count类变量的值2
    3 name类变量的值疯狂Java讲义
  • 相关阅读:
    Java.util.concurrent包学习(一) BlockingQueue接口
    [转载]最牛B的编码套路
    思考人生
    非奇异矩阵的零度互补法则
    Hopfield 网络(下)
    Hopfield 网络(上)
    矩阵的相似性与对角化
    左右特征向量
    特征多项式、代数重数与几何重数
    特征值和特征向量
  • 原文地址:https://www.cnblogs.com/yujiwei/p/6901380.html
Copyright © 2011-2022 走看看