【问题标题】:Can't access private String in Parent class for Java无法访问 Java 父类中的私有字符串
【发布时间】:2018-08-02 17:01:06
【问题描述】:

当我运行我的程序时,我得到了这个:

错误:名称在 Animal 中具有私有访问权限

以下是我的课程:

动物类

public class Animal 
{
    private String name; 

    public Animal(String name)
    {
         this.name = name ;
         System.out.println("The Animal " + name + " has been created.") ;

    }
    public String getAnimalName()
    {
        return name ;
    }
    public String setAnimalName(String newName)
    {
        return name = newName ;
    }
    public void sleep()
    {
        System.out.println("The Animal" + name + " is asleep.");
    }
    public void noise()
    {
        System.out.println("The Animal " + name + " is making a noise.");
    }

    public String toString()
    {
        return "The Animal " + name ;
    }
    public boolean equals(Animal otherAnimal)
    {
        return (name.equals(otherAnimal.name)) ;
    }


}

鸟类

public class Bird extends Animal
{
    public Bird (String name)
    {
        super(name);
        System.out.println("A Bird " + name + " has been created.");

    }
    public void makesNoise() 
    {
        System.out.println("The Bird " + name + " is chirping.");
    }
    public String toString() 
    {
        System.out.println("The Bird " + name);
    }
    public boolean equals(Bird otherBird)
    {
        return (name.equals(otherBird.name));
    }

}

狗类

public class Dog extends Animal
{
    private String breed ;

    public Dog (String name, String breed)
    {
        super(name);
        this.breed = breed ;
        System.out.println("A Dog " + name + "of breed " + breed 
                           + " has been created.") ;
    }
    public String getDogBreed()
    {
        return breed ;
    }
    public String setDogBreed(String newBreed)
    {
        return breed = newBreed ;
    }   
    public void makeNoise() 
    {
        System.out.println("The  " + name + " is barking.");
    }
    public String toString() 
    {
        System.out.println("The Dog " + name + " of breed " + breed);
    }
    public boolean equals(Dog otherDog)
    {
        return (name.equals(otherDog.name) &&
                breed.equals(otherDog.breed));
    }

}

主类

public class AnimalMain 
{
    public static void main(String[] args) 
    {

    Animal animal = new Animal("Oscar");
    Bird bird = new Bird("Tweety");
    Dog dog = new Dog("Inka", "Mutt");

    animal.toString();
    bird.toString();
    dog.toString();

    }

}

第一个类可以编译,但其他三个没有,因为它无法从父类访问私有 String。现在我知道这是会发生的,但是有没有办法让它在父类有一个名为 name 的私有 String 并且只有一个构造函数的情况下工作?

【问题讨论】:

  • 使用吸气剂!
  • 你觉得为什么叫private
  • 子类继承其父类的私有成员 - docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
  • 也许您应该回答这个问题 - 为什么您想要访问该字段而不是使用现有的 getter 方法?
  • 这就是我遇到的问题,我在哪里实现 getter?

标签: java inheritance private


【解决方案1】:

可以通过在 Animal 类(父类)中添加公共 getter 来修复

public String getName() {
   return name;
}

【讨论】:

  • 但是如何在子类中访问它?
  • 使用 extend 关键字,公共类 ChildClass extends Animal。它将继承其父级的所有公共/默认字段和方法。
  • 或者你可以只使用已经定义好的getter(getAnimalName()返回name)。
【解决方案2】:

基类 Animal 有一个用于私有变量“name”的 getter。在扩展 Animal 类的子类中使用该函数 getAnimalName() 来获取名称。像这样:

public class Animal 
{
    private String name; 

    public Animal(String name)
    {
        this.name = name ;
        System.out.println("The Animal " + name + " has been created.") ;
    }

    ...

    public String getAnimalName()
    {
        return name ;
    }
}


public class Bird extends Animal
{
    public Bird (String name)
    {
        super(name);
        System.out.println("A Bird " + name + " has been created.");

    }

    ...

    public String toString() 
    {
        System.out.println("The Bird " + getAnimalName());
    }

}

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2014-04-29
    • 2018-10-28
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多