Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java持有对象,对象为';s超级级';s型_Java_Inheritance - Fatal编程技术网

Java持有对象,对象为';s超级级';s型

Java持有对象,对象为';s超级级';s型,java,inheritance,Java,Inheritance,我有两个班,动物和狗。正如你们所能理解的,狗是从动物延伸而来的。我可以毫无问题地编写这些类,但我注意到我可以创建一个新的dog对象,如下所示: Dog firstDog = new Dog("rocky"); 没关系,但当我尝试创建新实例时,如下所示: Animal secondDog = new Dog("alex"); 没有任何错误,但我无法访问我在Dog类中编写的任何字段或方法,即使它们是公共的。因此,如果我想在一个变量中保存一个对象,该变量的类型与其超类的类型相同,我可以访问仅实现该

我有两个班,动物和狗。正如你们所能理解的,狗是从动物延伸而来的。我可以毫无问题地编写这些类,但我注意到我可以创建一个新的dog对象,如下所示:

Dog firstDog = new Dog("rocky");
没关系,但当我尝试创建新实例时,如下所示:

Animal secondDog = new Dog("alex");
没有任何错误,但我无法访问我在Dog类中编写的任何字段或方法,即使它们是公共的。因此,如果我想在一个变量中保存一个对象,该变量的类型与其超类的类型相同,我可以访问仅实现该超类的字段和方法(例如名称、颜色、setColor()和toString()并且没有任何方法可以访问在子类中实现的字段和方法。当我试图调用secondDog的toString()函数时,它调用了我在Dog类中编写的方法,我知道我在Dog类中重写了这个函数,但我无法访问我在Dog类中实现的其他方法。java如何处理这些问题

动物类别:

public class Animal {
    private String name;
    private String color;

    public Animal(String name){
        this.name=name;
    }

    public void setColor(String color){
        this.color=color;
    }

    public String toString(){
        return"Hi, my name is " + this.name + ". I'm " + this.color;
    }
}
狗类:

public class Dog extends Animal {
    private int age;
    public Dog(String name){
        super(name);
        setColor("gray");
        this.age = 7;
    }
    public String speakDog(){
        return"wof!";
    }
    public String toString(){
        return super.toString() + " and I " + speakDog();
    }
}
当你写这篇文章时:

Animal secondDog = new Dog("alex");
你在告诉Java
secondDog
是一种
Animal
,就是这样。允许您将
Dog
分配到和
Animal
引用中的原因是
Dog
Animal
的子类,因此它是允许的

但是,
secondDog
明确表示为动物,只能从
Animal
类访问属性和行为

要访问
狗的属性和行为
,您需要强制转换它:

((Dog)secondDog).speakDog();
将它投射到
就像告诉Java:“嘿,相信我,这个对象是一只狗”

现在只需要更加具体,你就可以访问狗的属性。(如果不是,它仍被视为动物(更高级))

但是,如果您将其强制转换为一个不是
Animal
子类的类,您将得到一个
ClassCastException


实质上,

  • 如果
    secondDog
    保持为
    Animal
    (未被强制转换为
    Dog
    ),则它只能从
    Animal
    访问所有非私有字段和方法

  • 如果
    secondDog
    被铸造为
    Dog
    ,它可以访问
    动物的所有继承字段和方法,以及
    狗的所有非私有字段和方法


    • 投射动物对象以显示它是狗

      Dog secondDog = (Dog) new Animal("alex);
      
      看看这个:

      Animal a = new Dog();
      Dog d = (Dog) a; // no problem, the type animal can be casted to a dog, because its a dog
      Cat c = (Dog) a; // raises class cast exception, you cant cast a dog to a cat
      

      仅当它是子类时才强制转换。

      否,无法通过动物类访问狗的属性。考虑基本对象“对象”,其中许多子类流。 可以说JFrame=newjframe(“”); 或 对象objFrame=新JFrame(“”); 框架将允许您访问JFrame的所有属性 objFrame。???将仅允许您访问对象的属性


      我不知道为什么第二只狗应该被创造成动物而不是狗:)

      可能的复制品;恕我直言;这完全是胡说八道。关键是告诉java编译器secondDog的类型是Animal。动物就是动物;而不是狗。附加的强制转换不会改变任何东西(在此上下文中)。当然,当你知道你的动物是狗时,你可以把它扔给狗;使用狗的方法。但这不是你的代码所做的。是的,我理解。当我没有对狗施法时,我只能访问所有来自动物的非私有字段和方法。但是,如果我在Dog类中重写其中一个方法,我会在主函数中正确地得到被重写的方法?@azuosxela你是对的,如果该方法被重写,你将在子类中调用被重写的方法。例如,如果您执行System.out.println(secondDog);(即使不强制转换),它也会从
      Dog
      类调用
      toString()