Java 继承和私有实例变量
我很难弄清楚如何访问超类的私有实例变量。 我正在Dog类中编写一个equals方法,比较名称和品种是否相同,但名称是Pet(Dog继承)中的一个私有实例变量 这是我的密码:Java 继承和私有实例变量,java,inheritance,equals,private,Java,Inheritance,Equals,Private,我很难弄清楚如何访问超类的私有实例变量。 我正在Dog类中编写一个equals方法,比较名称和品种是否相同,但名称是Pet(Dog继承)中的一个私有实例变量 这是我的密码: public class Pet { private String name; public Pet(){ name = ""; } public Pet(String name){ this.name = name; } public b
public class Pet {
private String name;
public Pet(){
name = "";
}
public Pet(String name){
this.name = name;
}
public boolean equals(Pet other){
return this.name.equals(other.name);
}
}
还有我的狗课:
public class Dog extends Pet {
private String breed;
public Dog(String name, String breed) {
super(name);
this.breed = breed;
}
public Dog(){
breed = "";
}
@Override
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(obj.getClass() != this.getClass()){
return false;
}else{
Pet p = (Pet)obj;
Pet q = (Pet)this;
Dog temp = (Dog)obj;
boolean name = q.equals(p);
boolean bred = breed.equals(temp.breed);
return name && bred;
}
}
}
在我的主课上:
Dog d1 = new Dog("Harry", "Puggle");
Dog d2 = new Dog("Harry", "Pug");
System.out.println(d1.equals(d2));
出于某种原因,它一直使用我的宠物类的equal方法
谢谢@Pshemo已经确定了您问题的直接原因。您的
Pet.equals(对象)
不会覆盖`Dog.equals(字符串)
,因为签名不匹配。并且您的d1.equals(d2)
调用绑定到最匹配的方法签名,该方法签名具有Pet
形式参数,而不是对象
形式参数
但是,一旦您纠正了这个问题,Dog.equals(String)
方法中还有另一个问题:
Pet p = (Pet)obj;
Pet q = (Pet)this;
boolean name = q.equals(p);
当您修复Pet.equals的签名时,将导致对Dog.equals的递归调用。。。和一个堆栈溢出错误。(Dog.equals将调用Dog.equals,它将调用Dog.equals,它…)。基本上,q.equals
与当前正在执行的方法相同。类型转换没有任何作用
将其更改为:
Pet p = (Pet)obj;
boolean name = super.equals(p);
以这种方式使用的super
关键字调用equals
方法的重写版本
我很难弄清楚如何访问超类的私有实例变量
这与导致问题的原因不同。但答案是,如果希望子类方法能够访问父类中的private
变量,则需要向父类添加getter和/或setter方法,或者将变量的访问权限更改为(通常)protected
如果你仔细观察,你的狗类有两个相等的方法:
equals(宠物其他)
formsuper类
等于(对象对象对象)
来自Dog类李>
因为您使用的是d1.equals(d2)
其中d1和d2是Dog
实例,所以Java将使用超类中的equals(Pet other)
方法,在超类中您只检查name
equality 你的意思是说,equals
的ofDog
类根本不被使用吗?如果没有,则从代码中可以明显看出。//Dog.equals(String)中还有另一个问题//OP的q中哪里有这样的方法?还有什么会导致他的问题中出现stackoverflow?我很难弄清楚为什么q.equals(p)会抛出一个异常,因为我只是在Pet中调用equals方法?@StephenC是的,我已经尝试了你所说的,它是有效的,但我只是想弄清楚为什么它有效,为什么我的方法会抛出一个异常。