java创建对象时的执行顺序
2014-04-30 11:27
417 查看
先从一个例子入手
public class Test
{
private int i=getValue();//第2行
private int j = 10;
int getValue(){
return j;
}
public static void main(String[] args) {
System.out.print(new Test().i);//第9行
}
}
输出:
A 第二行编译错误
B 第九行编译错误
C 输出:10
D 输出:0
答案是D,输出结果为0.
当你执行System.out.print(new test().i);时,
首先执行new test()。
java虚拟机开始构建对象
首先为该对象分配一块内存空间
对该内存空间执行清零操作(就是因为这个清零操作,完成了对所有变量赋值0)
开始执行静态成员的初始化以及静态块的初始化----你这里没有就不用谈了
然后开始初始化成员变量,顺序执行
执行private int i=getValue();
调用getValue()方法
执行getValue方法返回0.---------请参照第2点
执行private int j = 10;
开始执行构造函数
因为你是在test的main函数执行的代码。main函数也是属于test类的。因此它是可以直接访问private变量i的。
因此输出结果为0。
---------------------------------------------------------------------------------------
public class Test1 {
public static void changeStr(String str) {
str = "welcome";
}
public static void main(String[] args) {
String str = "1234";
changeStr(str);
System.out.println(str);
}
}
输出的结果是1234。至于为什么,我想这个题目变成这样的话会更能说明问题
public class Test {
public static void changeStr(String str) {
str = "welcome";
System.out.println("str of changeStr():"+str);
}
public static void main(String[] args) {
String str = "1234";
changeStr(str);
System.out.println("str of main():"+str);
}
}
输出的结果是:str of changeStr():welcome ,str of main():1234。需要考虑的是局部变量的作用域。
如果传递的是类对象,如下:
public class A {
private int a;
********
get,set方法
}
public class B {
private int b;
********
get,set方法
}
public class Test {
public static void changeObj(A a,B b){
b.setB(a.getA());
}
public stataic void main(String [] args){
A obj1 = new A();
obj1.setA(1);
B obj2 = new B();
changeObj(a,b);
System.out.println(b.getB()); //此处输出是1.
}
}
传类对象传的是对象的引用,而基础类型是传值。
---------------------------------------------------------------------------------------------------------
public class Test {
static boolean foo(char c) {
System.out.print(c);
return true;
}
public static void main( String[] argv ) {
int i =0;
for ( foo('A'); foo('B')&&(i<2); foo('C')){
i++ ;
foo('D');
}
}
}
输出结果是 ABDCBDCB ,怎么样是不是跟想象的有点不一样
首先说名下for循环,for循环中包含 初始化(initialization)表达式,布尔表达式(Boolean-expression)和步进(step)运算,进行for循环时,首先是初始化,然后测试布尔表达式,若获得true,就会执行for语句后面的代码。每次循环结束,执行一次步进。注意,步进是留在最后做的
对于本题来说,for循环的过程如下:
执行foo("A"),输出A
测试布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断为true,继续执行for后面的语句,foo("D")被执行,输出 D
执行一次步进,foo("C")被执行,输出C
再次判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断结果仍未true,继续执行for后面的语句,foo("D")被执行,输出
D
再次执行步进,foo("C")被执行,输出C
继续判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2 判断为false,循环结束,后面语句不再执行
所以最终结果是:ABDCBDCB 。
此题可以深刻理解for循环的执行顺序。
for(i=0;i<2;i++){
System.out.print(i);
}
执行过程如下:
1. i=0
2. i<2
3. 输出i(值为0)
4. i++(此时i=1)
5. i<2(1<2满足条件,执行下面的语句)
6. 输出i(值为1)
7. i++(此时i=2)
8. i<2(条件不成立,其他语句都不执行)
public class Test
{
private int i=getValue();//第2行
private int j = 10;
int getValue(){
return j;
}
public static void main(String[] args) {
System.out.print(new Test().i);//第9行
}
}
输出:
A 第二行编译错误
B 第九行编译错误
C 输出:10
D 输出:0
答案是D,输出结果为0.
当你执行System.out.print(new test().i);时,
首先执行new test()。
java虚拟机开始构建对象
首先为该对象分配一块内存空间
对该内存空间执行清零操作(就是因为这个清零操作,完成了对所有变量赋值0)
开始执行静态成员的初始化以及静态块的初始化----你这里没有就不用谈了
然后开始初始化成员变量,顺序执行
执行private int i=getValue();
调用getValue()方法
执行getValue方法返回0.---------请参照第2点
执行private int j = 10;
开始执行构造函数
因为你是在test的main函数执行的代码。main函数也是属于test类的。因此它是可以直接访问private变量i的。
因此输出结果为0。
---------------------------------------------------------------------------------------
public class Test1 {
public static void changeStr(String str) {
str = "welcome";
}
public static void main(String[] args) {
String str = "1234";
changeStr(str);
System.out.println(str);
}
}
输出的结果是1234。至于为什么,我想这个题目变成这样的话会更能说明问题
public class Test {
public static void changeStr(String str) {
str = "welcome";
System.out.println("str of changeStr():"+str);
}
public static void main(String[] args) {
String str = "1234";
changeStr(str);
System.out.println("str of main():"+str);
}
}
输出的结果是:str of changeStr():welcome ,str of main():1234。需要考虑的是局部变量的作用域。
如果传递的是类对象,如下:
public class A {
private int a;
********
get,set方法
}
public class B {
private int b;
********
get,set方法
}
public class Test {
public static void changeObj(A a,B b){
b.setB(a.getA());
}
public stataic void main(String [] args){
A obj1 = new A();
obj1.setA(1);
B obj2 = new B();
changeObj(a,b);
System.out.println(b.getB()); //此处输出是1.
}
}
传类对象传的是对象的引用,而基础类型是传值。
---------------------------------------------------------------------------------------------------------
public class Test {
static boolean foo(char c) {
System.out.print(c);
return true;
}
public static void main( String[] argv ) {
int i =0;
for ( foo('A'); foo('B')&&(i<2); foo('C')){
i++ ;
foo('D');
}
}
}
输出结果是 ABDCBDCB ,怎么样是不是跟想象的有点不一样
首先说名下for循环,for循环中包含 初始化(initialization)表达式,布尔表达式(Boolean-expression)和步进(step)运算,进行for循环时,首先是初始化,然后测试布尔表达式,若获得true,就会执行for语句后面的代码。每次循环结束,执行一次步进。注意,步进是留在最后做的
对于本题来说,for循环的过程如下:
执行foo("A"),输出A
测试布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断为true,继续执行for后面的语句,foo("D")被执行,输出 D
执行一次步进,foo("C")被执行,输出C
再次判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断结果仍未true,继续执行for后面的语句,foo("D")被执行,输出
D
再次执行步进,foo("C")被执行,输出C
继续判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2 判断为false,循环结束,后面语句不再执行
所以最终结果是:ABDCBDCB 。
此题可以深刻理解for循环的执行顺序。
for(i=0;i<2;i++){
System.out.print(i);
}
执行过程如下:
1. i=0
2. i<2
3. 输出i(值为0)
4. i++(此时i=1)
5. i<2(1<2满足条件,执行下面的语句)
6. 输出i(值为1)
7. i++(此时i=2)
8. i<2(条件不成立,其他语句都不执行)
相关文章推荐
- Java中创建对象时代码执行顺序
- java创建对象时代码执行顺序探讨
- Java中创建对象时,初始化成员变量的代码的执行顺序
- java 对象创建时执行顺序
- java在创建对象时候 成员的执行顺序
- JAVA对象创建执行顺序实验
- 10、创建java对象各部分的执行顺序
- Java中创建对象的时候代码执行顺序
- 求学Android——3.创建对象代码执行顺序
- 创建累的对象时成员的执行顺序
- Java中包含继承关系时对象的创建与销毁顺序详解(附源码)
- java类的初始化和对象的创建顺序
- 创建一个类的对象时,程序的执行顺序(C#)
- Java对象创建阶段的代码调用顺序
- Java继承:子类和父类创建对象的顺序问题。
- java类的初始化块/执行顺序,实例化对象数据赋值
- java中程序的执行的原理如怎么创建空间,创建对象等
- 《Thinking in Java》——静态、非静态成员变量、子句的初始化顺序(含继承)及对象创建过程
- java中在创建对象时候的初始化顺序
- java对象创建过程/初始化顺序