2014-10-29 72 views
-1

所以我有两个类,一个叫'行星',另一个叫'太阳'。太阳类是父类,行星类是子类,意味着这个类将继承太阳类的元素。我无法访问和更改我在父类中初始化的变量,我试图在子类中复制+修改。Java中的继承 - 2类

Sun的变量: 大小,颜色

//This is what I've tried: 

public class Planets extends Sun 
{ 
    public Planets (Sun sunClass) 
    { 
     sunClass.size=10; 
     sunClass.colour="BLUE"; 
    } 
} 

//This is what's in Sun class: 
public class Sun 
{ 
    public double size; 
    public String colour; 

    public Sun(double size, String colour) 
    { 
     this.size = size; 
     this.colour = colour; 
    } 
} 

只是假设,但它牵涉到包含更多细节,但不是我有问题的一部分,其他类。

+0

不,有4颗行星金星,火星,汞和地球。他们都有自己的属性(我假设我需要4种方法?但我不知道如何去做)。 – SassyCoder 2014-10-29 00:38:02

+0

如果您在现实世界中无法有意义地说“行星是太阳”,那么您不应该在程序中使用继承。 – dasblinkenlight 2014-10-29 00:38:51

+0

为什么你将'Sun'传递给'Planets'并修改'Sun'的属性? – MadProgrammer 2014-10-29 00:38:55

回答

1

它看起来像你要关于错误地初始化继承成员。在java中,您可以使用超级构造函数调用类父类的构造函数。

新的构造:

public Planets() { 
    super(10, "BLUE"); 
} 

,将调用这些价值观太阳类的构造函数。

或者您可以让地球类的构造函数发送的大小和颜色:

public Planets(double size, String color) { 
    super(size, color); 
} 

希望这有助于!

+0

如果我为4个行星创建4种方法,我可以多次使用“超级”(4次)吗?我感觉它可能会覆盖数据? – SassyCoder 2014-10-29 00:47:20

+0

在此上下文中,'super'调用超类的构造函数,它只能执行一次,它必须是子类构造函数的第一行。如果你创建4个行星,你有4个不同的对象,每个对象都有自己的超类和构造函数,所以你不会覆盖任何东西。同样重要的是要注意,如果你创建4个行星,你不会创建4个子类(除非它们需要不同),你创建了4个子类的_instances_,每个具有不同的属性。 – 2014-10-29 00:52:49

+0

您不需要多次调用超级构造函数。特别是如果你在这里使用第二个例子。当你打电话给你时,你可以得到关于这个星球的任何信息(例如'Planets myNewPlanet = new Planets(15,“GREEN”);'然后一个新的星球将被创造出这些价值。类型的行星而不是硬编码4种不同的行星 – 2014-10-29 01:14:13

0

让我们忘记太阳是恒星而不是行星。这里更重要的错误是继承工作是通过从更一般的类派生更多专门的类来实现的。

所以你会:

public class Planet 
{ 
    int size; 
    String color; 
    public Planet (int size, String color) 
    { 
     this.size=size; this.color=color; 
    } 
} 

然后太阳将是一个专业的情况下,即使它在技术上不是一个星球:

public class Sun extends Planet 
{ 


    public Sun() 
    { 
     super(10, "BLUE"); 
    } 
} 

    public class Mars extends Planet 
    { 


     public Sun() 
     { 
      super(3, "RED"); 
     } 
    } 
+0

我的太阳类已经扩展了另一个类(称为空间点),它具有访问器和增变器以返回行星出现的距离和角度 – SassyCoder 2014-10-29 00:59:09

0

夫妇的事情......第一,似乎还有缺乏对什么是继承的理解。

在你的榜样,PlanetsSun延长,这意味着Planets所有Sun做的属性,加上另外东西,你已经在Planets定义。

如果你试图修改从Planet内这些特性,你可以这样做,直接使用super(或this就此而言,如果财产不被子类覆盖)。

考虑这些类:

public class Sun 
{ 
    public double size; 
    public String colour; 

    public Sun() {} 

    public Sun(double size, String colour) 
    { 
     this.size = size; 
     this.colour = colour; 
    } 
} 

public class Planets extends Sun 
{ 
    public Planets() { 
     super(10.0, "Yellow"); 
    } 
    public Planets (double size, String colour) 
    { 
     super(size, colour); 
    } 

    public void setSize(double size) { 
     super.size = size; 
    } 
} 

注意使用super指示使用超类的构造函数。在PlanetssetSize()方法允许你从子类(尽管在实践中,你可能不希望使用此层次)

的第二个问题是,你继承的使用不中设置超属性的大小似乎很合乎逻辑。不考虑是否使用继承(is-a)或组合(has-a),如果继承,通过问自己以下问题将使得使用哪个层次结构变得更容易:我的超类的所有子类都是超类吗?

+0

我想我误解了。你想改变太阳的任何属性,我只是想在太阳类中使用这些变量来为行星创造新的属性值。 – SassyCoder 2014-10-29 01:01:55

+0

那么,继承性的本质,你已经得到了这个免费...任何东西'Sun'对象自动传递给一个子类对象。 – 2014-10-29 01:21:45

0

正如我们所知,子类是从超类继承的类的名称,在这种情况下,该类是Sun。但要注意的一个事实是,超类可以拥有任意数量的子类,但没有限制,但子类只能从一个超类扩展。

只是一个说明。