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的更多相关文章
随机推荐
- 更有效率的使用Visual Studio2
PS色调均化滤镜的快捷实现(C#源代码). photoshop色调均化功能通常是在进行修片处理前期比较常用的功能之一,其对扩展图像的对比度,增强视觉效果有一定的作用.在很多课本或者文章中,也称这种处理 ...
- vsftp FTP服务器 server settings , and add different users
建议阅读知识:http://linux.vbird.org/linux_basic/0210filepermission.php 这是关于档案权限,用户,组等的问题.介绍的很有意思. 1. Inst ...
- Qt中的串口编程之三
QtSerialPort 今天我们来介绍一下QtSerialPort模块的源代码,学习一下该可移植的串口编程库是怎么实现的. 首先,我们下载好了源代码之后,使用QtCreator打开整个工程,可以看到 ...
- 高反差保留滤镜学习OpenCV:滤镜系列(11)——高反差保留
这几周笔者几篇文章介绍了改高反差保留滤镜的文章. 关联文章的地址 高反差保留就是高通滤波 r=(pix[x,y]-avg(R))/128 pix[x,y]*r+128*(1-r) #include & ...
- is和as关键字
c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常 object o = new object(); if ( ...
- 【转】经典!python中使用xlrd、xlwt操作excel表格详解
最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...
- charles支持https抓包
前言 最近发现访问项目的网页偶尔会被插入广告,很有可能是运营商劫持流量插入进去的,我在家里使用的长城宽带打开非加密的网页,时不时会弹个广告窗,这个也算是中国特色了.因此计划项目上线https,抓包分析 ...
- cocos2d-x中DrawNode常见的图像绘制函数
//绘制矩形 ('起始点' , '目标点' , '填充颜色') auto rect=DrawNode::create(); rect->drawRect(Vec2(0,0),Vec2(100, ...
- 关于preg_match()函数的一点小说明
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $ ...
- (89C51)定时器计时1s
unsigned ; void initT1() { EA=; TH1=0xDC; TL1=0X00; TMOD=0x10; TR1=; ET1=; } { TH1=0xDC; TL1=0X00; c ...