Java第三次上课课堂试验博文
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第三次上课课堂试验博文的更多相关文章
- Java第四次上课博文动手动脑
Java第四次上课博文动手动脑 1. 查看String.equals()方法 public class StringEquals { /** * @param args the command ...
- 《JAVA语言程序设计》上课笔记
教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一. 问几个问题 1. 你们到这里来干什么 ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- 理解java的三种代理模式
代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- Java程序设计 第16周 课堂实践
Java程序设计 第16周 课堂实践 -- 数据库2 课堂实践任务2 查询world数据库,获得人口超过500万的所有城市的列表. 代码分析 实现查询数据库需要我们修改Message.java,Mes ...
- 20155317 《Java程序设计》0510上课考试博客
20155317 <Java程序设计>0510上课考试博客 二.Arrays和String单元测试 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常, ...
随机推荐
- 【论文:麦克风阵列增强】Signal Enhancement Using Beamforming and Nonstationarity with Applications to Speech
作者:桂. 时间:2017-06-06 13:25:58 链接:http://www.cnblogs.com/xingshansi/p/6943833.html 论文原文:http://pan.bai ...
- 零基础开始学python
变量规则:在python中变量名不能有特殊字符和数字开头以及python里的一些关键字,可以使用下划线开头,在python里,变量是支持使用中文的,但尽量不要使用中文,为什么?因为这样会让你看起来太l ...
- 浅谈OpenStack架构
首先,先来了解,什么是OpenStack? OpenStack是一个云平台管理的项目,它不是一个软件.这个项目由几个主要的组件组合起来完成一些具体的工作.OpenStack是一个旨在为公共及私有云 ...
- (原创)用JAX-WS+Spring实现简单soap规范的webservice
转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html Soap即简单对象访问协议,也可理解为一种用于程序之间通讯的规范,它主要基于XML和htt ...
- Windows系统完全退出VMware方法
原始日期:2013-11-30 16:09 事件起因:本来机子上装的Vbox,装了个winXp系统,目的是将一些开发用地软件工具神马的安装在虚拟机,保证主机的流畅稳定.无奈,Vbox对主机与虚拟机的文 ...
- SQL检测开始日期 结束日期 是否存在交叉
检测开始日期 结束日期 是否存在交叉 "+tj+" and ((starttime>="+starttime+" and starttime<=&q ...
- 【Android Developers Training】 27. 序言:和其它应用交互
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Sublime text3插件安装方法
一.安装sublime text3插件的方法: 1.Ctrl+~键,调出console,将下面代码复制到底部命令行,回车: import urllib.request,os; pf = 'Packag ...
- android怎么输出信息到logcat
- Linux下BMP文件不能正常读取问题的解决办法
今天将之前在win下编好的读取BMP图像功能移植到UNIX下. 碰到的第一个问题是,Linux下的BMP文件头的结构体需要自己重新定义一遍. 第二个问题是,需要搞清楚Linux是32位的还是64位的. ...