类与对象
java是严格的面向对象的语言,所以里面所有功能的实现都是以类和对象的形式来实现的,类是方法和数据的集合,对象是类的实现(即类描述的对象)。在使用类的方法时,需要定义一个该类的对象来使用其方法(静态方法因为始终在内存内所以不需要定义对象来使用,但因此也不能类的非静态成员)。
在定义对象变量的过程中,实际上分为声明类的引用类型的一个变量(一个引用)、将一个“new”后的对象赋值给该对象变量(分配内存)这两个过程,所以显而易见我们常用的对象变量不是直接使用这个对象,所以会出现下面这种现象。ps:也因为这样可以将变量初始化为null。
运行上面的代码后发现这两个对象不等,因为“==”判断的是地址是否相同,new里两次就会有不同的地址。ps:如果变量是原始数据变量比较的就是数据大小。
动手动脑
问题显而易见,Foo类仅有个含有一个int参数,但在定义时是无参构造函数。
进行实验
尽管有初始化块,但却在成员变量初始化的上方,所以在第一个问号处输出结果为100;
由于使用了带有int参数的构造函数把300赋值给field,所以输出结果为300;
Java字段初始化规律:
1.类的构造方法优先,若无对成员变量赋值的操作就看有没有初始化块和定义时指定的默认值;
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(); } }
结果:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器
Java的初始化块、静态初始化块、构造函数的执行顺序:
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()); } }
只要加入个引用类型的参数就能实现对实例化的类的成员进行访问。
Integer的特性
很简单,这是自动装箱的规范要求。
规范要求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); } }