创建对象

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. Use gdb attach pid and debug it

  2. 基础——(4)SR Latch(SR锁存器)

    Digital logic gets really interesting when we connect the output of gates back to an input. The SR l ...

  3. NOI 2018 你的名字 (后缀自动机+线段树合并)

    题目大意:略 令$ION2017=S,ION2018=T$ 对$S$建$SAM$,每次都把$T$放进去跑,求出结尾是i的前缀串,能匹配上$S$的最长后缀长度为$f_{i}$ 由于$T$必须在$[l,r ...

  4. [USACO18JAN] Lifeguards S (线段树:扫描线面积)

    扫描线裸题没什么好说的 注意空间不要开小了!!! #include <cstdio> #include <cstring> #include <algorithm> ...

  5. Hive中的一种假NULL

    Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a       string Time taken ...

  6. Postgresql数据库的一些字符串操作函数

    今天做项目遇到客户反映了一个麻烦的事情,有一些数据存在,但就是在程序中搜索不出来,后来分析,发现问题为数据前面有几个空白字符,后来用SQL查询了一下,发现八九个数据表中,数千万条数据中有将近三百万条数 ...

  7. 决策树(Decision Trees)

    简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...

  8. pytorch 8 CNN 卷积神经网络

    # library # standard library import os # third-party library import torch import torch.nn as nn impo ...

  9. oracle用户锁定

    https://www.cnblogs.com/lostyue/archive/2011/12/06/2278063.html

  10. [Angular] Set Metadata in HTTP Headers with Angular HttpHeaders

    Besides sending (or requesting) the actual data to the server API, there’s also often the need to se ...