java是严格的面向对象的语言,因此里面全部功能的实现都是以类和对象的形式来实现的,类是方法和数据的集合,对象是类的实现(即类描述的对象)。在使用类的方法时,须要定义一个该类的对象来使用其方法(静态方法由于始终在内存内因此不须要定义对象来使用,但所以也不能类的非静态成员)。java
在定义对象变量的过程当中,实际上分为声明类的引用类型的一个变量(一个引用)、将一个“new”后的对象赋值给该对象变量(分配内存)这两个过程,因此显而易见咱们经常使用的对象变量不是直接使用这个对象,因此会出现下面这种现象。ps:也由于这样能够将变量初始化为null。函数
运行上面的代码后发现这两个对象不等,由于“==”判断的是地址是否相同,new里两次就会有不一样的地址。ps:若是变量是原始数据变量比较的就是数据大小。this
问题显而易见,Foo类仅有个含有一个int参数,但在定义时是无参构造函数。spa
尽管有初始化块,但却在成员变量初始化的上方,因此在第一个问号处输出结果为100;code
因为使用了带有int参数的构造函数把300赋值给field,因此输出结果为300;对象
1.类的构造方法优先,若无对成员变量赋值的操做就看有没有初始化块和定义时指定的默认值;blog
2.初始化块和定义时指定的默认值优先为排在“下方”的为最终结果;内存
3.都无,就为null(尽可能不要产生这种结果)。字符串
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(); } }
结果:get
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器
1.静态优先,由于是编译器在最开始就建立在内存中;
2.超类的初始化块优先,很正常,由于定义子类的时候就得定义超类;
3.其次为构造器,同上;
public class Test { public int a = 0; private int b = 1; static void test(Test a) { a.a = 2; a.setB(3); } public int getB() { return b; } public void setB(int b) { this.b = b; } public static void main(String[] args) { Test a=new Test(); System.out.println("a="+a.a); System.out.println("b="+a.getB()); Test.test(a); System.out.println("a="+a.a); System.out.println("b="+a.getB()); } }
只要加入个引用类型的参数就能实现对实例化的类的成员进行访问。
很简单,这是自动装箱的规范要求。
规范要求boolean、byte、char小于等于127,介于-128~127之间的short和int被包装到固定对象中,因此“==”才会判等。
public class Test { static int number = 0; public Test() { number++; } public static void main(String[] args) { Test a; while (Test.number <= 5) { a = new Test(); } System.out.println(Test.number); } }