Java理论学时第三节。课后作业。

时间:2023-03-09 18:49:46
Java理论学时第三节。课后作业。

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

  运行结果。Java理论学时第三节。课后作业。

  根据我的总结,它们三个的优先级是:构造方法 > 字段初始值 > 初始化块。

当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

public class InitializeBlockDemo

{

  /**

  * @param args

  */

  public static void main(String[] args)

  {

    InitializeBlockClassSon obj=new InitializeBlockClassSon();

    System.out.println(obj.field);

    obj=new InitializeBlockClassSon(300);

    System.out.println(obj.field);

  }

}

class InitializeBlockClass

{

  {

   field = 200;

  }

  public int field;

  public InitializeBlockClass(int value)

  {

    this.field = value;

  }

  public InitializeBlockClass()

  {

  }

}

class InitializeBlockClassSon extends InitializeBlockClass

{

  public int field1 = 1000;

  public InitializeBlockClassSon(int value)

  {

    this.field1 = value;

  }

  public InitializeBlockClassSon()

  {

  }

}

  运行结果。Java理论学时第三节。课后作业。

  由结果可知,定义的子类不管对其赋不赋值,得到的结果都是父类初始化块的值(前提是父类中没有字段初始值)。

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员

class StaticDemo

{

  static int x = 1;

  int y = 2;

  static public void display(int flag)

  {

  System.out.println(x + flag);

  }

  public int getY()

  {

  return y;

  }

}

public class ShowStatic

{

  public static void main(String[] args)

  {

  StaticDemo a = new StaticDemo();

  int flag = a.getY();

  StaticDemo.display(flag);

  }

}

因为静态方法在对象初始化的时候就已经被调用,所以直接访问实例变量的时候实例变量还不存在而发生错误。避免的方法是在main函数中定义一个局部变量获取实例变量的值,然后在静态方法中调用局部变量。

但这只做到了如何在静态方法中访问类的实例成员数据,而不是如何在静态方法中访问类的实例成员。

 请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?。

class Student

{

  static int number = 0;

  String name;

  public Student()

  {

    number++;

  }

  public Student(String n)

  {

    name = n;

    number++;

  }

  public void showNumber()

  {

    System.out.println("你已经创建了" + number + "对象。");

  }

}

public class ShowNumber

{

  public static void main(String[] args)

  {

    Student a = new Student("ycx");

    a.showNumber();

  }

}