类的构造方法是当创建对象时,对象自动调用的对对象进行初始化的方法。他没有返回值,而且构造方法名与类名是相同的。如果类中没有定义构造方法,Java编译器在编译时会自动给它提供一个没有参数的默认构造方法,但这个构造方法并不会对对象有所更改。然而当类中以后一个以上的构造函数之后,系统将不会再自动提供没有参数的默认构造方法,所以在以上的代码中,因为创建Foo类的对象时调用的构造函数的参数列表与Foo类的构造方法的形参列表不匹配,所以编译器提示错误。

class Root

{

static{

System.out.println("Root的静态初始化块");

}

{

System.out.println("Root的普通初始化块");

}

public Root()

{

System.out.println("Root的无参数的构造器");

}

}

class Mid extends Root

{

static{

System.out.println("Mid的静态初始化块");

}

{

System.out.println("Mid的普通初始化块");

}

public Mid()

{

System.out.println("Mid的无参数的构造器");

}

public Mid(String msg)

{

//通过this调用同一类中重载的构造器

this();

System.out.println("Mid的带参数构造器,其参数值:" + msg);

}

}

class Leaf extends Mid

{

static{

System.out.println("Leaf的静态初始化块");

}

{

System.out.println("Leaf的普通初始化块");

}

public Leaf()

{

//通过super调用父类中有一个字符串参数的构造器

super("Java初始化顺序演示");

System.out.println("执行Leaf的构造器");

}

}

public class TestStaticInitializeBlock

{

public static void main(String[] args)

{

new Leaf();

}

}

执行结果:

Root的静态初始化块

Mid的静态初始化块

Leaf的静态初始化块

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:Java初始化顺序演示

Leaf的普通初始化块

执行Leaf的构造器

静态初始化模块的执行顺序:

1、  基类的静态初始化模块;

2、  子类的静态初始化模块;

3、  基类的普通初始化模块;

4、  基类的构造函数;

5、  子类的普通初始化模块;

6、  子类的构造函数;

Java字段初始化执行的规律

先看以下代码:

public class InitializeBlockDemo {

/**

* @param args

*/

public static void main(String[] args) {

InitializeBlockClass obj=new InitializeBlockClass();

System.out.println(obj.field);

obj=new InitializeBlockClass(300);

System.out.println(obj.field);

}

}

class InitializeBlockClass{

{

field=200;

}

public int field=100;

public InitializeBlockClass(int value){

this.field=value;

}

public InitializeBlockClass(){

}

}

这段代码执行的结果为:

100

300

在以上的测试中,InitializeBlockDemo类中的静态main方法中定义了一个InitializeBlockClass类的对象obj,然后调用了InitializeBlockClass类的默认构造方法初始化obj,接着输出obj的属性field。输出结果是100,是initializeBlockClass的field属性声明时的默认值,并非字段初始化默认值。然后调用initializeBlockClass的带参数的构造函数初始化obj,输出结果为参数值。由此可见,在java类的对象初始化过程中,如果初始化的时候调用了带参数的构造函数,那么类对象的属性值以参数为准。如果调用的类无参数构造方法,那么对象的属性值以默认的值为准;如果没有默认值,则以默认字段为准。

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

请看一下代码:

public class StaticTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(str);

StaticTest obj = new StaticTest();

System.out.println(obj.str);

}

private static String str = new String("没有访问非静态字段");

{

str = "访问了非静态字段";

}

}

由此可得出结论:在java类的静态方法中,若要访问该类的实例成员(即没有附加static关键字的字段或方法)需要实例化对象,用对象访问。

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

代码如下:

public class StaticTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

Static a = new Static();

Static b = new Static();

Static.showCount();

}

}

class Static{

private static int count = 0;

{

count++;

}

public static void showCount(){

System.out.println("一共生成了"+count+"个对象!");

}

}

输出结果为:

一共生成了2个对象!

TheFifthWeekText的更多相关文章

随机推荐

  1. Java网络请求getInputStream异常

    今天调试网络请求部分时,当getInputStream失败时直接抛出异常.解决方法时在getInputStream之前获取ResponseCode if( connection.getResponse ...

  2. map 类型

    map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...

  3. .Net 中的反射机制

    .Net 中的反射机制 概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标 ...

  4. struts2标签库使用小结

    之前的demo中用了一些struts2标签,用的是struts2.2.1.1. Struts2的标签常常和OGNL(图对象导航语言)一起使用.有几点总结如下: [引用请注明出处:http://blog ...

  5. 深入Java虚拟机:JVM中的Stack和Heap

    在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...

  6. samba安装与配置

    1.安装软件包rpm -q samba samba-common samba-client cifs-utilsyum -y install samba samba-common samba-clie ...

  7. [ios] Xcode使用设置相关-快捷键【转】

    快照:   command+control+s   编辑完了可以和之前的某个版本对比,通过File->Snapshots 调试时的快捷键也像大多数 IDE 靠拢了,采用了 F5.F6.F7 简单 ...

  8. Python3.5环境下安装wxPtyhon

    Win7系统下,Python3.5环境下安装wxPtyhon, 已成功安装并运行. 1.先从下面网站下载对应的whl版本. https://wxpython.org/Phoenix/snapshot- ...

  9. Java定时器Timer简述

    概述 主要用于Java线程里指定时间或周期运行任务.Timer是线程安全的,但不提供实时性(real-time)保证. 构造函数 Timer() 默认构造函数. Timer(boolean) 指定关联 ...

  10. jquery中动态新增的元素节点无法触发事件解决办法

    在使用jquery中动态新增的元素节点时会发现添加的事件是无法触发的,我们下面就为各位来详细的介绍此问题的解决办法. 比如做一个ajax读取留言列表的时候,每条留言后面有个回复按钮,class为“re ...