我是初学者。我有一个关于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,那是什么意思? 非常感谢
答案 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>
让我们使用Father
和Father
代替Son
和Animal
:
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
的类型吗?否
例如:
Father
是Car
Vehicule
是Smartphone
答案 3 :(得分:0)
父亲的引用始终可以引用Son实例,因为Son是父亲。使超类型引用子类型实例成为可能的原因是,保证了该子类型能够执行超类型可以做的所有事情。无论Son实例是重写父亲的继承方法还是直接继承它们,任何具有父亲引用Son实例的人都可以自由调用所有可访问的父亲方法。因此,必须使用一种重载方法来实现超类的契约。