这个问题在这里已有答案:
class A extends B
{
public static void main(String[] args)
{
B obj = new A();
obj.speak(); //error :the method speak() undefined for type B
}
public void speak()
{
System.out.println("in speak");
}
}
class B {
}
我是java的初学者,我无法理解这行B obj = new A();
是什么意思。为什么A不能访问自己的方法。请详细说明A类是否实例化,以及为什么其方法无法访问。
以下陈述B obj = new A();
意味着两件事。
obj
被宣布为B
类型的对象。obj
由A
定义。换句话说,您可以像使用任何其他obj
对象一样使用B
。通过将其类型声明为B
,您可以限制编译器仅使用该透视图(以及B
的超类)。
那么使用obj
定义A
意味着什么呢?
使用A
的构造函数构建obj
将导致构造每个超类A
(从第一个父节点开始),并且每次定义方法时它们都会覆盖由超类定义的那些。
成员变量/静态字段只会影响超类的那些,这意味着通过切换透视图可以访问不同的字段。但是,必须记住,方法将始终是由定义它们的最后一个子类定义的方法。
代码示例
public class Example
{
public static void main(String[] args)
{
Animal animal = new Animal();
System.out.println(animal.name);
animal.makeSound();
Animal doggy = new Dog();
System.out.println(doggy.name);
doggy.makeSound();
}
}
public class Animal {
public String name;
public Animal() {
name = "NameLess";
}
public void makeSound() {
System.out.println("What am I?");
}
}
public class Dog extends Animal {
public Dog() {
name = "Goofy";
}
public void makeSound() {
System.out.println("woof woof!");
}
}
此示例的输出将是:
NameLess
What am I?
Goofy
woof woof!