一:
这个类无法编译的原因是:提供了一个自定义的构造方法,导致系统不再提供默认构造方法。
二:
package Test; public class Test { public static void main(String[] args){ Foo obj1=new Foo(); Foo obj2=new Foo(); System.out.println(obj1==obj2); } } class Foo{ int value=100; }
理由:对象变量不能判断相等。
三:
package Chushihua; public class Chushihua { 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=200; } public int field=100; public InitializeBlockClass(int value) { this.field=value; } public InitializeBlockClass() {} }
类字段的初始化规律:1.执行类成员定义时指定的默认值或初始化块,到底执行哪一个要看哪一个排在前面。2:执行类的构造函数;
初始化第一次是用了类的初始化块,第二次用了public的int初始化,所以第二次覆盖了第一次,输出100;在main 函数InitializeBlockClass赋初值300,所以覆盖100,输出的是300;
四:
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。创建主类对象的时候,也把主类的父类初始化块执行了。
五:
package TestStaticInitializeBlock; 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(); } }
静态块在第一个对象创建时运行,初始化块在每一个对象创建时运行,区别是静态块只执行一次,操作的内存在静态区,初始化块每个对象构造时都需要执行一次,操作的内村在用户区。
六:
package Testa; public class Testa{ protected String alpha; public void dt() { System.out.println("abcd"); } public static void main(String[] args) { Testa t = new Testa(); t.dt(); } }
在外部调用静态方法时,可以使用“类名.方法名"的方式。也可以使用”对象名.方法名“的方式,而实例方法只有后面这种方式。如果静态方法中必须调用非静态方法。可以先new(实例),之后通过new实例化的引用调用此类的方法。