注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

程序员小站

J2EE丨Spring | JVM | Scala

 
 
 

日志

 
 

java构造器的具体作用  

2012-01-31 22:41:35|  分类: java技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
首先一点是必须要明确的:java构造器不是用来创建对象的!
Car car = new Car();
基础过关的同学应该知道,第一个Car是变量car的声明时的类型,new 后面的Car是创建的具体对象。
我们还知道,子类创建时会调用父类的构造器(默认为无参构造器)。

class Animal{

public Animal(){
System.out.println("Animal 无参构造器");
}
public Animal(String name){
this();
System.out.println("Animal 无参构造器 name = "+name);
}
}
class Dog extends Animal{
public Dog(){
System.out.println("Dog 无参构造器");
}
public Dog(String name){
super(name);
System.out.println("Car 无参构造器 name = "+name);
}
}

public class ExtendsTest {
public static void main(String[] args) {
new Dog();
System.out.println("-----------");
new Dog("feng");
}
}


基础好的同学也应该会知道:创建子类时,父类的变量不会被覆盖

class Base2{
int count = 2;
}
class Dervied2 extends Base2{
int count = 3;
}

public class FiledAndMethodTest {
public static void main(String[] args) {
Base2 test = new Dervied2();
System.out.println(test.count); //2
Dervied2 test2 = new Dervied2();
System.out.println(test2.count); //3
Base2 test3 = test2;
System.out.println(test3.count); //2
//直接访问变量为声明时类型,方法为运行时类型。
}
}



于是就有了一个疑问:创建子类的时候父类会一同创建吗?
答案是不会,构造器只负责实例变量的赋值操作!

public class JavaToolTest {
int count = 12;
static int age = 10;
static String name ;
{
count = 20;
}
public JavaToolTest(){
name = "ffdsafds";
System.out.println(count);
System.out.println(JavaToolTest.name);
}
public JavaToolTest(String name){
System.out.println(name);
}
}

用javap -c JavaToolTest分析得:

D:\f\test\bin\com\base16Class>javap -c JavaToolTest
Compiled from "JavaToolTest.java"
public class com.base16Class.JavaToolTest extends java.lang.Object{
int count;

static int age;

static java.lang.String name;

static {};
Code:
0: bipush 10
2: putstatic #13; //Field age:I
5: return

public com.base16Class.JavaToolTest();
Code:
0: aload_0
1: invokespecial #18; //Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 12
7: putfield #20; //Field count:I
10: aload_0
11: bipush 20
13: putfield #20; //Field count:I
16: ldc #22; //String ffdsafds
18: putstatic #24; //Field name:Ljava/lang/String;
21: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream;
24: aload_0
25: getfield #20; //Field count:I
28: invokevirtual #32; //Method java/io/PrintStream.println:(I)V
31: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream;
34: getstatic #24; //Field name:Ljava/lang/String;
37: invokevirtual #38; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
40: return

public com.base16Class.JavaToolTest(java.lang.String);
Code:
0: aload_0
1: invokespecial #18; //Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 12
7: putfield #20; //Field count:I
10: aload_0
11: bipush 20
13: putfield #20; //Field count:I
16: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream;
19: aload_1
20: invokevirtual #38; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
23: return

public static void main(java.lang.String[]);
Code:
0: new #1; //class com/base16Class/JavaToolTest
3: dup
4: invokespecial #45; //Method "<init>":()V
7: astore_1
8: return

}

不难看出:类变量是自动创建了一个类静态块然后赋值,类变量存在类中,在创建对象之前已经赋完值。然而类中只存在实例变量,并没有为其赋值,实例变量是在构造器中赋值的。
  评论这张
 
阅读(828)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017