java的一个问题
class Mug {
Mug(int marker) {
System.out.println("Mug(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
public class Mugs {
Mug c1;
Mug c2;
{
c1 = new Mug(1);
c2 = new Mug(2);
System.out.println("c1 & c2 initialized");
}
Mugs() {
System.out.println("Mugs()");
}
public static void main(String[] args) {
System.out.println("Inside main()");
Mugs x = new Mugs();
}
}
为什么输出顺序为
Inside main()
Mug(1)
Mug(2)
c1&c@ initialized
Mugs()
我自己想的与运行的不一样啊!
[解决办法]
程序先从main()函数开始执行,所以要加载Mugs.class,静态初始化在此进行,故先输出Inside main()。
然后是初始化基本类型和引用。
{ c1 = new Mug(1);
c2 = new Mug(2);
System.out.println("c1 & c2 initialized");
}
是一个静态初始化块。
最后执行构造器。
thinking in java 第四章有介绍,可以参考一下。
[解决办法]
顺序是从main()进去,输出Inside main(),如果有静态块必须先执行,没有执行方法外的程序块,执行Mug c1; Mug c2; ->再执行c1 = new Mug(1); 构造输出Mug(1) ,->c2 = new Mug(2);构造输出Mug(2) ,再执行 System.out.println("c1 & c2 initialized"); 最后自己的
构造函数.因为上面的类除了方法就是构造函数,没有其他的东西.
[解决办法]
程序从main函数开始执行,
System.out.println("Inside main()"); --> Inside main() //1
Mugs x = new Mugs(); //这一句有的麻烦.
1、类只有在使用New调用创建的时候才会被JAVA类装载器装入,不要认为在这句之前内存中已经有了Mugs类了.
2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的.
静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
有了这个初始化顺序,应该就能推出这样的结果了.你可以添加一个静态的代码块看看效果.在代码块前加static关键字就是静态代码块.
[解决办法]
to zcyjava
程序先从main()函数开始执行,所以要加载Mugs.class,静态初始化在此进行,故先输出Inside main()。 然后是初始化基本类型和引用。 { c1 = new Mug(1); c2 = new Mug(2); System.out.println("c1 & c2 initialized"); } 是一个静态初始化块。 最后执行构造器。 thinking in java 第四章有介绍,可以参考一下。
[解决办法]
这里有点不懂,难道用大括号括来就是静态代码块吗?
[解决办法]
不好意思,之前我的回答有点问题.
1、类只有在使用New调用创建的时候才会被JAVA类装载器装入,不要认为在这句之前内存中已经有了Mugs类了.
启动类(含main方法的类),在命令行中执行命令 :java Mugs 时就加载了.这句话只针对非启动类而言.
[解决办法]
大家研究一下类的初始化顺序,修改后的代码.
class Mug { Mug(int marker) { System.out.println("Mug(" + marker + ")"); } void f(int marker) { System.out.println("f(" + marker + ")"); } } class Mugs { public static void main(String[] args) { System.out.println("Inside main()"); Mugs x = new Mugs(); } Mugs() { System.out.println("Mugs()"); } { c1 = new Mug(3); c2 = new Mug(4); c3 = new Mug(5); System.out.println("c1 & c2 initialized"); } Mug c1 = new Mug(1); Mug c2 = new Mug(2); Mug c3 = new Mug(6); static{System.out.println("Outside main()");} static Mug c0=new Mug(0);}
[解决办法]
程序先从main()函数开始执行,然后按照自顶向下的程序输出规则,故会得到如此输出顺序
[解决办法]
请问
class Mug {
Mug(int marker) {
System.out.println("Mug(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
public class Mugs {
Mug c1;
Mug c2;
{
c1 = new Mug(1);
c2 = new Mug(2);
System.out.println("c1 & c2 initialized");
} [color=#FF0000][/color]
Mugs() {
System.out.println("Mugs()");
}
public static void main(String[] args) {
System.out.println("Inside main()");
Mugs x = new Mugs();
}
}
和
class Mug {
Mug(int marker) {
System.out.println("Mug(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Mugs {
public static void main(String[] args) {
System.out.println("Inside main()");
Mugs x = new Mugs();
}
Mugs() {
System.out.println("Mugs()");
}
{
c1 = new Mug(3);
c2 = new Mug(4);
c3 = new Mug(5);
System.out.println("c1 & c2 initialized");
}
Mug c1 = new Mug(1);
Mug c2 = new Mug(2);
Mug c3 = new Mug(6);
static{System.out.println("Outside main()");}
static Mug c0=new Mug(0);
}
中的红色部分和匿名的inner class的区别是什么? 谢谢指教
[解决办法]
程序的执行顺序:程序块,父类函数,子类函数
[解决办法]
补楼上的:
程序执行顺序:如果在main()中new调用创建,先执行main class父类函数初始化部分 ,再执行父类函数构造函数,其次main class初始化部分,最后是main class构造函数.
[解决办法]
代码块分为静态代码块和非静态代码块,静态代码块通常用来初始化类,非静态代码块通常用来初始化实例.
匿名内置类是用来临时覆盖已存在类的成员变量或者方法的.
[解决办法]
有什么不对的?你原来认为是怎么个顺序?
[解决办法]
我觉得,jvm在加载类时候,首先执行main函数,相信大家都知道这个
然后调用静态初始化块,如果你new 了一个对象,调用对应类的构造方法,默认是无参的
所以,就是你这样的结果了!
[解决办法]
首先static块-》main函数 -》实列块-》构造函数
[解决办法]
这个你得看书,不是靠想出来的
[解决办法]
2楼正解!
[解决办法]
楼主,感情我的代码你都没有运行一下?心里哇哇的凉啊!
2楼说的也不是完全正确,最起码那是个动态的代码块,不是静态的!
[解决办法]
执行顺序:
1.类的静态代码块
2.main函数
3.非静态代码块
4.构造
public class Person { { System.out.println("This is code block1."); } static{ System.out.println("This is static code block1"); } public Person() { System.out.println("This is struct method."); } public static void main(String[] args){ System.out.println("This is main method."); Person p1=new Person(); Person p2=new Person(); }}
[解决办法]
{
c1 = new Mug(1);
c2 = new Mug(2);
System.out.println("c1 & c2 initialized");
}
请问这个没有什么名字只有括号的函数是什么啊?
谁能给我详细讲解一下。