Java 继承和私有实例变量

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

我很难弄清楚如何访问超类的私有实例变量。 我正在Dog类中编写一个equals方法,比较名称和品种是否相同,但名称是Pet(Dog继承)中的一个私有实例变量

这是我的密码:

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
of
Dog
类根本不被使用吗?如果没有,则从代码中可以明显看出。//Dog.equals(String)中还有另一个问题//OP的q中哪里有这样的方法?还有什么会导致他的问题中出现stackoverflow?我很难弄清楚为什么q.equals(p)会抛出一个异常,因为我只是在Pet中调用equals方法?@StephenC是的,我已经尝试了你所说的,它是有效的,但我只是想弄清楚为什么它有效,为什么我的方法会抛出一个异常。