class C
{
C()
{
System.out.print("C");
}
}class A
{
C c = new C();//这里print a string "C" why????
A()
{
this("A");
System.out.print("A");
} A(String s)
{
System.out.print(s);
}
}class sadf extends A
{ sadf()
{
super("B");
System.out.print("B");
} public static void main(String[] args)
{
new sadf();
}}
打印结果是CBB, 为什么会打印C;
class A
{
C c = new C();//这里print a string "C" why????而下面的一个却不打印class C
{
C()
{
System.out.print("C");
}
}public class NewClass {
C dd = new C(); //不打印出 C 来;
//但是将这句改为 static C dd = new C(); 会打印出 C 来。
//为什么呀?
public static void main(String args[]){ }
} 我知道static是一个类成员,可以在 构造器运行之前运行,
我就是不知道什么时候像上面的会执行。什么时候不会执行? 可以帮我举一些例子说明一下吗? 谢谢!!!!!!!!!!!
{
C()
{
System.out.print("C");
}
}class A
{
C c = new C();//这里print a string "C" why????
A()
{
this("A");
System.out.print("A");
} A(String s)
{
System.out.print(s);
}
}class sadf extends A
{ sadf()
{
super("B");
System.out.print("B");
} public static void main(String[] args)
{
new sadf();
}}
打印结果是CBB, 为什么会打印C;
class A
{
C c = new C();//这里print a string "C" why????而下面的一个却不打印class C
{
C()
{
System.out.print("C");
}
}public class NewClass {
C dd = new C(); //不打印出 C 来;
//但是将这句改为 static C dd = new C(); 会打印出 C 来。
//为什么呀?
public static void main(String args[]){ }
} 我知道static是一个类成员,可以在 构造器运行之前运行,
我就是不知道什么时候像上面的会执行。什么时候不会执行? 可以帮我举一些例子说明一下吗? 谢谢!!!!!!!!!!!
但后面那个问题我没明白,你能把第二个程序写的和第一个那样详细点吗,我好看清楚点。
new一个子类就会先new一个父类,还一个类的创建的顺序是先给成员属性赋值,再执行构造函数而如果有static关键字的地方则是在类加载时进行初始化
{
C(){
System.out.print("C");
}
}public class NewClass {
C dd = new C(); //不打印出 C 来;
//但是将这句改为 static C dd = new C(); 会打印出 C 来。
//为什么呀?
public static void main(String args[]){ }
}
谢谢, 但还是不能明白.
NewClass aa = new NewClass();加这句话进去后 ,会有输出,是不是因为上面说的
}
一个类的创建的顺序是先给成员属性赋值,再执行构造函数呀
这是因为类加载时会首先初始化static部分,你运行时是执行了 java NewClass 这个命令,加载了NewClass这个类,加载时会先执行static部分的代码,所以会打印出C来
你可以试验一下,任意写一个类,加上表态初始化块,运行时就会执行
public class NewClass {
static {
System.out.println("1");
}
public static void main(String args[]){ }
}
请求类的时候,static的成员初始化执行,然后是static{}块执行。
调用构造函数的时候,因为先引用了类,所以先进行静态部分的初始化,然后进行下面步骤:
非静态成员初始化执行,然后是构造函数执行。在类中声明非静态成员变量C dd = new C(),这里的new操作在调用构造函数的时候、构造函数执行体调用之前执行。也就是说,你需要调用new NewClass()(在这里是默认构造函数,因为你没有声明构造函数:-|),才能对这个dd进行初始化——如果没有new C(),初始化为null;有了new C(),初始化为C()。最后才是对NewClass()的调用。啰唆了一点,明白了没有?关键是初始化顺序。