在Java中声明一个类

时间:2019-02-08 15:03:20

标签: java oop

我是初学者。我有一个关于Java中的类的问题。所以 我有两个班级父亲和一个班级儿子扩展了班级父亲

class Father
{
   Father(){};
   public void SayHi()
   {
       System.out.println("Hello world");
   }
}
class Son extends Father
{
   Son(){}
   public void SayHiToo()
   {
       System.out.println("Hello world, too!");
   }

}
class DO
{
    public static void  main(String[] args)
    {
          Father c1 = new Father();     //(1)
          Son c2 = new Son();           //(2)
          Father c3 = new Son();        //(3)
    }
}

我的问题是关于:我知道(1),(2)意味着c1只能在父类中使用函数,而c2可以在父子类中使用函数 但是,如果我这样声明c3,那是什么意思? 非常感谢

4 个答案:

答案 0 :(得分:3)

如果给班级取更好的名字,这将变得更加清楚。

要记住的重要一件事是:继承意味着专业化:子类是其超类的一种特殊类型。

现在您明白了ID Item Value 1 q7109 2 1 q7110 4 1 q7111 1 1 q7120 4 class Father的确是错误的原因:class Son extends Father 不是Son的(一种特殊类型)。 / p>

让我们使用FatherFather代替SonAnimal

Cat

现在更容易理解这些含义:

class Animal {
    public void makeSound() {
        System.out.println("Beep!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miaow!");
    }
}

Animal c1 = new Animal(); // 1 Cat c2 = new Cat(); // 2 Animal c3 = new Cat(); // 3 Cat c4 = new Animal(); // 4 WRONG! Cat,因此在(3)中允许将Animal对象分配给类型为{{1}的变量}-保证Cat具有Animal上可用的所有方法。因此,Cat所引用的对象中存在可以调用Animal的任何方法。

另一种方法是不允许将c3分配给类型({4)中的c3类型的变量,因为类Animal可能具有其他方法,调用Cat对象。如果允许(4),则可以尝试调用那些方法,这应该是不可能的。

答案 1 :(得分:2)

这就像在树立一个将扮演父亲的儿子一样!

我建议您阅读有关Java多态性的文章。

答案 2 :(得分:0)

对于require('dotenv').config(); const fetch = require('fetch-everywhere'); const base64 = require('base-64'); process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; const user = "Enter Username Here"; const pass = "Enter Password Here"; const headers = new Headers({ "Authorization": `Basic ${base64.encode(`${user}:${pass}`)}` }); fetch('Link', { method: 'GET', headers: headers, }) .then(function(response) { return response; }) .then(function(myJson) { console.log(JSON.stringify(myJson)); }).catch(error => {throw error}); Father c3 = new Son();只能使用c3的方法,但是由于它是Father,因此可以将其转换为Son也使用Son方法

Son's

但是请注意您的模型:Father c3 = new Son(); c3.SayHi(); Son sc3 = (Son) c3; sc3.SayHiToo(); Son的类型吗?否

例如:

  • FatherCar
  • VehiculeSmartphone

答案 3 :(得分:0)

父亲的引用始终可以引用Son实例,因为Son是父亲。使超类型引用子类型实例成为可能的原因是,保证了该子类型能够执行超类型可以做的所有事情。无论Son实例是重写父亲的继承方法还是直接继承它们,任何具有父亲引用Son实例的人都可以自由调用所有可访问的父亲方法。因此,必须使用一种重载方法来实现超类的契约。