创建对象

package 创建对象的个数;

public class main {
public static void main(String[] agrs){
Check c1=new Check();
Check c2=new Check();
Check c3=new Check();
System.out.println("你已创建了"+c1.a+"个对象");
}

}
class Check{
static int a=0;
//{
// a=a+1;
//}
public Check(){
a=a+1;
}
}

一,验证的代码

1,变量判等

运行结果为:false

当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等;当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

2,初始化块,构造方法和字段的初始值哪一个说了算?

运行结果为:

100

300

总结:若是有参的构造方法,则输出带参数的值;若是无参的构造方法,则输出的值与初始化块和字段的额初始值的顺序有关;类的初始化块不接收任何的参数,而且只要创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

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

可以在静态方法中添加类的对象的参数,在静态初始化块中创建类的对象,通过对象来访问实例数据。

代码如下:

public class text2{

public static void main(String[] args){

Foo obj1=new Foo();

obj1.Foo1(obj1);

}

}

class Foo{

int field=100;

public static void Foo1(Foo f){

System.out.println("静态方法访问的实例数据为:"+f.field);;

}

static{

Foo f1=new Foo();

System.out.println("静态初始化块访问的实例数据为:"+f1.field);

}

public Foo(){

}

}

运行结果

静态初始化块访问的实例数据为:100

静态方法访问的实例数据为:100

4,装箱和拆箱

代码和运行结果

用javap反编译class文件

由图可知,装箱时调用Integer类的valueOf(int)方法,拆箱时调用的是Integer类的intValue()方法,装箱是将基本数据类型转换为包装器类型,拆箱是将包装器类型转换为基本数据类型。

5,两对完全相同的整数,为何一个输出true,一个输出false?

代码及运行结果

Javap反编译class

由图可知,它调用了Integer类的valueOf()方法,通过JDK源码可以看出,在通过valueOf()方法创建Integer对象的时候,如果数值在【-128,127】之间便返回指向已经存在的对象的引用,for则创建一个新的Integer对象,因为i1和j1的值为100,所以会直接从擦车中取已经存在的对象,所以i1和j1指向的是同一个对象,为i2和j2指向的是不同的对象。

6,创建对象的个数计算

package 创建对象的个数;

public class main {

public static void main(String[] agrs){

Check c1=new Check();

Check c2=new Check();

Check c3=new Check();

System.out.println("你已创建了"+c1.a+"个对象");

}

}

class Check{

static int a=0;

//{

// a=a+1;

//}

public Check(){

a=a+1;

}

}

二,动手动脑

1,以下代码为何无法通过编译?哪出错了?

public class text2{

public static void main(String[] args){

Foo obj1=new Foo();

}

}

class Foo{

int value;

public Foo(int initValue){

value=initValue;

}

}

因为用户自己定义了一个构造方法,所以系统不再提供默认的构造方法,所以类Foo中没有无参的构造方法,而新建立的对象没有参数。

2,运行程序观察结果,总结“静态初始化块的执行顺序”

运行结果如下:

Root的静态初始化块

Mid的静态初始化块

Leaf的静态初始化块

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

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

Leaf的普通初始化块

执行Leaf的构造器

总结:

静态初始化块只在创建对象时执行一次;创建子类型的对象时,也会导致父类型的静态初始化块的执行;类的静态初始化块从父类开始先执行,然后执行子类的普通初始化块和构造方法。

java 对象 拆箱装箱 编译和反编译的验证的更多相关文章

  1. Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析

    都0202 了 java 1.8 已经是主流 自动装箱 .拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢? 我们先来看一段代码: public class TestWraperClass { pub ...

  2. 关于Java自动拆箱装箱中的缓存问题

    package cn.zhang.test; /** * 测试自动装箱拆箱 * 自动装箱:基本类型自动转为包装类对象 * 自动拆箱:包装类对象自动转化为基本数据类型 * * * /*缓存问题*/ /* ...

  3. JAVA中拆箱和装箱

    浅谈JAVA中拆箱与装箱 一.  什么是装箱?什么是拆箱? 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10) ...

  4. Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱 1.Character和char 的区别: Character是类,char基本数据类型. 在java中有三个类负责对字符的操作 ...

  5. WPF中多线程统计拆箱装箱和泛型的运行效率

    WPF中多线程统计拆箱装箱和泛型的执行效率.使用的知识点有泛型.多线程.托付.从样例中能够看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class=&quo ...

  6. Java代码的编译与反编译那些事儿

    原文:Java代码的编译与反编译那些事儿 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language) ...

  7. Java| 编译和反编译

    原文链接: http://www.yveshe.com/articles/2018/05/01/1525172129089.html 什么是编程语言? 在介绍编译和反编译之前,我们先来简单介绍下编程语 ...

  8. java 反编译 android 反编译

    1. jad http://varaneckas.com/jad/jad158e.linux.intel.zip  下载jad, 给jad运行权限 ,运行 chmod a+x ./jad ./jad ...

  9. 什么是Java代码的编译与反编译?(转)

    转自:http://java.tedu.cn/ask/203119.html Java代码的编译与反编译 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目 ...

随机推荐

  1. getattibute 与 getparameter区别

    1.getAttribute是取得jsp中 用setAttribute设定的attribute 2.parameter得到的是string:attribute得到的是object  3.request ...

  2. 记一次mybatis<if>标签的问题

    前言 到底还是没理解清楚的锅~~~~搞了好久...啊啊啊啊 错误: There is no getter for property named 'name' in 'class java.lang.L ...

  3. Java之秒杀活动解决方案

    0 引言 本文主要描述,服务端做相关秒杀活动的时候,对应的解决方案,即高并发下的数据安全. 1 优化方案 1.1 乐观锁思路 Redis中的watch,请求时,通过Redis查询当前抢购数据,如果当前 ...

  4. vertical-align到底是个啥

    https://developer.mozilla.org/en-US/docs/Web/CSS/vertical-align http://phrogz.net/css/vertical-align ...

  5. 如何让select中的滚动条自动定位到框中选中项的位置

    document.getElementById("hidScrollTop").value = document.getElementById("slcYZYongFa& ...

  6. hdu5791 TWO

    hdu5791 TWO 题意 给你两个数串 问你两个数串有多少子串一致 子串不一定是连续的 解法 我们设 \(dp[i][j]\) 表示A串匹配到 i 位,B串匹配到 j 位,一致的子串数.那么我们有 ...

  7. [转载] C 陷阱与缺陷( C traps and Pitfalls )

    本文转自 https://www.xuebuyuan.com/1951579.html 自己找工作过程中复习过的书包括<C traps and Pitfalls>,<编程珠玑> ...

  8. 首页 > 所有书 > 操作系统 > Linux >

    http://book.51cto.com/col/1213/list_1213_8.htm linux一些经典教材

  9. python_字符串常用操作

    name = "monicao"name.capitalize() #首字母大写print(name.capitalize()) print(name.count("o& ...

  10. Virtual Box 新建一个虚拟机安装系统(补充:WIN7 64 bit 系统虚拟机无法安装 64 bit 系统问题)

    1.安装Virtual Box好后,点击新建 2.配置内存大小,这个根据自己需要配置就好 3.创建虚拟硬盘 这里选择固定分配.动态分配都可以,接下来就分配硬盘大小了 4.新建好后我们点击刚才建立的虚拟 ...