这是制作继承对象的唯一方法吗?

时间:2018-11-23 08:05:31

标签: java inheritance this parent super

public class Animal
{
    public String name;
    public boolean legs;
    public boolean eyes;

    public Animal(String name, boolean legs, boolean eyes)
    {
        this.name = name;
        this.legs = legs;
        this.eyes = eyes;
    }
}

public class Dog extends Animal
{
    String name;
    boolean legs;
    boolean eyes;
    public boolean vacinated;
    public boolean rabid;
    public Dog(boolean vacinated, boolean rabid, String name, boolean legs, boolean eyes)
    {
        super(name, legs, eyes);
        this.vacinated = vacinated;
        this.rabid = rabid;
    }
}

public class Bulldog extends Dog
{
    String name;
    boolean legs;
    boolean eyes;
    public boolean vacinated;
    public boolean rabid;
    public String breedtype;

    public Bulldog(String breedtype, String name, boolean legs, boolean eyes, boolean vacinated, boolean rabid)
    {
        super(vacinated, rabid, name, legs, eyes);
        this.breedtype = breedtype;
    }
}

如您所见,如果这种情况一直持续下去,换句话说,如果我的继承行很长,我是否真的需要一遍又一遍地列出每个变量?我只是觉得有一种更有效的方法可以做到这一点。

3 个答案:

答案 0 :(得分:0)

您的课程违反了OOP。您应该定义可由protected继承给子类的通用属性。这意味着子类可以访问那些

第二,公共属性应在父类中定义,而不必在子类中重新创建。

P / S:由BlackFlash注释更新。我将对此类常见属性使用private修饰符。在此问题的范围内,子类不需要访问父级的属性。

您的班级应作如下更改:

public class Animal
{
  private String name;
  private boolean legs;
  private boolean eyes;

  public Animal(String name, boolean legs, boolean eyes)
  {
    this.name = name;
    this.legs = legs;
    this.eyes = eyes;
 }
}

public class Dog extends Animal
{
   private boolean vacinated;
   private boolean rabid;
   private Dog(boolean vacinated, boolean rabid, String name, boolean legs, boolean eyes)
    {
      super(name, legs, eyes);
      this.vacinated = vacinated;
      this.rabid = rabid;
  }
}

public class Bulldog extends Dog
{
   private String breedtype;
   public Bulldog(String breedtype, String name, boolean legs, boolean eyes, boolean vacinated, boolean rabid)
   {
    super(vacinated, rabid, name, legs, eyes);
    this.breedtype = breedtype;
  }
}

答案 1 :(得分:0)

这违反了整个OOP概念。您可以在父类中将公用变量作为protected变量,以便该类及其子类可以访问它。

在受保护的父类中,不仅可以定义变量,而且可以定义通用方法并实现这些方法。

Read more here

答案 2 :(得分:0)

这是您所做的问题之一的简单示例:

class A {
  String a;

  A(String a) { this.a = a; }
}

class B extends A {
  String a;

  A(String a) { super(a); }
}

此代码可能会提供您不期望的结果:

B b = new B("hello");
System.out.println(b.a);  // null

这可能会让您感到惊讶,因为您似乎通过a调用在A的构造函数中初始化了super(a)

但是更令人惊讶的是,如果将其强制转换为A,它不会打印null

System.out.println(((A) b).a);  // hello

看起来很奇怪:当您将其视为其他类型时,它会打印出不同的内容。

这里的问题是Java中的字段不是多态的:a中的B 隐藏 a中的A。这两个字段都在那里,但是当您在类型a的变量上引用B时,您得到的字段与在类型{{1}的变量中引用a时的字段不同}。

要使此功能“更容易混淆”,请不要在A中重复声明a

B

现在:

class A {
  String a;

  A(String a) { this.a = a; }
}

class B extends A {
  A(String a) { super(a); }
}