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;
}
}
如您所见,如果这种情况一直持续下去,换句话说,如果我的继承行很长,我是否真的需要一遍又一遍地列出每个变量?我只是觉得有一种更有效的方法可以做到这一点。
答案 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
变量,以便该类及其子类可以访问它。
在受保护的父类中,不仅可以定义变量,而且可以定义通用方法并实现这些方法。
答案 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); }
}