10.17动手动脑

1.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

程序源代码

package zihao;

class InitalizeBlockClass 
{
    {
        field=200;
    }
    public int field =100;
    public InitalizeBlockClass(int value)
    {
        this.field=value;
    }
    public InitalizeBlockClass() {
        
    }
    public static void main(String[] args)
    {
        InitalizeBlockClass obj=new InitalizeBlockClass();
        System.out.println(obj.field);
        obj=new InitalizeBlockClass (300);
        System.out.println(obj.field);
    }
}

程序执行结果

分析:

在Java编程中,字段的初始化顺序是

  1. 类加载时直接初始化静态字段;

  2. 类加载时调用静态方法初始化静态字段;

  3. 实例化对象时,在调用构造函数之前代码块中初始化字段;

  4. 实例化对象时,在调用构造函数之时初始化字段;

执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个排在前面

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”

2.

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

java类的成员变量有俩种:  一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为实例变量  类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。  而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

源程序代码

package boke;

public class Jingshili 
{
    static int i;、
int b=3;
public static void main(String args[]) { System.out.println(i); int i=1; System.out.println(i); //创建一个实例 Jingshili a=new Jingshili(); System.out.println(a.b); } }

程序执行结果截图

 

System.out.println(i);创建一个实例之后,可以通过一个实例来访问实例变量
posted @ 2017-10-20 14:41  tomhaha  阅读(129)  评论(0编辑  收藏  举报