一:
程序无法运行,因为类提供了一个自定义的构造方法,导致系统不再提供默认构造方法。
二.
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; }
对象变量不能判断相等。
三.
public class Text { public static void main(String[] args) { // TODO 自动生成的方法存根 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() {} }
初始化第一次是用了类的初始化块,第二次用了public的int初始化,所以第二次覆盖了第一次,输出了100; 在main函数中给类InitializeBlockClass赋初值300,所以覆盖100,输出300;所以类的初始化有类的初始化块,还可以直接在类中赋值,还可以用一个函数为类的属性赋值,还可以构造函数。
四.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。创建主类对象的时候,也把主类的父类初始化块执行了。
五.
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(); } }
静态块在第一个对象创建时运行,初始化块在每个对象创建时运行,区别是静态块只执行一次,操作的内存在静态区,初始化块每个对象构造时都需要执行一次,操作的内存在用户区.
六.
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实例化的引用调用此类的方法。