abstract class A {
abstract void al();
void a2() {
}
}
class B extends A {
void al() {
}
void a2() {
}
}
class C extends B {
void c1() { }
}
/////////////
A x = new B(); C y = new C(); A z = new C();
////下面哪四个调用是正确的,能给我讲讲为什么,我被Java的多态搞混了。
x.a2();
z.a2();
z.c1();
z.a1();
y.c1();
x.a1();
谢谢~!
z.a2();
y.c1();
以小弟来看只有3个正确
A x = new B(); C y = new C(); A z = new C();
X Y Z 这3个实例分别是把自己实例化成 两个父对象 所以 只能调用 A对象 和C父对象的方法其他的都是错误的!
都是默认访问权限,只有在同一个包中,下面才会全部成立。
x.a2();
z.a2();
z.c1();
z.a1();
y.c1();
x.a1();
LZ把这四个的区别弄懂,问题自然就没了。这题目应该有一个前提,不在同一包中。
x.a1(); // B类的a1()
x.a2(); // B类的a2()
y.c1(); // C类的c1()
z.c1(); // C类的c1()
这四个成立,因不在同一个包中,父类中的方法无法访问。只能访问本类中的方法。
按您的意思就是x.a2();
z.a2(); z.a1();x.a1()这几个正确了。
z.a2();
y.c1();这3个正确
补充一点,就是静态类中的静态方法是给子类实现的,而不是给自己的引用来调用的
所以x.a1();和z.a1();是错误的
private 动物 未知动物;
public static void main(String args[]) {
new TestPolyMorphic().test();
}
public void test() {
未知动物 = new 动物();
未知动物.吃什么();
未知动物 = new 小牛();
未知动物.吃();
未知动物.跑();
未知动物.吃什么();
未知动物 = new 小兔();
未知动物.吃();
未知动物.跑();
未知动物.吃什么();
}
}class 动物 {
void 跑() {
System.out.println("正在跑");
}
void 吃() {
System.out.println("正在吃");
}
void 吃什么() {
System.out.println("不知道");
}
}class 小牛 extends 动物 {
void 吃什么() {
System.out.println("吃草");
}
}class 小兔 extends 动物 {
void 吃什么() {
System.out.println("吃白菜");
}
}也许你会想为什么要这么写.. 如果不这么写我们自己要写跑和吃的方法..自己想想吧. 这只是简单的例子. 复杂的工程中很有用..
public class TestPolymorphism { abstract class A {
abstract void al();
void a2() {
System.out.println("A.a2()");
}
}
class B extends A {
void al() {
System.out.println("B.a1()");
}
void a2() {
System.out.println("B.a2()");
}
}
class C extends B {
void c1() {
System.out.println("C.c1()");
}
} public static void main(String[] args) {
TestPolymorphism tp = new TestPolymorphism();
A x = tp.new B();
C y =tp.new C();
A z = tp.new C();
x.a2();
x.al();
z.a2();
// z.c1(); 不能编译
z.al();
y.c1();
}
}
运行结果:
B.a2()
B.a1()
B.a2()
B.a1()
C.c1()
上面的l其实是L不是1
拷过来的代码编译3个出错
自己写就错1个
x.a2();
z.a2();
z.a1();
y.c1();
x.a1();错误的
z.c1();你在eclipse里面把这些类敲一遍,如果有编译错误就说明有错误,然后自己想想为什么有错误。A x = new B();
说明x是一个A对象,那么能访问的就是A的方法了。
多态是指它的方法可以由多个子类去不同的实现,
A的子类有多少,那什么它的抽象方法就被多个子类不同的实现,
你声明的时候就可以指定一个具体的子类,外界只能看到A。
x.a2();
z.a2();
z.a1();
y.c1();
x.a1();
如果A是B的父类那么:
A a = new B();
说明x是一个A对象,那么能访问的就是A的方法了。
这种实例化方式叫做遮蔽,父类A将子类B的方法遮蔽了
所以获得的实例化的引用只能访问父类A的方法
z.a1();你给成al();