git checkout bad-build
git checkout -b bad-build-copy
git push origin bad-build-copy
我是java的初学者,我无法理解这一行 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 {
}
是什么意思。为什么A不能访问自己的方法。请详细说明A类是否实例化,以及为什么其方法无法访问。
答案 0 :(得分:1)
以下陈述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!