类与对象动手动脑

一、“自找麻烦”

如果父类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块。

如果类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块给类的成员赋予初值。如果构造函数中存在this()则执行。

运行截图如上图。

如果程序中的一个字段,既用了直接初始化,也用了静态初始化器,还用了构造器,这三种方法初始化字段先后次序是:



1、静态的部分在classLoader加载类的时候就会执行,静态块中不能引用非静态的变量(因为这些变量要通过实例化类才能创建)。也不存在静态的成员变量,跟后面的两个初始化有质的不同(后两个是初始化成员变量)。


2、定义变量时直接赋的值。


3.构造函数
二、当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
例子:

class Old
{
 static{
  System.out.println("Old的静态初始化块");
 }
 {
  System.out.println("Old的普通初始化块");
 }
 public Old()
 {
  System.out.println("Old的无参数的构造器");
 }
}
class Young extends Old
{
 static{
  System.out.println("Young的静态初始化块");
 }
 {
  System.out.println("Young的普通初始化块");
 }
 public Young()
 {
  System.out.println("Young的无参数的构造器");
 }
 public Young(String msg)
 {
  //通过this调用同一类中重载的构造器
  this();
  System.out.println("Mid的带参数构造器,其参数值:" + msg);
 }
}
public class Test2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
    new Young();
 }

结果截图:

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

      静态方法中不能直接访问同一类中的非静态成员,而必须先创建对象,再通过对象访问成员。

  例子:public class Test3{
 int j =5;
 static int value; 
 public static void A()
 {  System.out.println(value); } 
 public int B()
 {  
  int x = 100;  
  return x; 
  }  
 public static void main(String args[]) {  
  Test3 a = new Test3(); 
  value = a.B(); 
  a.A(); 
  }} 

运行结果:100

四、使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?

class Number

{
     static int shu;

public Number()
{
   shu++; 
}
int GetShu()
{
   return shu; 
}
}
public class NumberObject {
 
    public static void main(String[] args) {

    Number n1=new Number();

    Number n2=new Number();
   
    Number n3=new Number();

    System.out.println("你已经创建了"+Number.shu+"个对象");

    }

}

 

posted @ 2015-10-17 19:59  卿语  阅读(144)  评论(0编辑  收藏  举报