构造函数混淆Java

时间:2015-04-03 09:24:46

标签: java constructor

嗨,这可能看起来像一个非常愚蠢的问题,但我最近进入了java并且正在自学有关构造函数。

public class creatures {
    private static String name;
    private static int age;
    private static String type;

    public creatures( String name, int age, String type) {
        this.name = name;
        this.age = age;
        this.type = type;
        System.out.println("The creature's name is " + name + " \nThe creatures age is"  + age + " \nThe creatures type is " + type);
    } 

    public  static void main(String [] args) {
        creatures newcreature = new creatures("Zack", 100, "alien");
        creatures newcreature1 = new creatures("Jonny", 500, "vampire");
        creatures newcreature2 = new creatures("Dick", 4, "witch");
        System.out.println(newcreature.name);
    }
}

所以在我的main方法的system.out.println中,在打印构造函数之后,我想打印名称" Zack"通过引用我的newcreature构造函数的名称,但它只打印名称" Dick"从我做的最后一个构造函数。如何区分同一类中的这些构造函数?再次抱歉,如果这是一个愚蠢的问题。

4 个答案:

答案 0 :(得分:2)

问题在于变量的static关键字。

阅读本文:enter link description here

静态变量只会获取一次内存,如果任何对象改变了静态变量的值,它将保留其值。

答案 1 :(得分:0)

因为你的名字字段是静态的,所以它共享一个公共内存。所以如果你尝试通过用不同的对象重新引用它来访问它,它将给出相同的输出。

由于您上次使用new creatures("Dick", 4, "witch");更改了值Dick,因此将更改为该值。

所以删除static关键字以获得所需的o / p

public class creatures {
    private String name;
    private int age;
    private String type;

    public creatures( String name, int age, String type) {
        this.name = name;
        this.age = age;
        this.type = type;
        System.out.println("The creature's name is " + name + " \nThe creatures age is"  + age + " \nThe creatures type is " + type);
    } 

    public  static void main(String [] args) {
        creatures newcreature = new creatures("Zack", 100, "alien");
        creatures newcreature1 = new creatures("Jonny", 500, "vampire");
        creatures newcreature2 = new creatures("Dick", 4, "witch");
        System.out.println(newcreature.name);
    }
}

输出

Zack

答案 2 :(得分:0)

类的所有数据成员都是静态的,这就是每个实例共享同一成员的原因。当你创建新的生物实例时,构造函数只是用新值覆盖旧值。

在您的代码中:

private static String name; 
private static int age;
private static String type;

在生物,creature1,creature2之间共享。

删除静态关键字。

public class creatures {
 private String name;
 private int age;
 private String type;

 public creatures(String name, int age, String type) {
    this.name = name;
    this.age = age;
    this.type = type;
    System.out.println("The creature's name is " + name
            + " \nThe creatures age is" + age + " \nThe creatures type is "
            + type);
 }

 public static void main(String[] args) {
    creatures newcreature = new creatures("Zack", 100, "alien");
    creatures newcreature1 = new creatures("Jonny", 500, "vampire");
    creatures newcreature2 = new creatures("Dick", 4, "witch");
    System.out.println(newcreature.name);
 }

}

答案 3 :(得分:0)

您的字段nameagetype是静态的。这意味着它们由您的所有生物共享。所以你不能说"这个生物的名字是......",因为一个生物在你的代码中没有名字。在编写时,你只能说"生物类有这个名字......",在Java中写的是creatures.name=...

因此,您需要从字段中删除static修饰符。