1.Java字段初始化的规律:

运行如下所示的代码

package demo;

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字段的初始值

//public int field=100;

{

field=200;

}

public int field=100;

public InitializeBlockClass(int value){

this.field=value;

}

public InitializeBlockClass(){

}

}

注意这是Java字段是放在public int field=100;

之前的。

运行结果截图

如果把Java字段初始化和public int field=100;

调换一下位置的话,其原代码如下:

package demo;

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字段的初始值

//public int field=100;

public int field=100;

{

field=200;

}

public InitializeBlockClass(int value){

this.field=value;

}

public InitializeBlockClass(){

}

}

运行结果如图

因此Java字段初始化的规律是按顺序进行,即字段初始化和局部变量初始化哪个靠后就以哪个为准。

2.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。静态方法可以继承,而且可以在子类中覆盖!静态块不能继承。以下是源代码:

package demo;

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();

}

}

程序运行截图

通过以上实验我们可以知道,父类的初始化快会随着子类对象的创建而被调用。父类的构造函数也会随着子类对象的创建而被调用。调用的顺序为,先调用静态初始化块,再调用初始化块,最后调用构造函数。在调用这三块的时候,又是按照先调用父类的再调用子类的顺序来完成的。

3.静态方法访问非静态变量:

程序源代码:

//建立一个类验证静态方法如何访问非静态变量

//王宏伟,2015,10,16

package test;

public class TestStaticWay

{

public static void main(String args[])

{

Second s = new Second();

s.show();

}

}

class Second

{

int a;

static void show()

{

Second m = new Second();

System.out.println(m.a);

}

}

程序运行截图

在Java的语法里面,静态的方法是不能直接访问非静态的成员变量的,要想访问非静态的成员变量,只能是在方法体里面创建一个对象实例,即使用new关键字来创建一个对象实例,通过这个对象实例来完成对非静态成员变量的访问。

4.神奇代码:

5种整形的包装类Byte,Short,Integer,Long,Character的对象,在值小于127时可以使用常量池。

源代码及其注释:

package test;

public class StrangeCode

{

public static void main(String[] args)

{

Integer i1=100;

Integer j1=100;

//从常量池当中取数字,是对常量池当中的同一个对象进行操作。所以比较结果为true

System.out.println(i1==j1);

Integer i2=128;

Integer j2=128;

//在堆空间里面创建了两个不同的对象,他们的地址不同,输出的结果为false

System.out.println(i2==j2);

}

}

5.创建一个类,能够随时显示这个类当前的对象的个数

源代码:

//创建一个类,能够随时显示该类的对象的个数

//王宏伟,2015,10,16

package test;

public class TestCreateNum

{

static int num = 0;

public TestCreateNum()

{

num++;

System.out.println("当前该类的对象的个数为" + num + "个");

}

public static void main(String args[])

{

TestCreateNum t = new TestCreateNum();

}

}

程序运行结果截图

程序设计思想:

在类体里面创建一个静态常量num,用来记录对象的个数,初始值为0,然后在写一个构造函数,构造函数的语句为输出对象的个数和num++。构造函数是随着对象的创建而自动调用的,所以每创建一个对象就能显示出当前对象的个数。

Java第三次上课课堂试验博文的更多相关文章

  1. Java第四次上课博文动手动脑

    Java第四次上课博文动手动脑 1.    查看String.equals()方法 public class StringEquals { /** * @param args the command ...

  2. 《JAVA语言程序设计》上课笔记

    教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一.        问几个问题 1.             你们到这里来干什么 ...

  3. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  4. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  5. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  6. 理解java的三种代理模式

    代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...

  7. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  8. Java程序设计 第16周 课堂实践

    Java程序设计 第16周 课堂实践 -- 数据库2 课堂实践任务2 查询world数据库,获得人口超过500万的所有城市的列表. 代码分析 实现查询数据库需要我们修改Message.java,Mes ...

  9. 20155317 《Java程序设计》0510上课考试博客

    20155317 <Java程序设计>0510上课考试博客 二.Arrays和String单元测试 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常, ...

随机推荐

  1. 掌握Chrome Developer Tools:下一阶段前端开发技术

    Tips 原文作者:Ben Edelstein 原文地址:Mastering Chrome Developer Tools: Next Level Front-End Development Tech ...

  2. Angular JS从入门基础 mvc三层架构 常用指令

    Angular JS从入门基础  mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心 ...

  3. [转] (CQRS)命令和查询责任分离架构模式(一) 之 什么是CQRS

    什么是CQRS? 这个问题网上可以找到很多资料,未接触过的童鞋请先查看Udi Dahan, Grey Young, Rinat Abdullin,园子里dax.net,以及Jdon社区上的相关文章. ...

  4. ThinkPHP 前台视图实现类似于Yii的自动验证

    ThinkPHP model类其实自带这个功能 可以写一个基础类继承Model 模型层代码: <?php namespace Manager\Model; use Think\Model; cl ...

  5. Linq用法笔记

    一.什么是Linq? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...

  6. Java虚拟机15:再谈四种引用状态

    JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...

  7. 【Android Developers Training】 8. 定义Action Bar风格

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 69. 视图切换的淡入淡出效果

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 如何使用apktool反编译,查看androidmanifest的内容

    1.下载apktool http://pan.baidu.com/s/1o7Jy090 2.使用方法

  10. RabbitMQ系列教程之五:主题(Topic)

    (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词.   在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚拟广播的[Fanout]交换机,而是使用了[D ...