TheFifthWeekText
类的构造方法是当创建对象时,对象自动调用的对对象进行初始化的方法。他没有返回值,而且构造方法名与类名是相同的。如果类中没有定义构造方法,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的更多相关文章
随机推荐
- Java网络请求getInputStream异常
今天调试网络请求部分时,当getInputStream失败时直接抛出异常.解决方法时在getInputStream之前获取ResponseCode if( connection.getResponse ...
- map 类型
map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...
- .Net 中的反射机制
.Net 中的反射机制 概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标 ...
- struts2标签库使用小结
之前的demo中用了一些struts2标签,用的是struts2.2.1.1. Struts2的标签常常和OGNL(图对象导航语言)一起使用.有几点总结如下: [引用请注明出处:http://blog ...
- 深入Java虚拟机:JVM中的Stack和Heap
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...
- samba安装与配置
1.安装软件包rpm -q samba samba-common samba-client cifs-utilsyum -y install samba samba-common samba-clie ...
- [ios] Xcode使用设置相关-快捷键【转】
快照: command+control+s 编辑完了可以和之前的某个版本对比,通过File->Snapshots 调试时的快捷键也像大多数 IDE 靠拢了,采用了 F5.F6.F7 简单 ...
- Python3.5环境下安装wxPtyhon
Win7系统下,Python3.5环境下安装wxPtyhon, 已成功安装并运行. 1.先从下面网站下载对应的whl版本. https://wxpython.org/Phoenix/snapshot- ...
- Java定时器Timer简述
概述 主要用于Java线程里指定时间或周期运行任务.Timer是线程安全的,但不提供实时性(real-time)保证. 构造函数 Timer() 默认构造函数. Timer(boolean) 指定关联 ...
- jquery中动态新增的元素节点无法触发事件解决办法
在使用jquery中动态新增的元素节点时会发现添加的事件是无法触发的,我们下面就为各位来详细的介绍此问题的解决办法. 比如做一个ajax读取留言列表的时候,每条留言后面有个回复按钮,class为“re ...